Top2Vec - Top2Vecは、トピックモデリングとセマンティック検索のためのアルゴリズムです。テキストに存在するトピックを自動的に検出し、共同で埋め込まれたトピック、ドキュメント、および単語のベクトルを生成します。

(Top2Vec learns jointly embedded topic, document and word vectors.)

Created at: 2020-03-21 01:19:57
Language: Python
License: BSD-3-Clause

更新:

  • 利用可能な新しい事前トレーニング済みトランスモデル
  • callableをに渡すことにより、任意の埋め込みモデルを使用する機能
    embedding_model
  • 長いドキュメントのドキュメントチャンクオプション
  • 設定によるトピックのフレーズ
    ngram_vocab=True

Top2Vec

Top2Vecは、トピックモデリングセマンティック検索のためのアルゴリズムです。テキストに存在するトピックを自動的に検出し、共同で埋め込まれたトピック、ドキュメント、および単語のベクトルを生成します。Top2Vecモデルをトレーニングすると、次のことができます。

  • 検出されたトピックの数を取得します。
  • トピックを取得します。
  • トピックサイズを取得します。
  • 階層的なトピックを取得します。
  • キーワードでトピックを検索します。
  • トピックでドキュメントを検索します。
  • キーワードでドキュメントを検索します。
  • 類似の単語を検索します。
  • 同様のドキュメントを検索します。
  • RESTfulでモデルを公開-Top2Vec

それがどのように機能するかの詳細については、論文を参照してください。

利点

  1. トピックの数を自動的に検索します。
  2. ストップワードリストは必要ありません。
  3. ステミング/レンマ化の必要はありません。
  4. 短いテキストで動作します。
  5. 共同で埋め込まれたトピック、ドキュメント、および単語のベクトルを作成します。
  6. 検索機能が組み込まれています。

それはどのように機能しますか?

アルゴリズムが行う仮定は、多くの意味的に類似したドキュメントが基礎となるトピックを示しているということです。最初のステップは、ドキュメントと単語のベクトルの共同埋め込みを作成することです。ドキュメントと単語がベクトル空間に埋め込まれると、アルゴリズムの目標は、ドキュメントの密集したクラスターを見つけ、それらのドキュメントを一緒に引き付けた単語を特定することです。それぞれの密集した領域がトピックであり、密集した領域にドキュメントを引き付けた単語がトピックの単語です。

アルゴリズム:

1.Doc2VecまたはUniversalSentenceEncoderまたはBERTSentenceTransformerを使用して、共同で埋め込まれたドキュメントと単語のベクトルを作成します。

ドキュメントは、他の同様のドキュメントの近くに配置され、最も特徴的な単語の近くに配置されます。

2. UMAPを使用して、ドキュメントベクトルの低次元の埋め込みを作成します。

高次元空間のドキュメントベクトルは非常にまばらであり、次元削減は密集した領域を見つけるのに役立ちます。各ポイントはドキュメントベクトルです。

3.HDBSCANを使用してドキュメントの密集した領域を見つけます。

色付きの領域は、ドキュメントの密集した領域です。赤い点は、特定のクラスターに属していない外れ値です。

4.密集した領域ごとに、元の次元のドキュメントベクトルの重心を計算します。これは、トピックベクトルです。

赤い点は外れ値のドキュメントであり、トピックベクトルの計算には使用されません。紫色の点は、トピックベクトルが計算される密集した領域に属するドキュメントベクトルです。

5.結果のトピックベクトルに最も近いn個の単語ベクトルを見つけます。

近接順に最も近い単語ベクトルがトピック単語になります。

インストール

Top2Vecをインストールする簡単な方法は次のとおりです。

pip install top2vec

事前にトレーニングされたユニバーサルセンテンスエンコーダオプションをインストールするには:

pip install top2vec[sentence_encoders]

事前にトレーニングされたBERTセンテンストランスフォーマーオプションをインストールするには:

pip install top2vec[sentence_transformers]

インデックス作成オプションをインストールするには:

pip install top2vec[indexing]

使用法

from top2vec import Top2Vec

model = Top2Vec(documents)

重要なパラメータ:

  • documents
    :入力コーパス。文字列のリストである必要があります。

  • speed
    :このパラメーターは、モデルのトレーニングにかかる​​速度を決定します。'fast-learn'オプションは最速で、最低品質のベクトルを生成します。'learn'オプションは、より高品質のベクトルを学習しますが、トレーニングに時間がかかります。'deep-learn'オプションは、最高品質のベクトルを学習しますが、トレーニングにはかなりの時間がかかります。

  • workers
    :モデルのトレーニングに使用されるワーカースレッドの量。量が多いほど、トレーニングが速くなります。

