缘起
从LSA到LDA、STM等主题模型,在进行潜在主题语义挖掘时都需要确定最优的主题数,早期学者们多采用困惑度(Perpelexity)指标来评价分析,但是根据困惑度值选定的主题数与人的主观判断有一定偏离,为解决这一问题,Mimno(2011)等提出了语义一致性(Semantic Coherence,SC)指标。在实际应用时存在一个问题,R语言STM包里有semantic()函数,可以针对STM构建的模型对象进行计算,但其他类型的主题模型,有没有现成的代码可以计算对应的SC值呢?
问题解决过程
经对STM包源代码的分析,发现暂时无法对LDA等模型计算SC值,除非修改源代码。
经检索,发现Python中的Gensim包可以完成这项工作,链接:https://radimrehurek.com/gensim/models/coherencemodel.html描述了计算SC值的管道操作(Pipeline)流程,共分为四步,详细说明见论文:Exploring the Space of Topic Coherence Measures,可以按此在Python中导入Gensim包展开分析。
该篇论文的一个贡献是在Mimno(2011)论文基础上又略微新增了若干衡量SC的指标,可以作为应用于中文领域的一个参考。
补充:今天(10月27日)在开发gensim的Rare technologies公司官网看到了负责Topic coherence模块开发人员Devashish Deshpande的博客(https://rare-technologies.com/author/devashish/),专门讲了SC值的管道操作(Pipeline)流程思路
什么是主题模型?一个通俗的解释
假设一个文艺小青年来看我的博客,他完全不懂算法和分词,自然也给不出具体的备选类别,有没有一种模型能够告诉这个白痴,这篇文章很可能(80%)是在讲算法,也可能(19%)是在讲分词,几乎不可能(1%)是在讲其它主题呢?
有,这样的模型就是主题模型。
词嵌入(word embedding)方法是将词语表征为N维向量,这使得语义相似(semantically similar, e.g. “king” — “monarch”) 或语义(semantically related, e.g. “bird” — “fly”) 相关的词语能够在不同的词嵌入训练方法(词语作为情境或文档作为情境)下聚集在一起。
L1正则化和L2正则化的作用体现在:
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择;
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合。
庞加莱嵌入(Poincaré embeddings)是一种对网络图中的节点表征学习的方法,将节点关系数据(如两两词语的共现)导入模型,输出精确表征节点之间距离的嵌入向量。
庞加莱嵌入向量可以捕获节点间的层级关系(notions of hierarchy)与相似关系(notions of similarity),在模型可视化输出的庞加莱圆盘图(Poincaré diskette)中,节点之间的相似关系在图中体现为越相似的节点,两者连接且紧密靠近,越不相似的节点,两者没有连接且节点遥相远离;节点之间的层级关系在图中体现为层级高的节点靠近原点,层级低的节点远离原点。
庞加莱嵌入表征的向量不是在传统的欧式空间,而是在双曲空间(hyperbolic space),在双曲空间中,节点之间的距离不是直线而是曲线,这使得树状层级结构中的节点距离可以在二维等低维空间表征。
在Gensim中使用的例子见:https://nbviewer.jupyter.org/github/RaRe-Technologies/gensim/blob/develop/docs/notebooks/Poincare%20Tutorial.ipynb