在我对主题建模的持续探索中,我遇到了The Programming Historian博客,以及一篇文章,展示了如何使用Java库槌 从主题集衍生主题 。
博客上的说明使安装和运行变得非常容易,但是与我使用的其他库一样,您必须指定文集包含多少个主题。 我不确定要选择什么值,但是作者提出以下建议:
您如何知道要搜索的主题数? 是否有自然而然的话题? 我们发现,必须运行带有不同数量主题的火车主题,以查看合成文件如何分解。 如果我们最终将大部分原始文本都包含在非常有限的主题中,那么我们认为这是我们需要增加主题数量的信号。 设置太粗糙了。
搜索的方式有很多,包括使用MALLETs hlda命令,但是对于本教程的读者来说,循环进行多次迭代可能会更快一些(但更多信息请参见Griffiths,TL,&Steyvers,M.( 2004)。 寻找科学主题 。国家科学院院刊,101,5228-5235)。
由于我还没有时间深入研究论文或探讨如何在短槌中使用适当的选项,所以我想我会对停用词和主题数进行一些改动,看看结果如何。
据我了解,其想法是尝试使主题均匀分布->文档,即我们不希望所有文档都具有相同的主题,否则我们进行的任何主题相似度计算都不会那么有趣。
我试过用10、15、20和30个主题运行槌,还改变了所用的停用词。 我有一个版本只剥离了主要字符和“旁白”一词,而另一个版本中,我按出现次数和出现次数少于10次的词都剔除了前20%的单词。
这样做的原因是,它应该比TF / IDF更好地识别情节中的有趣短语,而不仅仅是在整个语料库中选择最受欢迎的单词。
我从命令行使用了槌,然后将其分为两个部分运行。
- 产生模型
- 根据超参数计算主题和文档的分配
我写了一个脚本来帮助我:
#!/bin/sh
train_model() {
./mallet-2.0.7/bin/mallet import-dir \
--input mallet-2.0.7/sample-data/himym \
--output ${2} \
--keep-sequence \
--remove-stopwords \
--extra-stopwords ${1}
}
extract_topics() {
./mallet-2.0.7/bin/mallet train-topics \
--input ${2} --num-topics ${1} \
--optimize-interval 20 \
--output-state himym-topic-state.gz \
--output-topic-keys output/himym_${1}_${3}_keys.txt \
--output-doc-topics output/himym_${1}_${3}_composition.txt
}
train_model "stop_words