Gensim-LDAマレットモデルの作成

この章では、潜在的ディリクレ割り当て(LDA)マレットモデルとは何か、およびGensimで同じモデルを作成する方法について説明します。

前のセクションでは、LDAモデルを実装し、20Newsgroupデータセットのドキュメントからトピックを取得しました。これは、GensimのLDAアルゴリズムの組み込みバージョンでした。Gensimのマレットバージョンもあり、トピックの品質が向上します。ここでは、すでに実装した前の例にマレットのLDAを適用します。

LDAマレットモデルとは何ですか?

オープンソースのツールキットであるMalletは、AndrewMcCullumによって作成されました。これは基本的にJavaベースのパッケージであり、NLP、ドキュメント分類、クラスタリング、トピックモデリング、およびテキストに対する他の多くの機械学習アプリケーションに使用されます。これは、LDAと階層型LDAの効率的なサンプリングベースの実装を含むMallet TopicModelingツールキットを提供します。

Mallet2.0は、JavaトピックモデリングツールキットであるMALLETからの現在のリリースです。Gensim for LDAで使用を開始する前に、システムにmallet-2.0.8.zipパッケージをダウンロードして解凍する必要があります。インストールして解凍したら、環境変数%MALLET_HOME%を手動または提供するコードでMALLETディレクトリを指すように設定し、次にマレットでLDAを実装します。

ゲンシムラッパー

Pythonは、潜在的ディリクレ割り当て(LDA)用のGensimラッパーを提供します。そのラッパーの構文は次のとおりです。gensim.models.wrappers.LdaMallet。このモジュールは、MALLETからの折りたたまれたギブスサンプリングであり、トレーニングコーパスからのLDAモデルの推定と、新しい未表示のドキュメントのトピック分布の推論を可能にします。

実装例

以前に構築されたLDAモデルでLDAマレットを使用し、コヒーレンススコアを計算してパフォーマンスの違いを確認します。

マレットファイルへのパスの提供

前の例で作成したコーパスにMalletLDAモデルを適用する前に、環境変数を更新し、Malletファイルのパスも指定する必要があります。それは次のコードの助けを借りて行うことができます-

import os
from gensim.models.wrappers import LdaMallet
os.environ.update({'MALLET_HOME':r'C:/mallet-2.0.8/'}) 
#You should update this path as per the path of Mallet directory on your system.
mallet_path = r'C:/mallet-2.0.8/bin/mallet' 
#You should update this path as per the path of Mallet directory on your system.

マレットファイルへのパスを指定すると、コーパスで使用できるようになります。それはの助けを借りて行うことができますldamallet.show_topics() 次のように機能します-

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

出力

[
   (4,
   [('gun', 0.024546225966016102),
   ('law', 0.02181426826996709),
   ('state', 0.017633545129043606),
   ('people', 0.017612848479831116),
   ('case', 0.011341763768445888),
   ('crime', 0.010596684396796159),
   ('weapon', 0.00985160502514643),
   ('person', 0.008671896020034356),
   ('firearm', 0.00838214293105946),
   ('police', 0.008257963035784506)]),
   (9,
   [('make', 0.02147966482730431),
   ('people', 0.021377478029838543),
   ('work', 0.018557122419783363),
   ('money', 0.016676885346413244),
   ('year', 0.015982015123646026),
   ('job', 0.012221540976905783),
   ('pay', 0.010239117106069897),
   ('time', 0.008910688739014919),
   ('school', 0.0079092581238504),
   ('support', 0.007357449417535254)]),
   (14,
   [('power', 0.018428398507941996),
   ('line', 0.013784244460364121),
   ('high', 0.01183271164249895),
   ('work', 0.011560979224821522),
   ('ground', 0.010770484918850819),
   ('current', 0.010745781971789235),
   ('wire', 0.008399002000938712),
   ('low', 0.008053160742076529),
   ('water', 0.006966231071366814),
   ('run', 0.006892122230182061)]),
   (0,
   [('people', 0.025218349201353372),
   ('kill', 0.01500904870564167),
   ('child', 0.013612400660948935),
   ('armenian', 0.010307655991816822),
   ('woman', 0.010287984892595798),
   ('start', 0.01003226060272248),
   ('day', 0.00967818081674404),
   ('happen', 0.009383114328428673),
   ('leave', 0.009383114328428673),
   ('fire', 0.009009363443229208)]),
   (1,
   [('file', 0.030686386604212003),
   ('program', 0.02227713642901929),
   ('window', 0.01945561169918489),
   ('set', 0.015914874783314277),
   ('line', 0.013831003577619592),
   ('display', 0.013794120901412606),
   ('application', 0.012576992586582082),
   ('entry', 0.009275993066056873),
   ('change', 0.00872275292295209),
   ('color', 0.008612104894331132)]),
   (12,
   [('line', 0.07153810971508515),
   ('buy', 0.02975597944523662),
   ('organization', 0.026877236406682988),
   ('host', 0.025451316957679788),
   ('price', 0.025182275552207485),
   ('sell', 0.02461728860071565),
   ('mail', 0.02192687454599263),
   ('good', 0.018967419085797303),
   ('sale', 0.017998870026097017),
   ('send', 0.013694207538540181)]),
   (11,
   [('thing', 0.04901329901329901),
   ('good', 0.0376018876018876),
   ('make', 0.03393393393393394),
   ('time', 0.03326898326898327),
   ('bad', 0.02664092664092664),
   ('happen', 0.017696267696267698),
   ('hear', 0.015615615615615615),
   ('problem', 0.015465465465465466),
   ('back', 0.015143715143715144),
   ('lot', 0.01495066495066495)]),
   (18,
   [('space', 0.020626317374284855),
   ('launch', 0.00965716006366413),
   ('system', 0.008560244332602057),
   ('project', 0.008173097603991913),
   ('time', 0.008108573149223556),
   ('cost', 0.007764442723792318),
   ('year', 0.0076784101174345075),
   ('earth', 0.007484836753129436),
   ('base', 0.0067535595990880545),
   ('large', 0.006689035144319697)]),
   (5,
   [('government', 0.01918437232469453),
   ('people', 0.01461203206475212),
   ('state', 0.011207097828624796),
   ('country', 0.010214802708381975),
   ('israeli', 0.010039691804809714),
   ('war', 0.009436532025838587),
   ('force', 0.00858043427504086),
   ('attack', 0.008424780138532182),
   ('land', 0.0076659662230523775),
   ('world', 0.0075103120865437)]),
   (2,
   [('car', 0.041091194044470564),
   ('bike', 0.015598981291017729),
   ('ride', 0.011019688510138114),
   ('drive', 0.010627877363110981),
   ('engine', 0.009403467528651191),
   ('speed', 0.008081104907434616),
   ('turn', 0.007738270153785875),
   ('back', 0.007738270153785875),
   ('front', 0.007468899990204721),
   ('big', 0.007370947203447938)])
]

パフォーマンスの評価

これで、次のようにコヒーレンススコアを計算することでパフォーマンスを評価することもできます。

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

出力

Coherence Score: 0.5842762900901401