英語、한국어。
Tomotopyは、C ++で書かれたギブスサンプリングベースのトピックモデルライブラリであるTomoto(トピックモデリングツール)のPython拡張です。速度を最大化するために、最新のCPUのベクトル化を利用します。トモトの現在のバージョンは、
詳細については、https://bab2min.github.io/tomotopyにアクセスしてください。
PIPを使用してTomoTopyを簡単にインストールできます。 (https://pypi.org/project/tomotopy/)
$ PIPインストール - アップグレードPIP $ pipインストールtomotopy
サポートされているOSおよびPythonバージョンは次のとおりです。
インストール後、インポートするだけでトモトピーを開始できます。
TPとしてトモトピーをインポートします print(tp.isa)# 'avx2'、 'avx'、 'sse2'または 'none' prints 'avx2'、 'sse2'、
現在、Tomotopyは、パフォーマンスを最大化するためにAVX2、AVX、またはSSE2 SIMD命令セットを活用できます。パッケージがインポートされると、利用可能な命令セットを確認し、最適なオプションを選択します。 TP.ISAが何も言わない場合、トレーニングの反復には時間がかかる場合があります。しかし、現代のIntelまたはAMD CPUのほとんどはSIMD命令セットを提供するため、SIMD加速度は大きな改善を示す可能性があります。
「sample.txt」ファイルからのテキストの単純なLDAトレーニングのサンプルコードを次に示します。
TPとしてトモトピーをインポートします
mdl = tp.ldamodel(k = 20)
Open( 'sample.txt')のラインの場合:
mdl.add_doc(line.strip()。split())
範囲のIの場合(0、100、10):
mdl.train(10)
print( 'iteration:{} tlog-likelihood:{}'。形式(i、mdl.ll_per_word))
範囲(mdl.k)のkの場合:
印刷( 'トピックのトップ10ワード#{}'。フォーマット(k))
print(mdl.get_topic_words(k、top_n = 10))
mdl.summary()
トモトピーは、崩壊したギブスサンプリング(CGS)を使用して、トピックの分布と単語の分布を推測します。一般に、CGSは、GensimのLdamodelが使用する変分ベイズ(VB)よりもゆっくりと収束しますが、その反復ははるかに速く計算できます。さらに、TomotopyはSIMD命令セットを備えたマルチコアCPUを利用することができます。これにより、繰り返しが速くなる可能性があります。
次のチャートは、TomotopyとGensimの間のLDAモデルの実行時間の比較を示しています。入力データは、1,506,966語(約10.1 MB)の英語ウィキペディアからの1000のランダムドキュメントで構成されています。 Tomotopyは200回の反復を訓練し、Gensim Trains 10 Iterations。
Intel I5-6600、X86-64(4コア)のパフォーマンス
Intel Xeon E5-2620 V4、X86-64(8コア、16スレッド)のパフォーマンス
Tomotopyは20倍多く繰り返されましたが、全体的な実行時間はGensimの5〜10倍高速でした。そして、それは安定した結果をもたらします。
CGSとVBを完全に異なる技術であるため、直接比較することは困難です。しかし、実用的な観点からは、速度と結果を比較することができます。次のチャートは、2つのモデルの結果の単語ごとの対数尤度を示しています。
SIMD命令セットは、パフォーマンスに大きな影響を与えます。以下は、SIMD命令セットの比較です。
幸いなことに、最近のX86-64 CPUのほとんどはAVX2命令セットを提供するため、AVX2のパフォーマンスを楽しむことができます。
Tomotopyは、各トピックモデルクラスに保存およびロード方法を提供するため、いつでもモデルをファイルに保存し、ファイルから再ロードできます。
TPとしてトモトピーをインポートします
mdl = tp.hdpmodel()
Open( 'sample.txt')のラインの場合:
mdl.add_doc(line.strip()。split())
範囲のIの場合(0、100、10):
mdl.train(10)
print( 'iteration:{} tlog-likelihood:{}'。形式(i、mdl.ll_per_word))
#ファイルに保存します
mdl.save( 'sample_hdp_model.bin')
#ファイルから読み込みます
mdl = tp.hdpmodel.load( 'sample_hdp_model.bin')
範囲(mdl.k)のkの場合:
そうでない場合、mdl.is_live_topic(k):続行します
印刷( 'トピックのトップ10ワード#{}'。フォーマット(k))
print(mdl.get_topic_words(k、top_n = 10))
#保存されたモデルはHDPモデルです。
#したがって、LDAモデルでロードすると、例外が発生します
mdl = tp.ldamodel.load( 'sample_hdp_model.bin')
ファイルからモデルをロードすると、ファイルのモデルタイプはメソッドのクラスと一致する必要があります。
詳細については、tomotopy.ldamodel.saveおよびtomotopy.ldamodel.loadメソッドを参照してください。
V0.13.0以降、インタラクティブビューアを使用したモデリングの結果を確認できます。
TPとしてトモトピーをインポートします モデル= tp.ldamodel(...) #...いくつかのトレーニングコード... tp.viewer.open_viewer(model、host = "localhost"、port = 9999) #そしてhttp:// localhost:9999をWebブラウザーで開きます!
保存されたモデルファイルがある場合は、次のコマンドラインを使用することもできます。
python -m tomotopy.viewer a_trained_model.bin - host localhost -port 9999
詳細については、Tomotopy.Viewerモジュールをご覧ください。
2つの主要な目的でトピックモデルを使用できます。基本的なものは、訓練されたモデルの結果として一連のドキュメントからトピックを発見することであり、より高度なものは、訓練されたモデルを使用して、目に見えないドキュメントのトピック分布を推測することです。
以前の目的(モデルトレーニングに使用)でドキュメントをモデルのドキュメントとして、後の目的のドキュメント(トレーニング中に目に見えないドキュメント)をモデルの外出文書として指定しました。
Tomotopyでは、これら2つの異なる種類のドキュメントが異なる方法で生成されます。モデルのドキュメントは、 tomotopy.ldamodel.add_docメソッドによって作成できます。 add_docは、tomotopy.ldamodel.trainが起動する前に呼び出すことができます。言い換えれば、Trainが電話をかけた後、Add_Docはトレーニングに使用されるドキュメントのセットが固定されているため、モデルにドキュメントを追加できません。
作成されたドキュメントのインスタンスを取得するには、次のようなtomotopy.ldamodel.docsを使用する必要があります。
mdl = tp.ldamodel(k = 20) idx = mdl.add_doc(words) IDX <0の場合:RuntimeErrorを上げる( "ドキュメントの追加に失敗しました") doc_inst = mdl.docs [idx] #doc_instは、追加されたドキュメントのインスタンスです
モデルからのドキュメントは、 tomotopy.ldamodel.make_docメソッドによって生成されます。 make_docは、列車の開始後にのみ呼び出すことができます。トレーニングに使用されるドキュメントのセットが修正される前にmake_docを使用すると、誤った結果が得られる場合があります。 make_docはインスタンスを直接返すため、他の操作にその返品値を使用できます。
mdl = tp.ldamodel(k = 20) #add_doc ... mdl.train(100) doc_inst = mdl.make_doc(unseen_doc)#doc_instは目に見えないドキュメントのインスタンスです
新しいドキュメントがtomotopy.ldamodel.make_docによって作成されている場合、そのトピック分布はモデルによって推測できます。目に見えないドキュメントの推論は、tomotopy.ldamodel.inferメソッドを使用して実行する必要があります。
mdl = tp.ldamodel(k = 20) #add_doc ... mdl.train(100) doc_inst = mdl.make_doc(unseen_doc) topic_dist、ll = mdl.infer(doc_inst) print( "目に見えないドキュメントのトピック分布:"、topic_dist) print( "推論のlog-likelihood:"、ll)
推測方法は、Tomotopy.Documentの1つのインスタンスまたはTomotopy.Documentのインスタンスのリストのみを推測できます。詳細については、tomotopy.ldamodel.inferをご覧ください。
Tomotopyのすべてのトピックモデルには、独自の内部ドキュメントタイプがあります。ドキュメントを作成して、各モデルのADD_DOCメソッドを介して各モデルに適したものに追加できます。ただし、異なるモデルに同じドキュメントのリストを異なるモデルに追加しようとすることは非常に不便になります。これは、それぞれの異なるモデルに同じドキュメントのリストを求める必要があるためです。したがって、Tomotopyは、ドキュメントのリストを保持するTomotopy.utils.corpusクラスを提供します。 tomotopy.utils.corpusは、各モデルの__init__またはadd_corpusメソッドに引数corpusとして渡すことにより、任意のモデルに挿入できます。したがって、Tomotopy.utils.corpusを挿入することは、コーパスが保持している文書を挿入するのと同じ効果を持っています。
一部のトピックモデルでは、ドキュメントに異なるデータが必要です。たとえば、tomotopy.dmrmodelにはstrタイプの引数メタデータが必要ですが、tomotopy.pldamodelはリスト[str]タイプの引数ラベルが必要です。 Tomotopy.utils.corpusは特定のトピックモデルに縛られるのではなく、独立したドキュメントセットを保持しているため、トピックモデルに必要なデータ型は、コーパスがそのトピックモデルに追加されると一貫性がありません。この場合、その他のデータを変換して、引数変換を使用してターゲットトピックモデルに適合することができます。詳細については、次のコードをご覧ください。
Tomotopy Import dmrmodelから
Tomotopy.utilsインポートコーパスから
corpus = corpus()
corpus.add_doc( "abcde" .split()、a_data = 1)
corpus.add_doc( "efghi" .split()、a_data = 2)
corpus.add_doc( "ijklm" .split()、a_data = 3)
モデル= dmrmodel(k = 10)
model.add_corpus(コーパス)
#あなたは「コーパス」で「a_data」フィールドを失います、
#および「dmrmodel」が必要とする「メタデータ」は、デフォルト値、空のstrで満たされています。
assert model.docs [0] .metadata == ''
assert model.docs [1] .metadata == ''
assert model.docs [2] .metadata == ''
def transform_a_data_to_metadata(その他:dict):
return {'metadata':str(misc ['a_data'])}
#この関数は、「a_data」を「メタデータ」に変換します
モデル= dmrmodel(k = 10)
model.add_corpus(corpus、transform = transform_a_data_to_metadata)
#「モデル」のドキュメントには、「a_data」フィールドから生成された非デフォルト「メタデータ」があります。
assert model.docs [0] .metadata == '1'
assert model.docs [1] .metadata == '2'
assert model.docs [2] .metadata == '3'
バージョン0.5.0以降、Tomotopyを使用すると、並列性アルゴリズムを選択できます。 0.4.2より前のバージョンで提供されているアルゴリズムは、すべてのトピックモデルに提供されるCopy_Mergeです。 0.5.0から利用可能な新しいアルゴリズムパーティションは、トレーニングを一般的により速く、よりメモリ効率の高いものにしますが、すべてのトピックモデルではありません。
次のチャートは、トピックの数と労働者の数に基づいて、2つのアルゴリズムの速度差を示しています。
バージョンごとのパフォーマンスの変更は、次のグラフに示されています。 1000回の反復でLDAモデルトレインを実行するのにかかる時間を測定しました。 (Docs:11314、Vocab:60382、Words:2364724、Intel Xeon Gold 5120 @2.2GHz)
バージョン0.6.0以降、新しい方法tomotopy.ldamodel.set_word_priorが追加されました。これにより、各トピックに対して以前の単語を制御できます。たとえば、トピック0の「教会」という言葉の重みを1.0に設定し、次のコードで残りのトピックで0.1に重みを設定できます。これは、「教会」という単語がトピック0に割り当てられる確率が、別のトピックに割り当てられる確率よりも10倍高いことを意味します。したがって、「教会」のほとんどはトピック0に割り当てられているため、トピック0には「教会」に関連する多くの単語が含まれています。これにより、いくつかのトピックを操作して、特定のトピック番号に配置できます。
TPとしてトモトピーをインポートします mdl = tp.ldamodel(k = 20) #ドキュメントを「mdl」に追加します #単語を設定します mdl.set_word_prior( 'Church'、[1.0 if k == 0 else 0.1 in range(20)]))
詳細については、example.pyのword_prior_exampleを参照してください。
https://github.com/bab2min/tomotopy/blob/main/examples/で、TomotopyのPythonコードの例を見つけることができます。
https://drive.google.com/file/d/18opnijd4iwpyyz2o7pqopyetakexa71j/viewのサンプルコードで使用されるデータファイルを取得することもできます。
TomotopyはMITライセンスの条件に基づいてライセンスされています。つまり、合理的な目的のために使用し、作成したすべてのドキュメントの完全な所有権を維持できます。
@software {minchul_lee_2022_6868418、
著者= {Minchul Lee}、
title = {bab2min/tomotopy:0.12.3}、
月= 7月、
年= 2022、
Publisher = {Zenodo}、
バージョン= {v0.12.3}、
doi = {10.5281/zenodo.6868418}、
url = {https://doi.org/10.5281/zenodo.6868418}
}