本文重在模型代碼運行部分~
附上Github鏈接:xiaohuiyan / BTM
如果在linux環境下,代碼包含 運行示例:
$ cd script
$ sh runExample.sh
windows下可分4步:
第1步: 爲文檔中的單詞建立索引
id從0號開始
python script/indexDocs.py <doc_pt> <dwid_pt> <voca_pt>
<doc_pt> 輸入要索引的文檔,每行是一個文檔,格式爲 “word word…”
<dwid_pt> 輸出文檔索引,每行都是一個格式爲 “wordId wordId…” 的文檔
<voca_pt> 輸出詞彙文件,每行是一個 “wordId word” 格式的單詞
比如:(進入script路徑下)
python indexDocs.py api_decs_NN_top10.txt dwid_pt.txt voca_pt.txt
但直接運行可能會報錯,因爲文件的讀寫編碼,所以要改寫下script/indexDocs.py
n(w)爲2422
第2步: 主題學習
首先要生成btm.exe文件
我安裝的是codeblocks,先設置環境變量“CodeBlocks\MinGW\bin”,再進行g++編譯。進入src路徑下:
g++ .\infer.cpp .\model.cpp .\main.cpp -o btm
運行:
$ ./src/btm est <K> <W> <alpha> <beta> <n_iter> <save_step> <docs_pt> <model_dir>
<K> int型,主題數
<W> int型,詞彙量大小,應爲<voca_pt>文件的行數~
<alpha> double型,P(z) 的對稱Dirichlet先驗,如1
<beta> double型,P(w|z) 的對稱Dirichlet先驗,如0.01
<n_iter> int型,Gibbs抽樣的迭代次數
<save_step> int型,保存結果的步驟
<docs_pt> string型,訓練文檔的路徑
<model_dir> string型,輸出目錄
運行樣例:
.\btm.exe est 10 2422 1 0.01 200 501 ..\script\dwid_pt.txt .\result\
結果將被寫入目錄 “model_dir”:
- k10.pw_z:P(w | z)的 K * M 矩陣,假設K = 10
- k10.pz:P(z)的 K * 1 矩陣,假設K = 10
第3步:推斷文檔的主題比例,即P(z|d)
$ ./src/btm inf <type> <K> <docs_pt> <model_dir>
<type> string型,4種選擇:sum_w, sum_b, lda, mix. sum_b
<docs_pt> string型,要推斷的文檔路徑(前面生成的“dwid_pt.txt”)
如:
.\btm.exe inf sum_b 10 ..\script\dwid_pt.txt .\result\
結果將輸出到 “model_dir”:
- k10.pz_d:P(z | d) 的 N*K 矩陣,假設K = 10
第4步:結果顯示
說明主題的主題詞及其在集合中的比例
python script/topicDisplay.py <model_dir> <K> <voca_pt>
<model_dir> BTM的輸出目錄
<voca_pt> 詞彙表文件
可能會出錯:編碼問題
Traceback (most recent call last):
File ".\topicDisplay.py", line 48, in <module>
voca = read_voca(voca_pt)
File ".\topicDisplay.py", line 12, in read_voca
for l in open(pt):
UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 5363: illegal multibyte sequence
修改對應地方的編碼爲utf-8
如果感覺參數含義不清楚,多看看 “BTM-master\script” 路徑下的 runExample.sh
運行示例:進入script路徑下
python .\topicDisplay.py ..\src\NN\ 10 .\voca_pt.txt