在拉丁文脚本中匹配包含少于10个单词的两个字符串的最佳算法是什么

Pau*_*lor 12 java lucene similarity string-matching

我比较歌曲名称,用拉丁文字(但并不总是),我的目标是一种算法,给出了一个高分,如果两页首歌的标题似乎是相同的同题和非常低的分数,如果他们没有任何共同之处.

现在我已经不得不使用Lucene和RAMDirectory来编写代码(Java) - 但是使用Lucene只是为了比较两个字符串太重,因此太慢了.我现在转向使用https://github.com/nickmancol/simmetrics,它有许多很好的算法来比较两个字符串:

https://github.com/nickmancol/simmetrics/tree/master/src/main/java/uk/ac/shef/wit/simmetrics/similaritymetrics

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,所以这是我的出发点,但我认为可能有更好的东西.

具体来说,算法应该在短字符串上工作,并且应该理解单词的概念,即应该特别对待空格.拉丁文字的良好匹配是最重要的,但是韩文和中文等其他文字的良好匹配也是相关的,但我希望因为它们对待空间的方式需要不同的算法.

mpk*_*nje 4

他们都很好。它们作用于字符串的不同属性并具有不同的匹配属性。什么最适合您取决于您​​的需要。

我正在使用 JaccardSimilarity 来匹配名称。我选择 JaccardSimilarity 是因为它相当快,并且对于短字符串,它擅长将名称与常见拼写错误匹配,同时快速降低其他任何内容的分数。给空间带来额外的重量。它对词序也不敏感。我需要这种行为,因为误报的影响比误报的影响要高得多,空格可能是拼写错误,但并不常见,而且词序也不是那么重要。

请注意,这是与删除非变音符号的简化器和将剩余字符映射到 az 范围的映射器结合完成的。这是通过标准化来传递的,该标准化将所有单词分隔符标准化为单个空格。最后,对名称进行解析以挑选出首字母、前内部和后缀。这是因为名称具有一定的结构和格式,无法进行字符串比较。

为了做出选择,您需要列出您想要的标准,然后寻找满足这些标准的算法。您还可以制作一个相当大的测试集,并在该测试集上运行所有算法,看看在时间、阳性数量、误报、漏报和阴性、系统应处理的错误类别等方面的权衡是什么,等等,等等。

如果您仍然不确定自己的选择,您还可以设置系统以在运行时切换确切的比较算法。这使您可以进行 AB 测试并查看哪种算法在实践中效果最好。

太长了;您想要哪种算法取决于您的需要,如果您不知道自己需要什么,请确保稍后可以更改它并即时运行测试。