인일의 공부 블로그

[Aiffel 9] 딥다이브 1. 텍스트 데이터 다루기 본문

AI ML DL/NLP

[Aiffel 9] 딥다이브 1. 텍스트 데이터 다루기

nineil912 2024. 10. 10. 11:16

포스팅 개요

아이펠 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

위 블로그에 공부하며 내용을 정리했다.

 

FastText

- Word2Vec의 '자주 등장하지 않는 단어는 최악의 경우 단 한번의 연산만을 거쳐 랜덤하게 초기화된 값과 크게 다르지 않은 상태로 알고리즘을 종료한다' 는 문제를 해결하기 위헤 BPE와 비슷한 아이디어 적용

- 따라서 새로 등장한 어휘에 대해 임베딩을 어떻게 구상할지에 대해 다룸

 

- 어휘를 구성하는 무든 n-gram 벡터의 평균 벡터를 어휘 임베딩으로 봄

e.g. 'where' 이라는 어휘에 대해서 5개의 n-gram으로 쪼갬

<wh, whe, her, ere, re>

- 어휘의 시작과 끝을 뜻하는 기호 <, >을 표현

- 5개의 trigram에 대한 임베딩 벡터의 평균 벡터로 계산

 

 

 

ELMo - the 1st Contextualized Word Embedding

 


간단 후기