除了 Levenshtein 之外,用于有序词集和后续聚类的更好距离度量
Posted
技术标签:
【中文标题】除了 Levenshtein 之外,用于有序词集和后续聚类的更好距离度量【英文标题】:Better distance metrics besides Levenshtein for ordered word sets and subsequent clustering 【发布时间】:2011-05-18 19:45:28 【问题描述】:我正在尝试解决一个涉及比较大量单词集的问题,每个单词集都包含来自一组单词的大量有序单词(总计约 600 多个,非常高的维度!)以进行相似性,然后将它们聚集成不同的组。解决方案需要尽可能无人监督。
数据看起来像
[苹果、香蕉、橙子……] [苹果、香蕉、葡萄...] [果冻、茴香、橙子...] [草莓、香蕉、橙子……] ...等
每个集合中单词的顺序很重要([Apple, Banana, Orange] 与 [Apple, Orange, Banana] 不同
到目前为止,我一直使用的方法是使用 Levenshtein 距离(受距离阈值限制)作为 Python 脚本中计算的度量,每个单词都是唯一标识符,从距离生成相似度矩阵,然后抛出将该矩阵转换为 KNIME 中的 k-Mediods 用于分组。
我的问题是:
Levenshtein 是解决此问题的最合适的距离度量吗? 均值/中心点原型聚类是进行分组的最佳方式吗? 我还没有考虑过验证集群中“k”的选择。评估聚类的 SSE 曲线是否是解决此问题的最佳方法? 我的方法是否存在缺陷? 作为未来解决方案的扩展,在给定训练数据的情况下,是否有人碰巧对将概率分配给集群分配有任何想法?例如,集合 1 有 80% 的机会在集群 1 中,等等。我希望我的问题不会显得太愚蠢或答案显而易见,我对数据挖掘还比较陌生。
谢谢!
【问题讨论】:
可能更多的背景信息会有所帮助。您能否详细说明所需的相似性?分组的目的是什么? 如果我在原始帖子中作为示例给出的每个集合都代表一篮杂货(物品放在篮子中的顺序很重要),我希望能够根据篮子内容的相似程度对篮子进行分组,并能够标记每个分组以进行分析(当然,标记必须手动完成)。篮子 [Apple, Banana, Orange] 将更类似于 [Apple, Banana, Grape] 而不是 [Jelly, Anise, Orange],因为后者需要更改两项,而不是前者。 【参考方案1】:是的,Levenshtein 是一种非常合适的方法。但是,如果序列的大小变化很大,您最好通过除以序列长度的总和来标准化这些距离 - 否则您会发现观察到的距离往往会随着成对的长序列而增加其“平均距离”(在相应 k 长度子串之间的平均距离的意义上,对于一些小的 k)是恒定的。
示例:([Apple, Banana], [Carrot, Banana])
对可以说具有与 ([Apple, Banana, Widget, Xylophone], [Carrot, Banana, Yam, Xylophone])
相同的“平均”距离,因为每个 2nd item 在两者中都匹配,但后一对的原始 Levenshtein 距离将是原来的两倍。
还请记住,Levenshtein 并没有为 “块移动” 做特殊考虑:如果你拿一个字符串,并将它的一个子字符串移到足够远的地方,那么结果对(原始和修改后的字符串)将具有相同的 Levenshtein 分数,就好像第二个字符串在子字符串移动到的位置具有完全不同的元素一样。如果您想考虑到这一点,请考虑改用compression-based distance。 (虽然我在那里说它对于计算距离而不考虑顺序很有用,但它当然有利于有序相似性而不是无序相似性。)
【讨论】:
我建议除以长度的最大值,这将为您提供 [0..1] 范围内的漂亮相似度数字。 j_random_hacker 给了我迄今为止最好的答案,尽管我希望继续提供意见。 @don: 谢谢,如果你愿意,你也可以点击upvote按钮;)【参考方案2】:查看 sourceforge 上的 SimMetrics,了解支持各种指标的平台,这些指标可以用作评估任务最佳表现的方法。
要获得商业上有效的版本,请查看 K-Now.co.uk 的 K-Similarity。
【讨论】:
以上是关于除了 Levenshtein 之外,用于有序词集和后续聚类的更好距离度量的主要内容,如果未能解决你的问题,请参考以下文章