728x90
단어를 벡터로 만드는 방법?

 

 

FastText는 2017년 페이스북에서 발표한 자연어 처리 라이브러리로,  Word2Vec의 확장판이라고 할 수 있다. Word2Vec과 달리 서브워드를 고려한다.

 

FastText는 임베딩(word embedding)과 텍스트 분류(text classification)를 수행한다. skip-gram(; 주변 단어 예측)을 베이스로 한다.

 

import fasttext

# 학습 데이터 불러오기
data = "corpus.txt"

# FastText 워드 임베딩 모델 학습하기
model = fasttext.train_unsupervised(input=data, dim=300, minn=3, maxn=6, epoch=10, lr=0.05)

# 모델 저장
model.save_model("embedding.bin")

*bin 형식은 이진으로 저장된다.

더보기

이진 형식으로 저장하면 좋은 점?

 

  1. 용량 절약:
    이진 형식은 데이터를 효율적으로 표현하기 때문에 파일의 크기를 줄일 수 있다. 특히, 텍스트 형식과 비교했을 때 데이터의 크기가 큰 경우 이진 형식으로 저장하면 디스크 공간을 절약할 수 있다.

  2. 빠른 로드 속도:
    이진 형식은 컴퓨터가 데이터를 읽고 처리하기 쉽기 때문에 로드 속도가 빠르다. 이진 형식으로 저장된 파일은 일반적으로 텍스트 파일에 비해 더 빠르게 읽어올 수 있다.

  3. 데이터 보호:
    이진 형식으로 저장된 파일은 일반적으로 읽기가 어렵기 때문에 데이터의 안정성과 보안성이 높아진다. 텍스트 형식으로 저장된 파일은 내용을 쉽게 확인할 수 있지만, 이진 형식은 그렇지 않다.
import fasttext

# 학습된 모델을 불러오기
model = fasttext.load_model("classifier.bin")

# 텍스트 입력받기
text = "This is a text classification example."

# 텍스트 분류하기
result = model.predict(text)

# 결과 출력
print(result)

 

서브워드(subword): 단어를 더 작은 단위로 분해한 단위

  • 서브워드 토크나이저
    • 바이트 페어 인코딩(Byte Pair Encoding): 문자열 쌍을 반복적으로 병합하면서 단어 집합 생성
      https://wikidocs.net/22592
    • 센텐스피스(SentencePiece): BPE와 WordPiece를 기반으로 분해한다. 텍스트 내 단어 경계를 고려하지 않아 언어나 문서에 상관없이 일관된 토큰화 제공
      https://wikidocs.net/86657
    • 서브워드 텍스트 인코더(SubwordTextEncoder): OOV(Out-of-Vocabulary) 문제를 해결하고 자연스럽고 유연한 인코딩 제공
      https://wikidocs.net/86792
    • 허깅페이스 토크나이저(Huggingface Tokenizer): 토큰화할 언어의 전체 어휘를 미리 정희하고 각 어휘에 속하지 않는 문자열을 서브워드로 분해하는 방식. BPE와 유사하지만 전체 어휘를 미리 정의하기 때문에 모델의 크기가 커질 수 있다.
      https://wikidocs.net/99893

 

 

바이트-페어-인코딩(Byte Pair Encoding, BPE)

바이트-페어-인코딩(Byte Pair Encoding, BPE)은 원래 데이터 압축 알고리즘이었으나 후에 자연어 처리의 서브워드 분리 알고리즘으로 응용되었다. 가장 빈번하게 등장하는 문자열의 쌍을 하나의 서브워드로 대체하는 과정을 반복하여 점차적으로 단어를 분해해 나간다.

 

먼저, 모든 문자열을 하나의 문자 단위로 분해한다. 그 다음, 가장 빈번하게 등장하는 문자열의 쌍을 찾아 하나의 서브워드로 대체한다. 새로운 서브워드는 이전에 등장하지 않은 문자열로 구성된다. 이러한 과정을 반복하면, 문자열을 더 이상 분해할 수 없을 때까지 서브워드로 분해할 수 있다.

예) "abcabcab"

→ 빈번한 연속된 문자 "ab"를 Z로 치환하기

 ZcZcZ 

Z = ab

→ 빈번한 연속된 문자 "Zc"를 Y로 치환하기

YYZ

Z = ab

Y = Zc

→ 더 이상 병합할 바이트 쌍이 없으므로 "YYZ"가 최종 결과가 된다.


바이트-페어 인코딩의 장점?

- 훈련 데이터에 없는 단어를 처리하는 데에 유용하다.

- 형태가 비슷한 단어들을 비슷한 벡터로 표현할 수 있기 때문에 단어 임베딩을 사용할 때 유용하다.

728x90

+ Recent posts