英語,한국어。
Tomotopy是Tomoto(主題建模工具)的Python擴展,它是基於吉布斯採樣的主題模型庫,編寫了C ++。它利用現代CPU的矢量化來最大化速度。當前版本的Tomoto支持幾個主要主題模型,包括
請訪問https://bab2min.github.io/tomotopy,以查看更多信息。
您可以使用PIP輕鬆安裝上述過程。 (https://pypi.org/project/tomotopy/)
$ pip安裝 - 升級PIP $ pip安裝上交
支持的OS和Python版本是:
安裝後,您可以通過導入啟動上交。
導入上調作為TP 打印(tp.isa)#打印'avx2','avx','sse2'或'none'
當前,Tomotopy可以利用AVX2,AVX或SSE2 SIMD指令集以最大化性能。導入軟件包時,它將檢查可用的指令集並選擇最佳選項。如果TP.ISA沒有說,培訓的迭代可能需要很長時間。但是,由於大多數現代英特爾或AMD CPU都提供SIMD指令集,因此SIMD加速可能會顯示出很大的進步。
這是一個示例代碼,可簡單地從“ sample.txt”文件中對文本進行簡單培訓。
導入上調作為TP
mdl = tp.ldamodel(k = 20)
對於打開的行('sample.txt'):
mdl.add_doc(line.strip()。split())
對於我的範圍(0、100、10):
MDL.Train(10)
print('迭代:{} tlog-likelihoodhieny:{}'。格式(i,mdl.ll_per_word))
對於K範圍(MDL.K):
print('主題#{}'的十大單詞。格式(k))
打印(mdl.get_topic_words(k,top_n = 10))
mdl.summary()
Tomotopy使用崩潰的吉布斯採樣(CGS)來推斷主題的分佈和單詞的分佈。通常,CGS比Gensim的LDamodel使用的變異貝葉斯(VB)更慢,但是可以將其迭代計算得更快。此外,Thmotopy可以使用SIMD指令集利用多核CPU,這可能會導致更快的迭代。
以下圖表顯示了LDA模型在上述過程和Gensim之間的運行時間的比較。輸入數據由1000個來自英語Wikipedia的隨機文檔組成,其中包含1,506,966個單詞(約10.1 MB)。 Tomotopy訓練200次迭代和Gensim訓練10次迭代。
Intel i5-6600,X86-64(4核)的性能
Intel Xeon E5-2620 V4中的性能
儘管上音迭代多20倍,但總運行時間比Gensim快5至10倍。它產生穩定的結果。
很難直接比較CGS和VB,因為它們是完全不同的技術。但是從實際的角度來看,我們可以比較它們之間的速度及其結果。以下圖表顯示了兩個模型結果的日誌樣式。
SIMD指令集對性能有很大的影響。以下是SIMD指令集之間的比較。
幸運的是,最近的X86-64 CPU中的大多數CPU都提供AVX2指令集,因此我們可以享受AVX2的性能。
Tomotopy為每個主題模型類提供保存和加載方法,因此您可以隨時將模型保存到文件中,並將其從文件中重新加載。
導入上調作為TP
mdl = tp.hdpmodel()
對於打開的行('sample.txt'):
mdl.add_doc(line.strip()。split())
對於我的範圍(0、100、10):
MDL.Train(10)
print('迭代:{} tlog-likelihoodhieny:{}'。格式(i,mdl.ll_per_word))
#保存到文件中
mdl.save('sample_hdp_model.bin')
#從文件加載
mdl = tp.hdpmodel.load('sample_hdp_model.bin')
對於K範圍(MDL.K):
如果不是mdl.is_live_topic(k):繼續
print('主題#{}'的十大單詞。格式(k))
打印(mdl.get_topic_words(k,top_n = 10))
#保存的模型是HDP模型,
#因此,當您通過LDA型號加載它時,它將引起異常
mdl = tp.ldamodel.load('sample_hdp_model.bin')
當您從文件加載模型時,文件中的模型類型應與方法類匹配。
請參閱tomotopy.ldamodel.save and tomotopy.ldamodel.load方法的更多信息。
您可以看到自V0.13.0以來使用交互式查看器建模的結果。
導入上調作為TP 型號= tp.ldamodel(...) #...一些培訓代碼... tp.viewer.open_viewer(模型,host =“ localhost”,port = 9999) #並打開http:// localhost:9999在您的Web瀏覽器中!
如果您有保存的模型文件,也可以使用以下命令行。
Python -M Tomotopy.Viewer A_TRAIND_MODEL.BIN-主機主機-Port 9999
請參閱Tomotopy.Ciewer模塊的更多信息。
我們可以將主題模型用於兩個主要目的。基本的是,由於訓練有素的模型,從一組文檔中發現主題,而更先進的是通過使用訓練有素的模型來推斷不見文檔的主題分佈。
我們將文檔命名為以前的目的(用於模型培訓)為模型中的文檔,而該文檔則將文檔(在培訓期間看不見的文檔)作為模型中的文檔。
在上述過程中,這兩種不同類型的文檔的生成不同。模型中的文檔可以通過tomotopy.ldamodel.add_doc方法創建。可以在tomotopy.ldamodel.Train開始之前調用add_doc。換句話說,在火車調用後,add_doc無法將文檔添加到模型中,因為用於培訓的文檔集已固定。
要獲取創建文檔的實例,您應該使用tomotopy.ldamodel.docs,例如:
mdl = tp.ldamodel(k = 20) idx = mdl.add_doc(單詞) 如果IDX <0:提高RuntimeError(“無法添加DOC”) 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) 打印(“看不見文檔的主題分發:”,topic_dist) 打印(“推理的log-likelione:”,LL)
推斷方法只能推斷出一個thmotopy的實例。文檔或tomotopy.document的實例列表。請參閱tomotopy.ldamodel.infer的更多信息。
上交中的每個主題模型都有其自己的內部文檔類型。可以通過每個模型的add_doc方法創建文檔並將其添加到適合每個模型中。但是,嘗試在不同模型中添加相同的文檔列表變得非常不便,因為應要求add_doc列出每個不同模型的文檔列表。因此,Tomotopy提供了Tomotopy.utils.utils.corpus類,其中包含文檔列表。 tomotopy.utils.corpus可以通過將作為參數語料庫傳遞到__init__或每個模型的add_corpus方法來插入任何模型。因此,插入thmotopy.utils.corpus只是插入語料庫所包含的文檔的效果相同。
某些主題模型需要不同的文檔數據。例如,tomotopy.dmrmodel需要str類型中的參數元數據,但是tomotopy.pldamodel需要列表中的參數標籤[str]類型。由於tomotopy.utils.corpus擁有一組獨立的文檔,而不是與特定主題模型相關聯,因此當將語料庫添加到該主題模型中時,主題模型所需的數據類型可能是不一致的。在這種情況下,可以使用參數轉換將其他數據轉換為擬合目標主題模型。在以下代碼中查看更多詳細信息:
從上交dmrmodel中
來自thmotopy.utils進口語料庫
語料庫= copus()
corpus.add_doc(“ abcde” .split(),a_data = 1)
corpus.add_doc(“ efghi” .split(),a_data = 2)
colpus.add_doc(“ ijklm” .split(),a_data = 3)
型號= dmrmodel(k = 10)
model.add_corpus(copus)
#你在`
#和`dmrmodel'要求的元數據中填充了默認值為空str。
assert model.docs [0] .metadata =='''
assert model.docs [1] .metadata =='''
assert model.docs [2] .metadata =='''
def transform_a_data_to_metadata(MISC:dict):
返回{'metadata':str(misc ['a_data'])}}
#此函數將`a_data``變成'元數據了
型號= dmrmodel(k = 10)
model.Add_corpus(copus,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.5,因此允許您選擇平行算法。在0.4.2之前以版本提供的算法是Copy_merge,該算法為所有主題模型提供。自0.5.0以來可用的新算法分區通常可以使培訓通常更快,更高,但並非所有主題模型都可以使用。
以下圖表顯示了基於主題數量和工人數量的兩種算法之間的速度差。
以下圖中顯示了按版本進行的性能更改。測量了使用1000次迭代運行LDA型號的時間。 (文檔:11314,詞彙:60382,單詞:2364724,英特爾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' #設置Word先驗 mdl.set_word_prior('church',[1.0如果k == 0 else 0 0.1,範圍內的k(20)))))
有關更多詳細信息,請參見example.py中的word_prior_example。
您可以在https://github.com/bab2min/tomotopy/blob/main/main/examples/上找到python tomotopy的示例。
您還可以在https://drive.google.com/file/d/18opnijd4iwpyyz2o7pqopyetakexa71j/view中獲取示例代碼中使用的數據文件。
Thmotopy是根據MIT許可條款獲得許可的,這意味著您可以將其用於任何合理目的,並保留所有您生產的文檔的完全所有權。
@software {minchul_lee_2022_6868418,
作者= {minchul lee},
title = {bab2min/thmotopy:0.12.3},,
月份= 7月,
年= 2022,
publisher = {zenodo},
版本= {v0.12.3},
doi = {10.5281/zenodo.6868418},
url = {https://doi.org/10.5281/zenodo.6868418}
}