英语,한국어。
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}
}