我正在尝试解决一个涉及比较大量单词集的问题,每个单词集都包含一组单词中大的有序数量的单词(总计大约600+,非常高维度!),用于相似性将它们聚类成不同的分组。解决方案需要尽可能无人监督。
数据看起来像
[Apple,Banana,Orange ...]
[Apple,Banana,Grape ...]
[Jelly,Anise,Orange ...]
[草莓,香蕉,橘子......]
...等
每组中单词的顺序很重要([Apple,Banana,Orange]与[Apple,Orange,Banana]截然不同
到目前为止,我一直使用的方法是使用Levenshtein距离(受距离阈值限制)作为在Python脚本中计算的度量,每个单词都是唯一标识符,从距离生成相似度矩阵,并投掷将该矩阵转换为KNIME中的k-Mediods用于分组。
我的问题是:
我希望我的问题看起来不是太愚蠢或答案非常明显,我对数据挖掘相对较新。
谢谢!
答案 0 :(得分:3)
是的,Levenshtein是一个非常合适的方法。但是如果序列的大小变化很大,那么通过除以序列长度的总和,你可能会更好地归一化这些距离 - 否则你会发现对于长序列对,观察到的距离往往会增加其“平均距离”(在相应的k长度子串之间的平均距离意义上,对于一些小k)是恒定的。
示例:对([Apple, Banana], [Carrot, Banana])
可以说具有与([Apple, Banana, Widget, Xylophone], [Carrot, Banana, Yam, Xylophone])
相同的“平均”距离,因为每个第2项都匹配,但后者对的原始Levenshtein距离将是两倍。
另外请记住,Levenshtein没有为“阻挡动作”做出特殊限制:如果你拿一根弦,并将其中一个子弦移动到足够远的地方,那么就会产生一对(原始的)和修改后的字符串)将具有相同的Levenshtein分数,就好像第二个字符串在子字符串移动到的位置具有完全不同的元素一样。如果您想考虑这一点,请考虑改用compression-based distance。 (虽然我说它对于计算距离而不考虑顺序很有用,但它当然有利于有序相似性与无序相似性。)
答案 1 :(得分:0)
在sourceforge上查看SimMetrics,了解支持各种指标的平台,这些指标可用作评估最佳任务的方法。
商业有效版本从K-Now.co.uk查看K-Similarity。