我想比较几个字符串,找到最相似的字符串.我想知道是否有任何库,方法或最佳实践将返回我哪些字符串更类似于其他字符串.例如:
这种比较将返回第一个比第二个更相似.
我想我需要一些方法,例如:
double similarityIndex(String s1, String s2)
Run Code Online (Sandbox Code Playgroud)
某处有这样的事吗?
编辑:我为什么这样做?我正在编写一个脚本,将MS Project文件的输出与处理任务的某些遗留系统的输出进行比较.由于遗留系统的字段宽度非常有限,因此在添加值时,将缩写描述.我想要一些半自动的方式来查找MS Project中哪些条目与系统上的条目类似,这样我就可以获得生成的密钥.它有缺点,因为它必须仍然手动检查,但它会节省大量的工作
我比较歌曲名称,用拉丁文字(但并不总是),我的目标是一种算法,给出了一个高分,如果两页首歌的标题似乎是相同的同题和非常低的分数,如果他们没有任何共同之处.
现在我已经不得不使用Lucene和RAMDirectory来编写代码(Java) - 但是使用Lucene只是为了比较两个字符串太重,因此太慢了.我现在转向使用https://github.com/nickmancol/simmetrics,它有许多很好的算法来比较两个字符串:
BlockDistance
ChapmanLengthDeviation
ChapmanMatchingSoundex
ChapmanMeanLength
ChapmanOrderedNameCompoundSimilarity
CosineSimilarity
DiceSimilarity
EuclideanDistance
InterfaceStringMetric
JaccardSimilarity
Jaro
JaroWinkler
Levenshtein
MatchingCoefficient
MongeElkan
NeedlemanWunch
OverlapCoefficient
QGramsDistance
SmithWaterman
SmithWatermanGotoh
SmithWatermanGotohWindowedAffine
Soundex
Run Code Online (Sandbox Code Playgroud)
但是我不熟悉这些算法,那将是一个不错的选择?
我认为Lucene以某种形式使用CosineSimilarity,所以这是我的出发点,但我认为可能有更好的东西.
具体来说,算法应该在短字符串上工作,并且应该理解单词的概念,即应该特别对待空格.拉丁文字的良好匹配是最重要的,但是韩文和中文等其他文字的良好匹配也是相关的,但我希望因为它们对待空间的方式需要不同的算法.
我试图计算字符串对集合的编辑距离,以找到最接近的匹配.我目前的问题是集合非常大(大约25000个项目),所以我不得不将集合缩小到相似长度的字符串,但仍然只会将其缩小到几千个字符串,这仍然非常慢.是否存在允许快速查找类似字符串的数据结构,还是有另一种方法可以解决此问题?
java algorithm edit-distance pattern-matching data-structures