我需要知道一致性得分 0.4 是好是坏?我使用LDA作为主题建模算法。
这种情况下的平均连贯性得分是多少?
连贯性衡量主题内单词之间的相对距离。 有两种主要类型 C_V 通常为 0 < x < 1 and uMass -14 < x < 14. It's rare to see a coherence of 1 or +.9 unless the words being measured are either identical words or bigrams. Like United and States would likely return a coherence score of ~.94 or hero and hero would return a coherence of 1. The overall coherence score of a topic is the average of the distances between words. I try and attain a .7 in my LDAs if I'm using c_v I think that is a strong topic correlation. I would say:
.3 不好
.4 低
.55就可以了
.65 可能已经是最好的了
.7 很好
.8 不太可能并且
.9 可能是错误的
低一致性修复:
调整参数 alpha = .1、beta = .01 或 .001、random_state = 123 等
获取更好的数据
在 0.4 时,您可能有错误的主题数量,请查看 https://datascienceplus.com/evaluation-of-topic-modeling-topic-coherence/,了解所谓的肘部方法 - 它为您提供了数据集中实现最大一致性的最佳主题数量图表。 我使用的木槌具有很好的一致性,这里是检查不同数量主题的一致性的代码:
def compute_coherence_values(dictionary, corpus, texts, limit, start=2, step=3):
"""
Compute c_v coherence for various number of topics
Parameters:
----------
dictionary : Gensim dictionary
corpus : Gensim corpus
texts : List of input texts
limit : Max num of topics
Returns:
-------
model_list : List of LDA topic models
coherence_values : Coherence values corresponding to the LDA model with respective number of topics
"""
coherence_values = []
model_list = []
for num_topics in range(start, limit, step):
model = gensim.models.wrappers.LdaMallet(mallet_path, corpus=corpus, num_topics=num_topics, id2word=id2word)
model_list.append(model)
coherencemodel = CoherenceModel(model=model, texts=texts, dictionary=dictionary, coherence='c_v')
coherence_values.append(coherencemodel.get_coherence())
return model_list, coherence_values
# Can take a long time to run.
model_list, coherence_values = compute_coherence_values(dictionary=id2word, corpus=corpus, texts=data_lemmatized,
start=2, limit=40, step=6)
# Show graph
limit = 40;
start = 2;
step = 6;
x = range(start, limit, step)
plt.plot(x, coherence_values)
plt.xlabel("Num Topics")
plt.ylabel("Coherence score")
plt.legend(("coherence_values"), loc='best')
plt.show()
# Print the coherence scores
for m, cv in zip(x, coherence_values):
print("Num Topics =", m, " has Coherence Value of", round(cv, 4))
# Select the model and print the topics
optimal_model = model_list[3]
model_topics = optimal_model.show_topics(formatted=False)
pprint(optimal_model.print_topics(num_words=10))
我希望这有帮助:)
除了萨拉的出色回答之外:
麻省大学一致性衡量两个单词(Wi,Wj)在语料库中同时出现的频率。它的定义为:
D(Wi, Wj) = log [ (D(Wi, Wj) + EPSILON) / D(Wi) ]
地点: D(Wi, Wj) 是单词 Wi 和单词 Wj 一起出现的次数
D(Wi) 是单词 Wi 在语料库中单独出现的次数
EPSILON 是一个小值(如 1e-12) 添加到分子以避免 0 值
如果 Wi 和 Wj 永远不会一起出现,那么这会导致 log(0),这将打破宇宙。 EPSILON 值是解决此问题的一种破解方法。
总之,你可以得到一个从非常大的负数一直到大约0的值。解释和Sara写的一样,数字越大越好,其中0显然是错误的。
我想补充一点,好坏与您正在处理的语料库以及其他集群的分数有关。
在 Sara 提供的链接中,文章显示了 33 个最佳主题,一致性得分约为 0.33,但正如作者提到的,该集群中可能存在重复的术语。在这种情况下,您必须将最佳聚类分解中的术语/片段与较低的一致性分数进行比较,以查看结果是否或多或少可以解释。
当然,您应该调整模型的参数,但分数取决于上下文,并且我认为您不一定可以说特定的一致性分数在不首先了解数据的情况下对数据进行了最佳聚类。也就是说,正如 Sara 提到的 ~1 或 ~0 可能是错误的。
您可以将您的模型与基准数据集进行比较,如果它具有更高的一致性,那么您可以更好地衡量模型的运行情况。
这篇论文对我很有帮助:https://rb.gy/kejxkz