在一大组字符串中查找类似字符串的组
我有一个相当大的一组字符串(比如100),它有许多以相似性为特征的子组。 我试图找到/设计一个能够合理高效地找到论文组的算法。
举个例子,假设输入列表在左下方,输出组在右边。
Input Output
----------------- -----------------
Jane Doe Mr Philip Roberts
Mr Philip Roberts Phil Roberts
Foo McBar Philip Roberts
David Jones
Phil Roberts Foo McBar
Davey Jones =>
John Smith David Jones
Philip Roberts Dave Jones
Dave Jones Davey Jones
Jonny Smith
Jane Doe
John Smith
Jonny Smith
有谁知道有什么方法可以合理有效地解决这个问题吗?
找到相似的字符串的标准方法似乎是Levenshtein距离,但我无法看到如何在这里使用它,而不必将每个字符串与列表中的每个字符串进行比较,然后以某种方式决定差异决定两个字符串是否在同一组中的阈值。
另一种方法是将字符串散列为整数的算法,其中类似的字符串散列为数字行上相近的整数。 即使存在,我也不知道会是什么算法
有人有任何想法/指针吗?
更新:@愿意A:或许名字并不是我第一次想到的那么好的例子。 作为一个起点,我认为我可以假设在我将要使用的数据中,字符串的小改动不会使它从一个组跳到另一个组。
另一个流行的方法是通过Jaccard索引关联字符串。 从http://en.wikipedia.org/wiki/Jaccard_index开始。
这里有一篇关于使用Jaccard-index(和其他一些方法)来解决像你这样的问题的文章:
http://matpalm.com/resemblance/
您试图解决的问题是典型的集群问题。
从简单的K-Means算法开始,并使用Levenshtein距离作为计算元素和聚类中心之间距离的函数。
BTW,Levenshtein距离计算算法在Apache Commons StringUtils中实现 - StringUtils.getLevenshteinDistance
K-Means的主要问题是你应该指定簇的数量(在你的术语中是子组)。 因此,您将有两种选择:用一些euristic改进K-Means,或者使用另一种不需要指定簇编号的簇化算法(但该算法可能会表现出更差的性能,并且如果您决定实施该算法会非常困难你自己)。
如果我们正在谈论实际的代名词,比较他们的metaphone(的开始)可能会有所帮助:
MRFLPRBRTS: Mr Philip Roberts
FLRBRTS: Phil Roberts
FLPRBRTS: Philip Roberts
FMKBR: Foo McBar
TFTJNS: David Jones
TFJNS: Dave Jones
TFJNS: Davey Jones
JNT: Jane Doe
JNSM0: John Smith
JNSM0: Jonny Smith
链接地址: http://www.djcxy.com/p/61371.html
上一篇: Finding groups of similar strings in a large set of strings
下一篇: Efficiently estimating the number of unique elements in a large list