일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- qiskit #
- qiskit #qiskitHackerthon
- ibm #qiskit #quantum # quantumcomputer #quantumcomputing #quantummachine #quantumengineering #quantumbit #qbit
- qiskit #QuantumComputer #QuantumMachine #양자컴퓨터 #양자 #키스킷
- Today
- Total
인일의 공부 블로그
텍스트 데이터 다루기 본문
포스팅 개요
아이펠 9기 Deep Dive 학습을 진행중입니다. NLP 코스로 학습 중 기록을 각색하여 블로그에 포스팅합니다.
목차
1. 1번
2. 2번
3. 3번
4. 4번
5. 5번
🎈 1. 전처리
- 자연어의 이상적인 데이터의 형태는 표준 어휘로 구성된 말
- 하지만, 예외적으로 변형 (표준 어휘가 아닌 형태)된 경우가 더 많음
e.g.) 불완전한 문장, 문장 길이가 너무 길거나 짧음, 채팅 데이터 에서 문장 시간 간격이 긺, 욕설 오타 등이 포함
⇒ 아직은 이러한 어휘를 고려하여 학습을 진행해야 함
(* 자연어 처리의 이상치는 아주 큰 규모의 학습을 진행하여 이러한 이상치들을 제외 할 수 있도록 학습시키는 것)
> 노이즈 유형별 처리
1. 문장 부호
- 컴퓨터는 명시해주지 않으면 (띄어쓰기로 구분하지 않으면) 알파벳에 ,가 포함된다고 생각
- 가령 "Hello,"를 하나의 말뭉치로 생각함
- 따라서 문장부호 양쪽에 공백을 추가해주어야 함
def pad_punctuation(sentence, punc):
for p in punc:
sentence = sentence.replace(p, " " + p + " ")
return sentence
sentence = "Hello, I'm INIL."
print(pad_punctuation(sentence, [".", "?", "!", ",", "'"]))
Hello , I ' m INIL .
2. 대소문자
- 컴퓨터의 경우 Hello와 hello를 다른 단어로 인식함 (아스키 코드 값이 다르기 때문이라 예상)
- 모든 단어를 소문자로 바꾸는 과정이 필요함
sentence = "I study at Aiffel School"
print(sentence.lower())
i study at aiffel school
3. 특수문자
- 특수문자가 중간에 있으면 단어를 두개이상이라 예측 할 수 있음 ⇒ 제거
- 're' 패키지는 정규표현식 사용을 도움
import re
sentence = "Hip-hop is good music."
sentence = re.sub("([^a-zA-Z.,?!])", " ", sentence)
print(sentence)
Hip hop is good music.
🎈 2. 분산 표현
단어의 희소 표현과 분산 표현
분산 표현(Distributed representation)
- 고정된 크기의 벡터로 표현
- 단어를 여러 차원의 값으로 나타냄
- 단어 간의 거리를 측정하여 의미 관련성을 파악 할 수 있음
희소 표현(Sparse representation)
- 고정되지 않은 벡터로 표현
- 이진화( e.g. one hot vector encoding), 빈도수(e.g. DTM) 등의 방식으로 표현
- 단어의 존재 유뮤만 나타냄
- 단어 간의 거리 측정이 어려움 (공통된 특성이 없다면 cos 유사도가 무조건 0이라 뜸)
🎈 토큰화 : 공백 vs 형태소
공백 기반 토큰화
형태소 기반 토큰화
사전에 없는 단어의 문제
- 공백 기반, 형태소 기반 둘 다 의미를 가지는 단위로 토큰 생성
- 데이터에 포함되는 모든 단어 처리 불가 (자주 등장한 상위 N개만 사용)
- 자주 등장하지 않으면 <unk>같은 특수 토큰으로 치환함
- OOV(Out-Of-Vocabulary)문제가 발생
⇒ 이를 Wordpiece Model로 해결
🎈 토큰화 : BPE, WPM, soynlp
1. Byte Pair Encoding(BPE)
- 가장 많이 등장하는 바이트 쌍(Byte Pair)을 새로운 단어로 치환하여 압축
- 접두어, 접미어 의미 캐치 가능
aaabdaaabac # "aa"을 Z로 압축. 가장 많이 등장함
→
ZabdZabac # "aa" 2개가 치환되어 4바이트 -> 2바이트 압축
Z=aa # "ab"를 Y로 압축
→
ZYdZYac # "ab" 2개가 치환되어 4바이트 -> 2바이트 압축
Z=aa # 치환된 바이트에 대해서도 압축
Y=ab # "ZY"를 "X"로 치환
→
XdXac
Z=aa
Y=ab
X=ZY # 압축 완료
+) 더 알아보기 https://arxiv.org/pdf/1508.07909
- 단어 개수 x Enbedding 차원 수의 Weight 생성
- 단어 개수가 줄어 메모리 절약
2. Wordpiece Model(WPM)
- BPE를 변형한 알고리즘으로, 두가지 차별성이 잇음
1. 공백 복원을 위해 단어의 시작 부분에 언더바(_)를 추가
2. 빈도수 기반이 아닌 가능도(Likelihood)를 증가시켜 문자 쌍을 합침
e.g. "i am a boy and you are a girl" 이라는 문장에 대해
- BPE : [i, am, a, b, o, y, a, n, d, you, are, a, gir, l]
- WPM : [_i, _am, _a, _b, o, y, _a, n, d, _you, _are, _a, _gir, l]
WPM이 공백의 의미를 '_'로 담고 있어서 직관적 이해 가능
3. soynlp
- 한국어 토크나이저로 단어추출, 품사 판별, 전처리 기능도 제공
- 학습데이터를 이용하지 않으면서 데이터에 존재하는 단어를 찾거나, 문장을 단어 나열로 분해, 혹은 품사 판별을 할수 있는 비지도 학습 접근법을 사용
- 통계 기반 토크나이저로 분류
🎈 토큰 의미 부여
Word2Vec
- 단어를 벡터로 만든다 ⇒ 동시에 등장하는 단어 끼리는 연관성이 있다
https://luvquantum91.tistory.com/entry/Word2Vec
Word2Vec
포스팅 개요https://wikidocs.net/22660 Word2Vec의 학습 방법에는 CBOW와 Skip-Gram 두가지가 있음. 목차1. 1번2. 2번3. 3번 🎈 1. 희소 표현- 원 핫 벡터 인코딩을 표현- 단어의 인덱스 값만 1으로 하고 나
luvquantum91.tistory.com
위 블로그에 공부하며 내용을 정리했다.
- Word2Vec의 '자주 등장하지 않는 단어는 최악의 경우 단 한번의 연산만을 거쳐 랜덤하게 초기화된 값과 크게 다르지 않은 상태로 알고리즘을 종료한다' 는 문제를 해결하기 위헤 BPE와 비슷한 아이디어 적용
- 따라서 새로 등장한 어휘에 대해 임베딩을 어떻게 구상할지에 대해 다룸
- 어휘를 구성하는 무든 n-gram 벡터의 평균 벡터를 어휘 임베딩으로 봄
e.g. 'where' 이라는 어휘에 대해서 5개의 n-gram으로 쪼갬
<wh, whe, her, ere, re>
- 어휘의 시작과 끝을 뜻하는 기호 <, >을 표현
- 5개의 trigram에 대한 임베딩 벡터의 평균 벡터로 계산
ELMo - the 1st Contextualized Word Embedding
간단 후기
'AI ML DL > NLP' 카테고리의 다른 글
NLP 흐름 정리 (3) | 2024.10.28 |
---|---|
데이터 조작 방법 (0) | 2024.10.24 |
Searching Algorithm (1) | 2024.10.24 |