如何比较文本聚类中的不同相似度度量?

数据挖掘 聚类 文本挖掘 k-均值 相似
2021-09-17 19:48:52

我有一个数据集,其中包含从字幕生成的向量(每列代表一个流派,每一行是一个电影名称),我的目的是找到最相似的电影标题,我想使用不同的距离/相似度测量并比较它们,什么是最好的使用方法吗?

目前,我尝试了 L1 距离、余弦相似度、欧几里得距离、马氏距离,我得到了 top n 最相似标题的结果,但所有结果看起来都很合理,我如何比较它们,看看哪种方法性能最好?

我也尝试做k-means,当我实现K-means聚类时,它默认使用欧几里得距离,如何使用其他距离来实现K-means?还有关于其他相似度测量的建议吗?非常感谢

2个回答

我会尝试与聚类不同的方法。

目前,我尝试了 L1 距离、余弦相似度、欧几里得距离、马氏距离

首先,您可以查看近似字符串匹配度量。这些可能会在一对电影标题上为您提供更好的相似性结果。不仅使用基于单词的度量,而且使用基于字符或基于字符 n-gram 的度量通常是一个好主意。

我如何比较它们以查看哪种方法效果最好?

一个适当的评估框架将需要手动注释大量的标题对为相似/不相似(甚至是相似度)。除非你有很多时间,否则这是完全不切实际的,因为正负对之间肯定存在巨大的不平衡。因此,您可以使用自举,这意味着对您的数据运行一些相似性度量,为每个度量提取前 N 对,然后仅手动注释这些。这很可能会为您提供大量(罕见)正面案例,并且您可以通过假设其他实例为负面来构建标记数据集。这显然是一种简化,否则您也可以花时间注释很多负面案例(它仍然比没有引导要快得多,因为您已经有了正面案例)。

我的目的是找到最相似的电影标题,我想使用不同的距离/相似度测量并比较它们,最好的方法是什么?

根据您构建的数据集,您现在可以训练一个监督模型,其中包含一对标题作为实例。您可以使用各种相似性度量作为特征,并且应该在这些特征之间改变相似性的类型(基于字符、基于 ngram、基于单词),以便为模型提供多样化的特征。

然后你可以预测任何两对之间的相似性。这为您提供了所有电影之间的相似关系图,您可以从中提取相似的组。

请注意,这只是一个通用策略,它的许多部分可以根据您的数据进行改进/调整,当然这取决于您想在这个问题上花费多少时间。

我得到了前 n 个最相似标题的结果,但所有结果似乎都很合理,我如何比较它们以查看哪种方法表现最好?

除非您指定一些具体的指标,否则恐怕没有有意义的“最佳”定义。如果每种情况下的结果看起来都是合理的,那么您所能做的就是了解各种距离指标,并决定哪个对您的用例最有意义。(例如,欧几里得距离测量空间差异,而余弦相似度测量方向差异。)

我也试过做k-means,当我实现K-means聚类时,默认使用欧几里得距离,如何使用其他距离来实现K-means?

请记住,k-means 是为欧几里得距离设计的,这就是为什么许多实现(例如 scikit-learn)不允许使用任何其他距离函数的原因。对于许多其他距离度量,例如余弦相似度,取聚类中点的平均值是不合适的,因此您还需要替换质心估计函数。

如果您真的想要,那么 NLTK 的K-Means 实现允许您指定自定义距离度量。请记住 GIGO 原则。如果你违反了模型的假设,如果你得到糟糕的结果,不要感到惊讶。