好的,通常主题模型(例如LDA,pLSI等)用于以无人监督的方式推断可能存在于一组文档中的主题。我想知道是否有人对如何将我的问题转变为LDA框架有任何想法,因为有很好的工具可用于解决LDA问题。
为了彻底,我将以下信息作为输入:
我想回答的问题是:对于当前文档,它的主题是什么?换句话说,对于给定的DNA片段,它最有可能来自哪个其他生物(同一物种)?可能存在突变等,因为段的交换发生,因此两个段不会相同。
这与经典LDA模型的主要区别在于我提前了解了主题。
我最初的想法是采用pLSA模型(http://en.wikipedia.org/wiki/PLSA)并且只是明确地设置主题节点,然后执行标准的EM学习(如果只有一个体面的库可以用潜在的变量来处理贝叶斯参数学习......),然后进行推理使用任何算法(这应该无关紧要,因为模型无论如何都是一个多树)。
编辑:我想我已经解决了,对于任何可能偶然发现这一点的人。我发现您可以使用带标签的LDA并将每个标签分配给每个文档。由于每个标签与主题一一对应,因此您有效地对算法说:对于每个文档,从该给定主题集(标签集)中选择主题,而不是自己编写。
为什么不简单地使用有监督的主题模型。 Jonathan Chang在R中的lda软件包具有slda功能,相当不错。还有一个非常有用的演示。只需安装软件包并运行demo(slda)即可。
我有一个类似的问题,只是想我为了完整性而添加我要使用的解决方案。
LDAesk方法:指导LDA
引导式LDA允许您为LDA类别设置单词。如果您有最终决策的n个主题,则只需创建带有n种子主题的guidedLDA算法,每个主题包含构成其主题名称的关键字。例如:我想集中到已知主题“生物化学”和“物理学”。然后我用d = {0:['biochemsitry'],1:['physics']}为我的GuidanceLDA播种。如果可以识别它们,可以合并其他引导词,但是我使用的guideLDA算法(python版本)使得识别给定主题的前n个词相对容易。您只需使用基本种子词运行一次GuidanceLDA,然后使用顶部的n-words输出来考虑添加到主题的更多单词。这些顶级的n字也可能对我提到的其他方法有所帮助。
非LDAesk方法:~KNN
我最终做的是使用单词嵌入模型(word2vec优于我的案例的替代方案),根据构成主题/子主题的单词为每个主题创建“主题向量”。例如:我有一个类别生物化学与子类别分子生物学。最基本的主题载体是生物化学,分子和生物学的word2vec载体,它们全部平均在一起。对于我想要确定主题的每个文档,我将其转换为“文档向量”(与我如何创建主题向量相同的维度和嵌入模型 - 我发现只是平均文档中的所有word2vec向量已经是经过一些预处理,如删除停用词后,到目前为止最好的解决方案)。然后我只是找到输入文档向量的k最接近的主题向量。我应该注意到,有一些能力通过改变构成主题向量的单词来调整它。可能识别其他关键字的一种方法是使用我之前提到的guidedLDA模型。
我会注意到,当我在带有标记数据的不同语料库上测试这两个解决方案时(除了评估准确性之外我没有使用),这种~KNN方法证明比GuidedLDA方法更好。