Gensim-ベクトルとモデル

ここでは、ベクトルとモデルに主に焦点を当てて、Gensimのコアコンセプトについて学習します。

ベクターとは何ですか?

コーパスの潜在構造を推測したい場合はどうなりますか?このためには、同じものを数学的に操作できるような方法でドキュメントを表現する必要があります。一般的な表現の1つは、コーパスのすべてのドキュメントを特徴のベクトルとして表現することです。そのため、ベクトルはドキュメントの数学的に便利な表現であると言えます。

例を挙げて、上記で使用したコーパスの1つの機能をQAペアとして表現しましょう。

Q −単語は何回ですか Hello ドキュメントに表示されますか?

A −ゼロ(0)。

Q −ドキュメントにはいくつの段落がありますか?

A − 2つ(2)

質問は通常、整数IDで表されるため、このドキュメントの表現は(1、0.0)、(2、2.0)のような一連のペアです。このようなベクトル表現は、denseベクター。なぜdense、上記のすべての質問に対する明示的な回答で構成されているためです。

すべての質問を事前に知っていれば、表現は(0、2)のような単純なものにすることができます。そのような一連の回答(もちろん、質問が事前にわかっている場合)はvector 私たちのドキュメントのために。

別の人気のある種類の表現は bag-of-word (BoW)モデル。このアプローチでは、各ドキュメントは基本的に、辞書内のすべての単語の頻度カウントを含むベクトルで表されます。

例を挙げると、['Hello'、 'How'、 'are'、 'you']という単語を含む辞書があるとします。文字列「Howareyou how」で構成されるドキュメントは、ベクトル[0、2、1、1]で表されます。ここで、ベクトルのエントリは、「Hello」、「How」、「are」、「you」の出現順になっています。

ベクトル対ドキュメント

上記のベクトルの説明から、ドキュメントとベクトルの違いはほぼ理解できます。しかし、それを明確にするために、document テキストであり、 vectorそのテキストの数学的に便利な表現です。残念ながら、多くの人がこれらの用語を同じ意味で使用することがあります。

たとえば、任意のドキュメントAがあるとします。その場合、「ドキュメントAに対応するベクトル」と言う代わりに、「ベクトルA」または「ドキュメントA」と言っていました。これは大きなあいまいさにつながります。ここで注意すべきもう1つの重要な点は、2つの異なるドキュメントが同じベクトル表現を持っている可能性があるということです。

コーパスをベクトルのリストに変換する

コーパスをベクトルのリストに変換する実装例を取り上げる前に、コーパス内の各単語を一意の整数IDに関連付ける必要があります。このために、上記の章で取り上げた例を拡張します。

from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

出力

Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)

これは、コーパスに25の異なるトークンがあることを示しています gensim.corpora.Dictionary

実装例

次のように、辞書を使用して、トークン化されたドキュメントをこれらの5次元ベクトルに変換できます。

pprint.pprint(dictionary.token2id)

出力

{
   'binary': 11,
   'computer': 0,
   'error': 7,
   'generation': 12,
   'graph': 16,
   'intersection': 17,
   'iv': 19,
   'measurement': 8,
   'minors': 20,
   'opinion': 1,
   'ordering': 21,
   'paths': 18,
   'perceived': 9,
   'quasi': 22,
   'random': 13,
   'relation': 10,
   'response': 2,
   'survey': 3,
   'system': 4,
   'time': 5,
   'trees': 14,
   'unordered': 15,
   'user': 6,
   'well': 23,
   'widths': 24
}

同様に、次のようにドキュメントのバッグオブワード表現を作成できます。

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

出力

[
   [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
   [(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
   [(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
   [(14, 1), (16, 1), (17, 1), (18, 1)],
   [(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]

モデルとは何ですか?

コーパスをベクトル化したら、次に何をしますか?これで、モデルを使用して変換できます。モデルは、あるドキュメント表現を別のドキュメント表現に変換するために使用されるアルゴリズムを指す場合があります。

すでに説明したように、Gensimのドキュメントはベクトルとして表されるため、2つのベクトル空間間の変換としてモデル化できます。モデルがそのような変換の詳細を学習するトレーニングフェーズは常にあります。モデルは、トレーニングフェーズ中にトレーニングコーパスを読み取ります。

モデルの初期化

初期化しましょう tf-idfモデル。このモデルは、ベクトルをBoW(Bag of Words)表現から別のベクトル空間に変換します。この空間では、コーパス内のすべての単語の相対的な希少性に応じて頻度カウントが重み付けされます。

実装例

次の例では、を初期化します。 tf-idfモデル。コーパスでトレーニングしてから、文字列「ツリーグラフ」を変換します。

from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])

出力

[(3, 0.4869354917707381), (4, 0.8734379353188121)]

これで、モデルを作成したら、tfidfを介してコーパス全体を変換してインデックスを作成し、コーパス内の各ドキュメントに対するクエリドキュメント(クエリドキュメントに「ツリーシステム」を指定)の類似性をクエリできます。

from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))

出力

[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]

上記の出力から、ドキュメント4とドキュメント5の類似度スコアは約49%です。

さらに、この出力を次のように並べ替えて読みやすくすることもできます。

for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
   print(doc_number, score)

出力

2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0