按相似性对字符串进行分组

时间:2010-01-28 23:41:34

标签: ruby algorithm string grouping similarity

我有一个字符串数组,不是很多(可能是几百个),但通常很长(几百个字符)。

这些字符串通常是无意义的,与另一个字符串不同......但是在这些字符串的一组中,可能是300个中的5个,这是非常相似的。实际上它们是相同的字符串,不同的是格式,标点和一些单词..

我该如何计算出这组字符串?

顺便说一下,我正在写ruby,但如果没有别的,伪代码中的算法就可以了。

感谢

4 个答案:

答案 0 :(得分:4)

有许多方法可以比较字符串的相似性。

你可以使用

Here is a site with various similarity metrics

您可以使用

Here is a Wikipedia article with various similarity metrics

答案 1 :(得分:2)

您可以使用Levenshtein算法。 Here's Ruby中的一个实现。

答案 2 :(得分:1)

假设您并不担心每个单词中的拼写错误或其他错误,您可以执行以下操作:

构建一个倒排索引,它基本上是一个由word键入的哈希值,指向包含该词的字符串的指针列表(如何处理重复的事件取决于你)。要确定与给定查询字符串类似的字符串,请查找索引中的每个查询字,并对结果列表中的每个源字符串计算源字符串在每个列表中出现的次数。计数最高的字符串是相似性的最佳候选者,因为它们包含最常用的单词。

然后,您可以计算两个字符串之间的编辑距离,或者您想要的任何其他指标。这样就可以避免将每个字符串与每个其他字符串进行比较的O(n ^ 2)复杂度。

答案 3 :(得分:0)

这可能是过度的,可能并不完全符合你想要实现的目标,但你可以使用'Ferret'来帮助(Lucene的Ruby版本 - 全文索引/搜索API)来排序在标点符号和格式之外 - 如果句子因常见的'停止词'(the,and,是......)而不同,则可以过滤这些句子。

然后,您的搜索将被分配权重:这样可以了解相似性。

http://www.davebalmain.com/ http://www.amazon.co.uk/Ferret-David-Balmain/dp/0596519400/ref=sr_1_2?ie=UTF8&s=books&qid=1264751909&sr=8-2