文本挖掘与主题建模工具包
tmtoolkit的Python项目详细描述
tmtoolkit–用于python的文本挖掘和主题建模工具包
马克斯·康拉德马克斯·康拉德@wzb.eu
tmtoolkit
是一组使用python进行文本挖掘和主题建模的工具。它包含文本预处理功能,如柠檬化、词干处理或词性标记,尤其是英语和德语文本。预处理通过使用计算机上所有可用的处理器并行完成。主题建模特性包括主题模型评估度量,允许并行计算具有不同参数的模型并对其进行比较(例如,为了找到最佳主题数和其他参数)。可以使用lda实现为不同的copora和/或参数集并行生成主题模型,这些实现可以来自lda,scikit学习或gensim
功能
文本预处理
- 标记化
- 词性标注(针对德语和英语进行优化)
- 元素化(针对德语和英语进行优化)
- 堵塞
- 清洁代币
- 筛选标记
- 生成n个程序
- 生成文档项矩阵
预处理通过使用计算机上所有可用的处理器并行完成,与单处理器上的顺序处理相比,大大提高了处理速度。
主题建模
可以使用lda实现为不同的copora和/或参数集并行生成主题模型,这些实现可以来自lda,scikit-learn或gensim。可以使用几种实现的度量标准对它们进行评估和比较(例如,为了找到最佳的主题数量):
- 成对余弦距离法(cao-juan等人2009年)
- kl散度法(arun等人。2010年)
- 调和平均法(格里菲斯,Steyvers,2004年)
- 被拒文件的可能性(Wallach等人2009年)
- 模型一致性(https://dl.acm.org/citation.cfm?id=2145462" rel="nofollow">mimno等人。2011年或使用gensim中实现的指标
- 在lda、sklearn或gensim中本机实现的对数似然或困惑方法
其他功能包括:
- 绘图评估结果
- 将估计的文档主题和主题词分发导出到Excel
- 将主题词分布和文档主题分布可视化为词云(请参见lda廑u visualization jupyter笔记本)
- 将主题词分布和文档主题分布可视化为热图(请参见lda戋u visualization)tion Jupyter笔记本)
- 集成pyldavis以可视化结果。
- 单个topci的一致性(请参见model撸ocherence jupyter笔记本)
安装
该包可在pypi上获得,并可通过python包管理器pip安装:
# recommended installation
pip install -U tmtoolkit[excel_export,plotting,wordclouds]
# minimal installation:
pip install -U tmtoolkit
这个包大约13MB大,因为它包含一些附加的德语模型数据,用于POS标记。
升级注意事项:如果从旧版本升级到0.6.0或更高版本,则在重新安装(使用上述命令之一)之前,需要先卸载tmtoolkit(运行pip uninstall tmtoolkit
)。
可选套餐
可以通过pip安装的pypi包被写入斜体
- 为了改进德语文本的元素化:模式
- 用于绘图/可视化:matplotlib
- 对于word cloud函数:wordcloud和枕头
- 对于Excel导出:openpyxl
- 对于主题建模,lda实现之一:lda,scikit learn或gensim
- 对于其他主题模型一致性度量:gensim
对于lda评估指标griffiths_2004
和保留文档有必要为多精度算法安装gmpy2。这反过来要求为gmp、mpfr和mpc安装一些c头库。在debian/ubuntu系统上,这是通过:
sudo apt install libgmp-dev libmpfr-dev libmpc-dev
之后,可以通过pip安装gmpy2。
因此,对于全套功能,您应该运行以下命令(如果您已经安装了上述要求,则可以选择添加gmpy2):
pip install -U Pattern matplotlib wordcloud Pillow openpyxl lda scikit-learn gensim
要求
tmtoolkit
适用于python 3.5或更高版本。
通过pip自动安装需求。对于某些用例,还可以通过pip安装其他包(请参见可选包)。
Windows用户的特别注意事项:tmtoolkit已经在Windows上进行了测试,并且运行良好(我建议在那里使用针对Python的anaconda发行版)。但是,您需要将使用多处理的所有代码(即对tmpredoc
和并行主题建模函数的所有调用)包装在if\u name=='\u main'
这样的块中:
defmain():# code with multi-processing comes here# ...if__name__=='__main__':main()
请参见示例
目录。
必需的软件包
- 努比
- scipy
- NLTK
- 熊猫
- 扑热息痛
请注意:如果您尚未安装NLTK中的几个语料库和语言模型,则需要安装这些模型。运行python-c"import nltk;nltk.download()",这将打开一个图形化的下载程序界面。您至少需要以下数据包:
平均感知器标记器
朋克
停止字
wordnet
文档
许多方法的文档目前仍然缺少,将来还会添加。现在,您应该看看下面和examples
目录中的示例。
示例
可以在ipython会话中直接运行的一些示例:
预处理
我们将处理小的,自定义的玩具语料库与德语文本。它将被标记化、清理并转换为文档术语矩阵。如果您使用的是Windows,则需要用一个if\u name\uuu='\uu main\uu'
块将其包装起来。见"SP"以上"Windows用户特别注意事项"。
fromtmtoolkit.preprocessimportTMPreproc# a small toy corpus in German, here directly defined as a dict# to load "real" (text) files use the methods in tmtoolkit.corpuscorpus={'doc1':'Ein einfaches Beispiel in einfachem Deutsch.','doc2':'Es enthält nur drei sehr einfache Dokumente.','doc3':'Die Dokumente sind sehr kurz.',}# initializepreproc=TMPreproc(corpus,language='german')# run the preprocessing pipeline: tokenize, POS tag, lemmatize, transform to# lowercase and then clean the tokens (i.e. remove stopwords)preproc.tokenize().pos_tag().lemmatize().tokens_to_lowercase().clean_tokens()print(preproc.tokens)# this will output: # {'doc1': ('einfach', 'beispiel', 'einfach', 'deutsch'),# 'doc2': ('enthalten', 'drei', 'einfach', 'dokument'),# 'doc3': ('dokument', 'kurz')}print(preproc.tokens_with_pos_tags)# this will output: # {'doc1': [('einfach', 'ADJA'),# ('beispiel', 'NN'),# ('einfach', 'ADJA'),# ('deutsch', 'NN')],# 'doc2': [('enthalten', 'VVFIN'),# ('drei', 'CARD'),# ('einfach', 'ADJA'),# ('dokument', 'NN')],# 'doc3': [('dokument', 'NN'), ('kurz', 'ADJD')]}# generate sparse DTM and print it as a data tabledoc_labels,vocab,dtm=preproc.get_dtm()importpandasaspdprint(pd.DataFrame(dtm.todense(),columns=vocab,index=doc_labels))
主题建模
我们将使用lda包进行主题建模。生成并比较了用于不同主题数和alpha值的几个模型。选择最好的并打印结果。
fromtmtoolkit.topicmodimporttm_ldaimportlda# for the Reuters datasetimportmatplotlib.pyplotaspltplt.style.use('ggplot')doc_labels=lda.datasets.load_reuters_titles()vocab=lda.datasets.load_reuters_vocab()dtm=lda.datasets.load_reuters()# evaluate topic models with different parametersconst_params=dict(n_iter=100,random_state=1)# low number of iter. just for showing how it works herevarying_params=[dict(n_topics=k,alpha=1.0/k)forkinrange(10,251,10)]# this will evaluate 25 models (with n_topics = 10, 20, .. 250) in parallelmodels=tm_lda.evaluate_topic_models(dtm,varying_params,const_params,return_models=True)# plot the results# note that since we used a low number of iterations, the plot looks quite "unstable"# for the given metrics.fromtmtoolkit.topicmod.visualizeimportplot_eval_resultsfromtmtoolkit.topicmod.evaluateimportresults_by_parameterresults_by_n_topics=results_by_parameter(models,'n_topics')plot_eval_results(results_by_n_topics)plt.show()# the peak seems to be around n_topics == 140fromtmtoolkit.topicmod.model_ioimportprint_ldamodel_topic_words,print_ldamodel_doc_topicsbest_model=dict(results_by_n_topics)[140]['model']print_ldamodel_topic_words(best_model.topic_word_,vocab)print_ldamodel_doc_topics(best_model.doc_topic_,doc_labels)
更多示例可在examples
目录中找到。
示例数据
示例/数据中提供的示例来自:
bt18_sample_1000.pickle
:offenesparlament.de- 古腾堡项目
许可证
在apache许可证2.0下获得许可的代码。请参见许可证
文件。