Gensim - Tạo mô hình LDA Mallet
Chương này sẽ giải thích Mô hình phân bổ tiềm ẩn Dirichlet (LDA) là gì và cách tạo mô hình tương tự trong Gensim.
Trong phần trước chúng ta đã triển khai mô hình LDA và lấy chủ đề từ các tài liệu của tập dữ liệu 20Newsgroup. Đó là phiên bản sẵn có của thuật toán LDA của Gensim. Ngoài ra còn có phiên bản Mallet của Gensim, cung cấp chất lượng chủ đề tốt hơn. Ở đây, chúng tôi sẽ áp dụng LDA của Mallet trên ví dụ trước mà chúng tôi đã triển khai.
Mô hình LDA Mallet là gì?
Mallet, một bộ công cụ mã nguồn mở, được viết bởi Andrew McCullum. Về cơ bản, nó là một gói dựa trên Java được sử dụng cho NLP, phân loại tài liệu, phân cụm, mô hình hóa chủ đề và nhiều ứng dụng học máy khác cho văn bản. Nó cung cấp cho chúng tôi bộ công cụ Mallet Topic Modeling chứa các triển khai hiệu quả, dựa trên lấy mẫu của LDA cũng như LDA phân cấp.
Mallet2.0 là bản phát hành hiện tại từ MALLET, bộ công cụ lập mô hình chủ đề java. Trước khi bắt đầu sử dụng nó với Gensim cho LDA, chúng ta phải tải xuống gói mallet-2.0.8.zip trên hệ thống của mình và giải nén nó. Sau khi cài đặt và giải nén, hãy đặt biến môi trường% MALLET_HOME% thành điểm đến thư mục MALLET theo cách thủ công hoặc bằng mã mà chúng tôi sẽ cung cấp, trong khi triển khai LDA với Mallet tiếp theo.
Gensim Wrapper
Python cung cấp trình bao bọc Gensim cho Phân bổ Dirichlet tiềm ẩn (LDA). Cú pháp của trình bao bọc đó làgensim.models.wrappers.LdaMallet. Mô-đun này, lấy mẫu gibbs thu gọn từ MALLET, cho phép ước tính mô hình LDA từ kho dữ liệu đào tạo và suy luận về phân phối chủ đề trên các tài liệu mới, chưa nhìn thấy.
Ví dụ triển khai
Chúng tôi sẽ sử dụng LDA Mallet trên mô hình LDA đã xây dựng trước đó và sẽ kiểm tra sự khác biệt về hiệu suất bằng cách tính điểm Coherence.
Cung cấp Đường dẫn đến Tệp Mallet
Trước khi áp dụng mô hình Mallet LDA trên kho dữ liệu được xây dựng trong ví dụ trước, chúng ta phải cập nhật các biến môi trường và cung cấp đường dẫn cho tệp Mallet. Nó có thể được thực hiện với sự trợ giúp của mã sau:
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.
Sau khi chúng tôi cung cấp đường dẫn đến tệp Mallet, bây giờ chúng tôi có thể sử dụng nó trên kho tài liệu. Nó có thể được thực hiện với sự giúp đỡ củaldamallet.show_topics() chức năng như sau -
ldamallet = gensim.models.wrappers.LdaMallet(
mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))
Đầu ra
[
(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)])
]
Đánh giá phần thể hiện
Bây giờ chúng ta cũng có thể đánh giá hiệu suất của nó bằng cách tính điểm mạch lạc như sau:
ldamallet = gensim.models.wrappers.LdaMallet(
mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))
Đầu ra
Coherence Score: 0.5842762900901401