如何提高单词聚类的结果

数据挖掘 聚类 k-均值
2022-03-08 12:45:06

我有一个单词列表(实际上是名称),我想在其上应用一些实体解析。我的第一个猜测是创建相似名称的集群,以便我可以从多个名称形状中提取代表实体。

我需要指定我没有标记数据,并且我没有进行文档分析(例如,这与改进聚类结果不同),只有一个原始列表。

为此,根据我能读到的内容,我尝试了两种方法:

  • 对我的名字应用 n-gram 转换并使用 k-means 聚类

  • 应用 n-gram 变换,计算相似度矩阵(余弦距离)并将其用于亲和力传播

这两种方法都给了我有趣的结果,但我无法理解一些结果。例如,我得到以下集群:

Geronese, Varonese, Veronefe, Veronese, Veronesse, ...

Cameroni, Veronèse, Veronèse P., Veronése, Veronêse

为什么我会得到两个看起来如此相似的形状的不同集群(除了Cameroni我不知道它为什么在那个集群中)?这是 k-means 算法调整中的问题吗?

此外,我尝试使用轮廓指标来找到最佳集群数量,但无论集群数量是多少,我都会得到完全相同的值(0.315 代表它的价值)。

至于亲和力传播方法,我的集群的轮廓分数较低,并且我得到了一些类似的效果,比如拥有这种集群:

Birttetti, Laruette, Laruelle, Larvette, Laurette, ...

有什么想法可以改善我的结果(如果可能的话)?或者也许有比我更好的方法的想法?

1个回答

我还不能写评论,所以我将从一个仍然包含一些问题的答案开始,随时补充/纠正它!

一)数据

如果没有任何上下文信息,看起来您必须链接实体的唯一解决方案是它们的字符相似性。我不知道您使用哪种距离度量,但是您是否尝试过这些为字符串数据设计的度量?:

  • Levenshtein 距离(也称为字符串编辑距离):基本上计算将一个字符串转换为另一个字符串所需的操作数
  • Jaro-Winkler 距离:接近 levenshtein 但偏爱具有共同前缀的字符串
  • Jaccard 相似度:粗略计算两个集合之间共同元素的比率,无论是字符、ngram、单词..

您可以在不先进行 n-gram 转换的情况下尝试这些指标,也可以在转换后的数据上尝试这些指标,然后再使用余弦距离。

您还可以执行额外的规范化,但您需要评估它是否与您的数据集相关,我不知道,所以我只是提出想法,而不是建议:去除重音、特殊字符、短标记(如 'P. ' 在您的示例中),这将减少数据的方差。

B) 聚类

可以解释您的结果的一件事是,使用 KMeans 或 Affinity Propagation,任何数据点都必须属于一个集群,因此应该将单独的名称分配给集群,以便最大限度地减少算法的损失。

你有没有想过尝试DBSCAN它可以将一些数据点标记为噪声,并且如果您使用上述字符串距离之一,您可以通过epsilon参数对两个潜在匹配之间的最大距离的先验知识进行编码。

但与任何无监督的方法一样,您永远无法保证摆脱噪音。