Gensim-TF-IDF 매트릭스 생성

여기에서는 Gensim의 도움으로 TF-IDF (Term Frequency-Inverse Document Frequency) 매트릭스를 만드는 방법에 대해 알아 봅니다.

TF-IDF는 무엇입니까?

백 오브 워드 (bag-of-words) 모델이기도 한 Term Frequency-Inverse Document Frequency 모델입니다. 토큰에 가중치를 부여하기 때문에 일반 말뭉치와 다릅니다. 즉, 문서에서 자주 나타나는 단어입니다. 초기화 중에이 tf-idf 모델 알고리즘은 정수 값 (예 : Bag-of-Words 모델)을 가진 학습 코퍼스를 예상합니다.

그런 다음 변환시 벡터 표현을 취하고 다른 벡터 표현을 반환합니다. 출력 벡터는 동일한 차원을 갖지만 희귀 기능의 값 (훈련 당시)이 증가합니다. 기본적으로 정수 값 벡터를 실수 벡터로 변환합니다.

계산 방법

TF-IDF 모델은 다음 두 가지 간단한 단계를 통해 tfidf를 계산합니다.

1 단계 : 로컬 및 글로벌 구성 요소 곱하기

이 첫 번째 단계에서 모델은 TF (Term Frequency)와 같은 로컬 구성 요소를 IDF (Inverse Document Frequency)와 같은 전역 구성 요소와 곱합니다.

2 단계 : 결과 정규화

곱셈이 끝나면 다음 단계에서 TFIDF 모델은 결과를 단위 길이로 정규화합니다.

위의 두 단계의 결과로 문서 전체에서 자주 발생하는 단어의 가중치가 낮아집니다.

TF-IDF 가중치를 얻는 방법?

여기에서는 TF-IDF 가중치를 얻는 방법을보기위한 예제를 구현할 것입니다. 기본적으로 TF-IDF 가중치를 얻으려면 먼저 말뭉치를 훈련 한 다음 해당 말뭉치를 tfidf 모델 내에서 적용해야합니다.

코퍼스 훈련

위에서 말했듯이 TF-IDF를 얻으려면 먼저 말뭉치를 훈련해야합니다. 먼저 다음과 같이 필요한 모든 패키지를 가져와야합니다.

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

이제 문장이 포함 된 목록을 제공하십시오. 목록에는 세 문장이 있습니다.

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

다음으로 다음과 같이 문장의 토큰 화를 수행하십시오.

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

개체 만들기 corpora.Dictionary() 다음과 같이-

dictionary = corpora.Dictionary()

이제이 토큰 화 된 문장을 dictionary.doc2bow() 다음과 같이 개체-

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

다음으로, 우리는 문서에서 단어 id와 그 빈도를 얻을 것입니다.

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

산출

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

이런 식으로 우리는 말뭉치 (Bag-of-Word 말뭉치)를 훈련 시켰습니다.

다음으로이 훈련 된 말뭉치를 tfidf 모델 내에 적용해야합니다. models.TfidfModel().

먼저 numpay 패키지 가져 오기-

import numpy as np

이제 훈련 된 말뭉치 (BoW_corpus)를 대괄호 안에 적용합니다. models.TfidfModel()

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

다음으로, 우리는 tfidf 모델링 된 말뭉치에서 단어 id와 그 빈도를 얻을 것입니다.

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

산출

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

위의 출력에서 ​​문서의 단어 빈도 차이를 볼 수 있습니다.

완전한 구현 예

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

단어 무게의 차이

위에서 설명한 것처럼 문서에서 더 자주 나오는 단어는 더 작은 가중치를 갖게됩니다. 위의 두 출력에서 ​​단어 가중치의 차이를 이해합시다. 단어‘are’두 개의 문서에서 발생하고 가중치를 낮췄습니다. 마찬가지로 단어‘you’ 모든 문서에 나타나고 모두 제거됩니다.