Gensim-TF-IDFマトリックスの作成

ここでは、Gensimを使用して用語頻度-逆ドキュメント頻度(TF-IDF)マトリックスを作成する方法について学習します。

TF-IDFとは何ですか?

これは、用語頻度-逆ドキュメント頻度モデルであり、これもバッグオブワードモデルです。通常のコーパスとは異なり、トークン、つまりドキュメント全体で頻繁に出現する単語の重みが小さくなります。初期化中、このtf-idfモデルアルゴリズムは、整数値を持つトレーニングコーパス(Bag-of-Wordsモデルなど)を想定しています。

その後、変換時にベクトル表現を取り、別のベクトル表現を返します。出力ベクトルは同じ次元になりますが、(トレーニング時の)まれな特徴の値が増加します。基本的に、整数値のベクトルを実数値のベクトルに変換します。

それはどのように計算されますか?

TF-IDFモデルは、次の2つの簡単な手順を使用してtfidfを計算します-

ステップ1:ローカルコンポーネントとグローバルコンポーネントを乗算する

この最初のステップでは、モデルはTF(Term Frequency)などのローカルコンポーネントとIDF(Inverse Document Frequency)などのグローバルコンポーネントを乗算します。

ステップ2:結果を正規化する

乗算が完了すると、次のステップでTFIDFモデルは結果を単位長に正規化します。

上記の2つのステップの結果として、ドキュメント全体で頻繁に発生する単語の重みが小さくなります。

TF-IDFの重みを取得する方法は?

ここでは、TF-IDFの重みを取得する方法を確認するための例を実装します。基本的に、TF-IDFの重みを取得するには、最初にコーパスをトレーニングしてから、そのコーパスをtfidfモデル内に適用する必要があります。

コーパスをトレーニングする

上で述べたように、TF-IDFを取得するには、最初にコーパスをトレーニングする必要があります。まず、必要なすべてのパッケージを次のようにインポートする必要があります-

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

次に、文を含むリストを提供します。リストには3つの文があります-

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])

単語の重みの違い

上で説明したように、ドキュメント内でより頻繁に出現する単語は、重みが小さくなります。上記の2つの出力からの単語の重みの違いを理解しましょう。言葉‘are’2つのドキュメントで発生し、重み付けされています。同様に、単語‘you’ すべてのドキュメントに表示され、完全に削除されました。