Gensim LDA主题一致性u_mass指标负值是否正常?求原理公式
关于Gensim中CoherenceModel的u_mass指标负值问题及原理解析
首先给你吃个定心丸:u_mass指标输出负值是完全正常的,甚至这才是它的常态表现,完全不需要担心你的代码或者模型出了问题。我来给你详细拆解下这个指标的来龙去脉:
一、u_mass指标的核心逻辑
u_mass是一种基于语料库内部共现统计的主题连贯性指标,它不需要依赖外部词典(不像c_v这类指标需要外部资源支撑),直接通过你输入的corpus来计算主题内词之间的关联紧密程度。简单来说,它衡量的是:主题里的词是不是经常在同一篇文档里一起出现——如果一起出现的概率越高,连贯性得分就越接近正值;如果词之间关联很弱,得分就会偏向负值。
二、u_mass的具体计算公式
u_mass的计算步骤可以拆解为:
- 先统计语料库中所有词的边缘概率(单个词出现的概率)和共现概率(两个词同时出现在一篇文档的概率)
- 对主题中的每一对词(w_i, w_j),计算它们的共现关联度:
这里的ε是一个极小的平滑项,用来避免当P(w_i,w_j)为0时出现对数无意义的情况。score_pair = log( (P(w_i, w_j) + ε) / P(w_j) ) - 最后对主题内所有词对的score_pair取平均值,得到该主题的u_mass连贯性得分;如果是多个主题,会取所有主题得分的平均值作为整体得分。
用公式总结就是:
Coherence(U_mass) = (1/M) * Σ_{i<j} log( (P(w_i,w_j) + ε) / P(w_j) )
其中M是主题内词对的总数量。
三、为什么得分会是负值?
这和对数函数的特性直接相关:
- 当P(w_i,w_j) > P(w_j)时,(P(w_i,w_j)/P(w_j)) > 1,log值为正;但这种情况其实非常少见,因为P(w_j)是词w_j在整个语料库的出现概率,而P(w_i,w_j)是它和w_i一起出现的概率,必然小于等于P(w_j)。
- 大部分情况下,P(w_i,w_j) ≤ P(w_j),这时候对数的结果就是负数或者0,所以最终的平均得分自然会是负值。
一般来说,u_mass的得分范围大概在**-14到1之间**,负值是绝对的主流,你完全不用纠结这个结果。
关于你的代码
看了你的代码,写法是完全正确的:
from gensim.models.coherencemodel import CoherenceModel cm_u_mass = CoherenceModel(model = model1, corpus = corpus1, coherence = 'u_mass') coherence_u_mass = cm_u_mass.get_coherence() print('Coherence Score: ', coherence_u_mass)
只要你的model1和corpus1是正常训练/预处理得到的,这个负值结果就是合理的。如果想要更直观对比不同模型的好坏,你可以用u_mass得分的相对值——比如训练不同主题数的LDA模型,得分越高(越接近0或者正值)的模型,主题连贯性越好。
内容的提问来源于stack exchange,提问作者Nils_Denter
相关产品推荐
相关产品推荐