トレーニング済みのモデルを保存してロードできます。

model.save("filename")
model = Top2Vec.load("filename")

詳細については、 APIガイドをご覧ください。

事前トレーニング済みの埋め込みモデル

Doc2Vecは、デフォルトで、単語とドキュメントの埋め込みの結合を生成するために使用されます。

embedding_model
ただし、単語とドキュメントの共同埋め込みを生成するための事前トレーニング済みのオプションもあります。

  • universal-sentence-encoder
  • universal-sentence-encoder-multilingual
  • distiluse-base-multilingual-cased
from top2vec import Top2Vec

model = Top2Vec(documents, embedding_model='universal-sentence-encoder')

大規模なデータセットや非常にユニークな語彙を持つデータセットの場合、doc2vecはより良い結果を生み出す可能性があります。これにより、doc2vecモデルが最初からトレーニングされます。この方法は言語に依存しません。ただし、複数の言語は調整されません。

ユニバーサルセンテンスエンコーダオプションの使用は、事前にトレーニングされた効率的なモデルであるため、はるかに高速になります。ユニバーサルセンテンスエンコーダオプションは、より小さなデータセットに推奨されます。また、英語または多言語モデルでカバーされている言語の大規模なデータセットにも適しています。多言語のデータセットにも推奨されます。

多言語ユニバーサルセンテンスエンコーダーでカバーされていない多言語データセットおよび言語には、distiluse-base-multilingual-casedの事前トレーニング済みセンテンストランスフォーマーが推奨されます。トランスフォーマーは、ユニバーサルセンテンスエンコーダオプションよりも大幅に低速です。

Universal- Sentence -Encoder 、 Universal-Sentence-Encoder-Multilingual 、およびDistiluse-base-Multilingual-casedに関する詳細情報。

引用

作品でTop2Vecを引用したい場合は、これが現在のリファレンスです。

@article{angelov2020top2vec,
      title={Top2Vec: Distributed Representations of Topics}, 
      author={Dimo Angelov},
      year={2020},
      eprint={2008.09470},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}

列車モデル

20newsgroupsデータセットでTop2Vecモデルをトレーニングします。

from top2vec import Top2Vec
from sklearn.datasets import fetch_20newsgroups

newsgroups = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))

model = Top2Vec(documents=newsgroups.data, speed="learn", workers=8)

トピック数を取得

これにより、Top2Vecがデータで検出したトピックの数が返されます。

>>> model.get_num_topics()
77

トピックサイズを取得する

これにより、各トピックに最も類似したドキュメントの数が返されます。トピックはサイズの大きい順になっています。

topic_sizes, topic_nums = model.get_topic_sizes()

戻り値:

  • topic_sizes
    :各トピックに最も類似しているドキュメントの数。

  • topic_nums
    :すべてのトピックの一意のインデックスが返されます。

トピックを取得

これにより、トピックのサイズが小さくなります。

topic_words, word_scores, topic_nums = model.get_topics(77)

戻り値:

  • topic_words
    :トピックごとに、トピックとの意味的類似性の順に、上位50語が返されます。

  • word_scores
    :トピックごとに、トピックの上位50語のコサイン類似度スコアが返されます。

  • topic_nums
    :すべてのトピックの一意のインデックスが返されます。

トピックを検索

医学に最も類似したトピックを検索します。

topic_words, word_scores, topic_scores, topic_nums = model.search_topics(keywords=["medicine"], num_topics=5)

戻り値:

  • topic_words
    :トピックごとに、トピックとの意味的類似性の順に、上位50語が返されます。

  • word_scores
    :トピックごとに、トピックの上位50語のコサイン類似度スコアが返されます。

  • topic_scores
    :トピックごとに、検索キーワードとのコサイン類似度が返されます。

  • topic_nums
    :すべてのトピックの一意のインデックスが返されます。

>>> topic_nums
[21, 29, 9, 61, 48]

>>> topic_scores
[0.4468, 0.381, 0.2779, 0.2566, 0.2515]

トピック21は、「医学」に最も類似したトピックであり、コサイン類似度は0.4468でした。(値は、最も類似度の低い0から最も類似度の高い1まで可能です)

ワードクラウドを生成する

