Pau*_*lor 12 java lucene similarity string-matching
我比较歌曲名称,用拉丁文字(但并不总是),我的目标是一种算法,给出了一个高分,如果两页首歌的标题似乎是相同的同题和非常低的分数,如果他们没有任何共同之处.
现在我已经不得不使用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,所以这是我的出发点,但我认为可能有更好的东西.
具体来说,算法应该在短字符串上工作,并且应该理解单词的概念,即应该特别对待空格.拉丁文字的良好匹配是最重要的,但是韩文和中文等其他文字的良好匹配也是相关的,但我希望因为它们对待空间的方式需要不同的算法.
他们都很好。它们作用于字符串的不同属性并具有不同的匹配属性。什么最适合您取决于您的需要。
我正在使用 JaccardSimilarity 来匹配名称。我选择 JaccardSimilarity 是因为它相当快,并且对于短字符串,它擅长将名称与常见拼写错误匹配,同时快速降低其他任何内容的分数。给空间带来额外的重量。它对词序也不敏感。我需要这种行为,因为误报的影响比误报的影响要高得多,空格可能是拼写错误,但并不常见,而且词序也不是那么重要。
请注意,这是与删除非变音符号的简化器和将剩余字符映射到 az 范围的映射器结合完成的。这是通过标准化来传递的,该标准化将所有单词分隔符标准化为单个空格。最后,对名称进行解析以挑选出首字母、前内部和后缀。这是因为名称具有一定的结构和格式,无法进行字符串比较。
为了做出选择,您需要列出您想要的标准,然后寻找满足这些标准的算法。您还可以制作一个相当大的测试集,并在该测试集上运行所有算法,看看在时间、阳性数量、误报、漏报和阴性、系统应处理的错误类别等方面的权衡是什么,等等,等等。
如果您仍然不确定自己的选择,您还可以设置系统以在运行时切换确切的比较算法。这使您可以进行 AB 测试并查看哪种算法在实践中效果最好。
太长了;您想要哪种算法取决于您的需要,如果您不知道自己需要什么,请确保稍后可以更改它并即时运行测试。
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |