Gensim-creating-tf-idf-matrix
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
- models.TfidfModel()*の角括弧内にトレーニング済みのコーパス(BoW_corpus)を適用します
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’ という単語がすべてのドキュメントに表示され、すべて削除されました。