トピック番号を使用して、ワードクラウドを生成できます。上からの医学トピック検索に最も類似した上位5つのトピックのワードクラウドを生成します。

topic_words, word_scores, topic_scores, topic_nums = model.search_topics(keywords=["medicine"], num_topics=5)
for topic in topic_nums:
    model.generate_topic_wordcloud(topic)

トピックでドキュメントを検索

科学に関すると思われるトピックであるトピック48で検索します。

documents, document_scores, document_ids = model.search_documents_by_topic(topic_num=48, num_docs=5)

戻り値:

  • documents
    :リスト内のドキュメント、最も類似しているものが最初です。

  • doc_scores
    :ドキュメントとトピックの意味的類似性。ドキュメントとトピックベクトルの余弦の類似性。

  • doc_ids
    :ドキュメントの一意のID。IDが指定されていない場合は、元のコーパスのドキュメントのインデックス。

返されたドキュメントごとに、その内容、スコア、およびドキュメント番号を印刷します。

documents, document_scores, document_ids = model.search_documents_by_topic(topic_num=48, num_docs=5)
for doc, score, doc_id in zip(documents, document_scores, document_ids):
    print(f"Document: {doc_id}, Score: {score}")
    print("-----------")
    print(doc)
    print("-----------")
    print()
Document: 15227, Score: 0.6322
-----------
  Evolution is both fact and theory.  The THEORY of evolution represents the
scientific attempt to explain the FACT of evolution.  The theory of evolution
does not provide facts; it explains facts.  It can be safely assumed that ALL
scientific theories neither provide nor become facts but rather EXPLAIN facts.
I recommend that you do some appropriate reading in general science.  A good
starting point with regard to evolution for the layman would be "Evolution as
Fact and Theory" in "Hen's Teeth and Horse's Toes" [pp 253-262] by Stephen Jay
Gould.  There is a great deal of other useful information in this publication.
-----------

Document: 14515, Score: 0.6186
-----------
Just what are these "scientific facts"?  I have never heard of such a thing.
Science never proves or disproves any theory - history does.

-Tim
-----------

Document: 9433, Score: 0.5997
-----------
The same way that any theory is proven false.  You examine the predicitions
that the theory makes, and try to observe them.  If you don't, or if you
observe things that the theory predicts wouldn't happen, then you have some 
evidence against the theory.  If the theory can't be modified to 
incorporate the new observations, then you say that it is false.

For example, people used to believe that the earth had been created
10,000 years ago.  But, as evidence showed that predictions from this 
theory were not true, it was abandoned.
-----------

Document: 11917, Score: 0.5845
-----------
The point about its being real or not is that one does not waste time with
what reality might be when one wants predictions. The questions if the
atoms are there or if something else is there making measurements indicate
atoms is not necessary in such a system.

And one does not have to write a new theory of existence everytime new
models are used in Physics.
-----------

...

キーワードによるセマンティック検索ドキュメント

暗号化プライバシーに意味的に類似したコンテンツをドキュメントで検索します。

documents, document_scores, document_ids = model.search_documents_by_keywords(keywords=["cryptography", "privacy"], num_docs=5)
for doc, score, doc_id in zip(documents, document_scores, document_ids):
    print(f"Document: {doc_id}, Score: {score}")
    print("-----------")
    print(doc)
    print("-----------")
    print()
Document: 16837, Score: 0.6112
-----------
...
Email and account privacy, anonymity, file encryption,  academic 
computer policies, relevant legislation and references, EFF, and 
other privacy and rights issues associated with use of the Internet
and global networks in general.
...

Document: 16254, Score: 0.5722
-----------
...
The President today announced a new initiative that will bring
the Federal Government together with industry in a voluntary
program to improve the security and privacy of telephone
communications while meeting the legitimate needs of law
enforcement.
...
-----------
...

類似のキーワード

スペースに類似した単語を検索します。

words, word_scores = model.similar_words(keywords=["space"], keywords_neg=[], num_words=20)
for word, score in zip(words, word_scores):
    print(f"{word} {score}")
space 1.0
nasa 0.6589
shuttle 0.5976
exploration 0.5448
planetary 0.5391
missions 0.5069
launch 0.4941
telescope 0.4821
astro 0.4696
jsc 0.4549
ames 0.4515
satellite 0.446
station 0.4445
orbital 0.4438
solar 0.4386
astronomy 0.4378
observatory 0.4355
facility 0.4325
propulsion 0.4251
aerospace 0.4226