我正在尝试使用潜在狄利克雷分配来进行主题消歧和分配,我正在寻求建议。
- 哪个程序是“最好的”,其中最好的是最容易使用、最好的先验估计、快速的组合
- 我如何结合我对话题性的直觉。假设我认为我知道语料库中的某些项目确实属于同一类别,就像同一作者的所有文章一样。我可以将其添加到分析中吗?
- 在开始之前我应该知道任何意想不到的陷阱或提示吗?
我更喜欢任何程序都有 R 或 Python 前端,但我希望(并接受)我将处理 C。
我正在尝试使用潜在狄利克雷分配来进行主题消歧和分配,我正在寻求建议。
我更喜欢任何程序都有 R 或 Python 前端,但我希望(并接受)我将处理 C。
http://mallet.cs.umass.edu/恕我直言,是目前最棒的即插即用 LDA 包。它使用 Gibbs 采样来估计主题,并且具有非常简单的命令行界面和许多额外的铃声-n-whistle(一些更复杂的模型,超参数优化等)
最好让算法完成它的工作。可能有 LDA(和 pLSI 等)的变体,可以让你做一些半监督的事情。我目前不知道。
我发现删除停用词和其他非常高频的词似乎大大提高了我的主题的质量(通过查看每个主题的热门词来评估,而不是任何严格的指标)。我猜词干/词形还原会有所帮助出色地。
您提到了对 R 的偏好,您可以使用两个包topicmodels(慢)或lda(快)。Python 有deltaLDA、pyLDA、Gensim等。
具有指定主题或单词的主题建模是开箱即用的,David Andrzejewski有一些 Python 代码似乎可以做到这一点。这里有监督 LDA 的 C++ 实现。还有大量关于相关方法的论文(DiscLDA,Labeled LDA但不是易于使用的形式,无论如何对我来说......
正如@adi92 所说,删除停用词、空格、数字、标点符号和词干都会大大改善情况。一个可能的陷阱是主题数量错误(或不适当)。目前,对于给定大小的语料库有多少主题是最佳的等,没有直接的诊断方法。在 MALLET 中有一些主题质量度量(最快),非常方便。
除了通常的 来源之外,似乎最活跃的讨论领域是在主题模型列表服务器上。根据我最初的调查,最容易理解的包是LDA Matlab 包。
这根本不是轻量级的东西,所以很难在上面找到好的资源我并不感到惊讶。
对于这种分析,我使用了 LingPipe:http ://alias-i.com/lingpipe/index.html 。它是一个开源的 Java 库,我直接使用或移植了其中的一部分。要合并您自己的数据,您可以结合使用分类器,例如朴素贝叶斯。我在统计 nlp 方面的经验是有限的,但它通常遵循设置分类器、训练、查看结果、调整的循环。
i second that. Mallet's lda uses a sparselda data structure and distributed learning, so its v fast. switching on hyperparameter optimization will give a better result, imo.
def plot_top_words(model, feature_names, n_top_words, title):
fig, axes = plt.subplots(2, 5, figsize=(30, 15), sharex=True)
axes = axes.flatten()
for topic_idx, topic in enumerate(model.components_):
top_features_ind = topic.argsort()[:-n_top_words - 1:-1]
top_features = [feature_names[i] for i in top_features_ind]
weights = topic[top_features_ind]
ax = axes[topic_idx]
ax.barh(top_features, weights, height=0.7)
ax.set_title(f'Topic {topic_idx +1}',
fontdict={'fontsize': 30})
ax.invert_yaxis()
ax.tick_params(axis='both', which='major', labelsize=20)
for i in 'top right left'.split():
ax.spines[i].set_visible(False)
fig.suptitle(title, fontsize=40)
plt.subplots_adjust(top=0.90, bottom=0.05, wspace=0.90, hspace=0.3)
plt.show()