FastText
- 단어를 벡터로 만드는 또 다른 방법으로 페이스북에서 개발함
- 메커니즘 자체는 Word2Vec의 확장이라고 볼 수 있지만
Word2Vec은 단어를 쪼개질 수 없는 단위로 생각한다면, FastText는 하나의 단어 안에도 여러 단어들이 존재하는 것으로 간주
즉, 내부 단어인 서브워드를 고려하여 학습하게 됨
내부 단어의 학습
- FastText에서는 각 단어는 글자 단위 n-gram의 구성으로 취급되므로
n을 몇으로 결정하는지에 따라서 단어들이 얼마나 분리되는지 결정됨 - 예) n을 3으로 잡은 트라이그램의 경우,
apple은 app, ppl, ple로 분리하고 이들을 벡터로 만들고 시작과 끝을 의미하는 <, >를 도입하여
<ap, app, ppl, ple, le> 5개 내부 단어 토큰을 벡터로 만들게 됨
그리고 여기에 추가적으로 기존 단어에 <,와 >를 붙인 특별 토큰 하나를 더 벡터화하므로
n = 3인 경우, FastText는 단어 apple에 대해서 <ap, app, ppl, ple, le>, <apple>로 6개의 토큰을 벡터화함 - 실제 사용할 때는 n의 최소값과 최대값으로 범위를 설정하며 기본값으로는 각각 3과 6으로 설정되어 있음
<ap, app, ppl, ppl, ple, le>, <app, appl, pple, ple>, <appl, pple>, ..., <apple> - 여기서 내부 단어들을 벡터화한다는 의미는 저 단어들에 대해서 Word2Vec을 수행한다는 의미이므로
위와 같이 내부 단어들의 벡터값을 얻었다면, 단어 apple의 벡터값은 저 위 벡터들의 총 합으로 구성되게 됨
apple = <ap + app + ppl + ple + le> + <app + appl + pple + ple> + <appl + pple> + , ..., + <apple>
그리고 이러한 방법은 Word2Vec에서는 얻을 수 없었던 강점인 모르는 단어에 대한 대응을 할 수 있음
모르는 단어에 대한 대응
- FastText의 인공 신경망을 학습한 후에는 데이터 셋의 모든 단어의 각 n-gram에 대해서 워드 임베딩이 되므로
데이터 셋만 충분하다면 내부 단어를 통해 모르는 단어에 대해서도 다른 단어와의 유사도를 계산할 수 있게 됨 - 예) FastText에서 birthplace란 단어를 학습하지 않았으나 다른 단어 birth와 place라는 내부 단어가 있었다면
FastText는 birthplace의 벡터를 얻을 수 있음 - 이는 모르는 단어에 제대로 대처할 수 없는 Word2Vec, GloVe와 다른 점
단어 집합 내 빈도 수가 적었던 단어에 대한 대응
- 또한 Word2Vec은 등장 빈도 수가 적은 단어에 대해서는 참고할 수 있는 경우의 수가 적으므로
정확하게 임베딩이 되지 않아 임베딩의 정확도가 높지 않다는 단점이 있음 - 하지만 FastText의 경우 희귀 단어라도 그 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면
비교적 높은 임베딩 벡터값을 얻을 수 있게 됨 - 또한 훈련 코퍼스에서 오타나 맞춤법이 틀린 데이터와 같이 노이즈가 많은 코퍼스의 경우
Word2Vec에서는 오타가 섞인 단어는 임베딩이 제대로 되지 않았지만
FastText는 그러한 단어들이 등장 빈도수가 매우 적으므로 일종의 희귀 단어가 되게 되고
이러한 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면 임베딩 벡터값을 얻을 수 있어 일정 수준의 성능을 얻게 됨 - 예) apple과 오타로 p를 한 번 더 입력한 appple의 경우에는 실제로 많은 개수의 동일한 n-gram을 가지게 됨
실습으로 비교하는 Word2Vec vs FastText
- 파이썬의 genism 패키지의 Word2Vec 사용하기
1) 파이썬의 genism 패키지에는 Word2Vec을 지원하고 있어 손쉽게 단어를 임베딩 벡터로 변환할 수 있음 - 훈련 데이터 이해하기
1) 훈련 데이터를 다운로드 - 훈련 데이터 전처리하기
1) xml 문법으로 작성된 파일에 대해 xml 문법들과 배경음을 나타내는 단어들을 제거하고 자연어 데이터만 가져오도록 전처리
2) 또한 입력 코퍼스에 대해서 단어 토큰화를 수행
3) 토큰화가 수행된 총 샘플의 개수는 27만 3천개 - Word2Vec 훈련시키기
1) Word2Vec에 대해서 학습을 진행 - Word2Vec
1) 입력 단어에 대해서 유사한 단어를 찾아내는 코드에 elctrofishig이라는 단어를 넣어 출력해봄
모르는 단어에 대해서는 임베딩 벡터가 존재하지 않기 때문에 단어의 유사도를 계산할 수 없어
해당 코드는 정상 작동하지 않고 에러를 발생하게 됨 - FastText 훈련시키기
1) FastText에 대해서 학습을 진행 - FastText
1) 입력 단어에 대해서 유사한 단어를 찾아내는 코드에 elctrofishig이라는 단어를 넣어 출력해봄
Word2Vec과 달리 학습하지 않은 단어에 대해서 FastText는 유사한 단어를 계산해서 출력하게 됨
한국어에서의 FastText
- 한국어에도 모르는 단어 문제를 해결하기 위해 FastText를 적용하고자 함
- 음절 단위
음절 단위의 임베딩의 경우 n=3일 때 '자연어처리'리는 단어에 대해 n-gram을 만들면
<자연, 자연어, 연어처, 어처리, 처리>가 되게 됨 - 자모 단위
자모 단위(초성, 중성, 종성 단위)의 임베딩의 경우 오타나 노이즈 측면에서 더 강한 임베딩을 기대할 수 있음
자모 단위의 임베딩을 하기 위해 '자연어처리'라는 단어에 대해 초성, 중성, 종성을 분리하고
만약 종성이 존재하지 않는다면 '_'라는 토큰을 사용한다고 가정하면 ㅈ ㅏ _ ㅇ ㅕ ㄴ ㅇ ㅓ _ ㅊ ㅓ _ ㄹ ㅣ _ 가 되므로
이렇게 분리된 결과에 대해서 자모 단위의 임베딩으로 n=3을 하면 <ㅈ ㅏ, ㅈ ㅏ _, ㅏ _ ㅇ, ... 중략>이 되게 됨
코드
GitHub - GaGa-Kim/ML_Study: 머신러닝 스터디 ⚙
머신러닝 스터디 ⚙. Contribute to GaGa-Kim/ML_Study development by creating an account on GitHub.
github.com
'ML > 딥 러닝을 이용한 자연어 처리' 카테고리의 다른 글
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 엘모 (0) | 2022.12.16 |
---|---|
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 사전 훈련된 워드 임베딩 (0) | 2022.12.16 |
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 글로브 (0) | 2022.12.14 |
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 워드투벡터 (2) (0) | 2022.12.07 |
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 워드투벡터 (1) (0) | 2022.12.05 |
FastText
- 단어를 벡터로 만드는 또 다른 방법으로 페이스북에서 개발함
- 메커니즘 자체는 Word2Vec의 확장이라고 볼 수 있지만
Word2Vec은 단어를 쪼개질 수 없는 단위로 생각한다면, FastText는 하나의 단어 안에도 여러 단어들이 존재하는 것으로 간주
즉, 내부 단어인 서브워드를 고려하여 학습하게 됨
내부 단어의 학습
- FastText에서는 각 단어는 글자 단위 n-gram의 구성으로 취급되므로
n을 몇으로 결정하는지에 따라서 단어들이 얼마나 분리되는지 결정됨 - 예) n을 3으로 잡은 트라이그램의 경우,
apple은 app, ppl, ple로 분리하고 이들을 벡터로 만들고 시작과 끝을 의미하는 <, >를 도입하여
<ap, app, ppl, ple, le> 5개 내부 단어 토큰을 벡터로 만들게 됨
그리고 여기에 추가적으로 기존 단어에 <,와 >를 붙인 특별 토큰 하나를 더 벡터화하므로
n = 3인 경우, FastText는 단어 apple에 대해서 <ap, app, ppl, ple, le>, <apple>로 6개의 토큰을 벡터화함 - 실제 사용할 때는 n의 최소값과 최대값으로 범위를 설정하며 기본값으로는 각각 3과 6으로 설정되어 있음
<ap, app, ppl, ppl, ple, le>, <app, appl, pple, ple>, <appl, pple>, ..., <apple> - 여기서 내부 단어들을 벡터화한다는 의미는 저 단어들에 대해서 Word2Vec을 수행한다는 의미이므로
위와 같이 내부 단어들의 벡터값을 얻었다면, 단어 apple의 벡터값은 저 위 벡터들의 총 합으로 구성되게 됨
apple = <ap + app + ppl + ple + le> + <app + appl + pple + ple> + <appl + pple> + , ..., + <apple>
그리고 이러한 방법은 Word2Vec에서는 얻을 수 없었던 강점인 모르는 단어에 대한 대응을 할 수 있음
모르는 단어에 대한 대응
- FastText의 인공 신경망을 학습한 후에는 데이터 셋의 모든 단어의 각 n-gram에 대해서 워드 임베딩이 되므로
데이터 셋만 충분하다면 내부 단어를 통해 모르는 단어에 대해서도 다른 단어와의 유사도를 계산할 수 있게 됨 - 예) FastText에서 birthplace란 단어를 학습하지 않았으나 다른 단어 birth와 place라는 내부 단어가 있었다면
FastText는 birthplace의 벡터를 얻을 수 있음 - 이는 모르는 단어에 제대로 대처할 수 없는 Word2Vec, GloVe와 다른 점
단어 집합 내 빈도 수가 적었던 단어에 대한 대응
- 또한 Word2Vec은 등장 빈도 수가 적은 단어에 대해서는 참고할 수 있는 경우의 수가 적으므로
정확하게 임베딩이 되지 않아 임베딩의 정확도가 높지 않다는 단점이 있음 - 하지만 FastText의 경우 희귀 단어라도 그 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면
비교적 높은 임베딩 벡터값을 얻을 수 있게 됨 - 또한 훈련 코퍼스에서 오타나 맞춤법이 틀린 데이터와 같이 노이즈가 많은 코퍼스의 경우
Word2Vec에서는 오타가 섞인 단어는 임베딩이 제대로 되지 않았지만
FastText는 그러한 단어들이 등장 빈도수가 매우 적으므로 일종의 희귀 단어가 되게 되고
이러한 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면 임베딩 벡터값을 얻을 수 있어 일정 수준의 성능을 얻게 됨 - 예) apple과 오타로 p를 한 번 더 입력한 appple의 경우에는 실제로 많은 개수의 동일한 n-gram을 가지게 됨
실습으로 비교하는 Word2Vec vs FastText
- 파이썬의 genism 패키지의 Word2Vec 사용하기
1) 파이썬의 genism 패키지에는 Word2Vec을 지원하고 있어 손쉽게 단어를 임베딩 벡터로 변환할 수 있음 - 훈련 데이터 이해하기
1) 훈련 데이터를 다운로드 - 훈련 데이터 전처리하기
1) xml 문법으로 작성된 파일에 대해 xml 문법들과 배경음을 나타내는 단어들을 제거하고 자연어 데이터만 가져오도록 전처리
2) 또한 입력 코퍼스에 대해서 단어 토큰화를 수행
3) 토큰화가 수행된 총 샘플의 개수는 27만 3천개 - Word2Vec 훈련시키기
1) Word2Vec에 대해서 학습을 진행 - Word2Vec
1) 입력 단어에 대해서 유사한 단어를 찾아내는 코드에 elctrofishig이라는 단어를 넣어 출력해봄
모르는 단어에 대해서는 임베딩 벡터가 존재하지 않기 때문에 단어의 유사도를 계산할 수 없어
해당 코드는 정상 작동하지 않고 에러를 발생하게 됨 - FastText 훈련시키기
1) FastText에 대해서 학습을 진행 - FastText
1) 입력 단어에 대해서 유사한 단어를 찾아내는 코드에 elctrofishig이라는 단어를 넣어 출력해봄
Word2Vec과 달리 학습하지 않은 단어에 대해서 FastText는 유사한 단어를 계산해서 출력하게 됨
한국어에서의 FastText
- 한국어에도 모르는 단어 문제를 해결하기 위해 FastText를 적용하고자 함
- 음절 단위
음절 단위의 임베딩의 경우 n=3일 때 '자연어처리'리는 단어에 대해 n-gram을 만들면
<자연, 자연어, 연어처, 어처리, 처리>가 되게 됨 - 자모 단위
자모 단위(초성, 중성, 종성 단위)의 임베딩의 경우 오타나 노이즈 측면에서 더 강한 임베딩을 기대할 수 있음
자모 단위의 임베딩을 하기 위해 '자연어처리'라는 단어에 대해 초성, 중성, 종성을 분리하고
만약 종성이 존재하지 않는다면 '_'라는 토큰을 사용한다고 가정하면 ㅈ ㅏ _ ㅇ ㅕ ㄴ ㅇ ㅓ _ ㅊ ㅓ _ ㄹ ㅣ _ 가 되므로
이렇게 분리된 결과에 대해서 자모 단위의 임베딩으로 n=3을 하면 <ㅈ ㅏ, ㅈ ㅏ _, ㅏ _ ㅇ, ... 중략>이 되게 됨
코드
GitHub - GaGa-Kim/ML_Study: 머신러닝 스터디 ⚙
머신러닝 스터디 ⚙. Contribute to GaGa-Kim/ML_Study development by creating an account on GitHub.
github.com
'ML > 딥 러닝을 이용한 자연어 처리' 카테고리의 다른 글
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 엘모 (0) | 2022.12.16 |
---|---|
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 사전 훈련된 워드 임베딩 (0) | 2022.12.16 |
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 글로브 (0) | 2022.12.14 |
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 워드투벡터 (2) (0) | 2022.12.07 |
[딥 러닝을 이용한 자연어 처리 입문] 09. 워드 임베딩 - 워드투벡터 (1) (0) | 2022.12.05 |