- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在比较歌曲标题,使用拉丁文字(虽然不总是),我的目标是如果两首歌的标题看起来相同则给出高分的算法,如果它们什么都没有则给出非常低的分数共同点。
现在我已经不得不编写代码 (Java) 以使用 Lucene 和 RAMDirectory 编写此代码 - 但是仅使用 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
但我不太精通这些算法,什么是好的选择?
我认为 Lucene 以某种形式使用 CosineSimilarity,所以这是我的出发点,但我认为可能会有更好的东西。
具体来说,该算法应该适用于短字符串并且应该理解单词的概念,即应该特殊对待空格。拉丁文字的良好匹配是最重要的,但韩语和中文等其他文字的良好匹配也很重要,但我预计将需要不同的算法,因为它们处理空格的方式。
最佳答案
他们都很好。它们作用于字符串的不同属性并具有不同的匹配属性。最适合您的方法取决于您的需要。
我正在使用 JaccardSimilarity 来匹配名称。我选择 JaccardSimilarity 是因为它速度相当快,而且对于短字符串来说,在匹配带有常见拼写错误的名称方面表现出色,同时会迅速降低其他任何内容的分数。给空间额外的重量。它对词序也不敏感。我需要这种行为,因为误报的影响比漏报高得多,空格可能是错别字,但不常见,而且词序并不那么重要。
请注意,这是结合删除非变音符号的简化器和将剩余字符映射到 a-z 范围的映射器完成的。这是通过将所有单词分隔符标准化为单个空格的规范化传递的。最后,解析名称以挑选出首字母、pre- inner- 和后缀。这是因为名称的结构和格式对仅字符串比较具有相当的抵抗力。
要做出选择,您需要列出您想要的标准,然后寻找满足这些标准的算法。您还可以制作一个相当大的测试集并在该测试集上运行所有算法,以查看在时间、正数、误报、假负数和负数、系统应处理的错误类别等方面的权衡,等等,等等。
如果您仍然不确定您的选择,您还可以设置您的系统以在运行时切换精确的比较算法。这使您可以进行 A-B 测试,看看哪种算法在实践中效果最好。
TLDR;您想要哪种算法取决于您的需要,如果您不知道您需要什么,请确保您可以稍后更改它并即时运行测试。
关于java - 在拉丁文字中匹配两个包含少于 10 个单词的字符串的最佳算法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192215/
关于我需要什么和我目前拥有什么的简短介绍 我连接到一个数据库并从中获取我的数据,然后我得到 ( Name , LongNumber) 并且基本上我有一个事件( Action )在事件发生时触发(这个
有人可以帮我分解一下吗?为什么不能用两次乘法来完成? 复数的乘法 如果计算所需的乘法次数被视为其难度的衡量标准,并且这些计算是使用复数执行的,那么很自然地会问需要多少次实数乘法才能实现评估复杂产品的实
使用 PHP 的 preg_match() 函数,我将如何匹配 2 到 5 个字符之间的单词?在这种情况下,字母保证是大写的 A-Z,并且每个 $word 变量中只有一个单词。 它必须拒绝一个 6 个
想知道是否可以在 SQL 中选择多于/少于 x 个字符的内容。 例如,我有一个员工表,我想显示姓名中包含超过 4 个字符的所有员工姓名。 这是一个示例表 ID EmpName Dept 1 John
我需要选择相同 order_ID 的所有值,其中第一个日期和最后一个日期之间的差异等于或小于 7,但我不知道我应该怎么做,可以吗给我一些帮助,我应该怎么做? 数据库布局: +-------------
我有“名称”JavaScript 变量。如果变量“名称”包含少于 4 个字符,我想执行行:msg('name','Your name must contain minimum 4 characters
我最大限度地简化了代码以使其可读。我没有对 Bootstrap 文件夹进行任何更改。所以这是“简化的”HTML 页面: 3
我已经为我的网站实现了 PayPal 延迟链接支付,但我只需要延迟 3 天,而不是默认的 90 天。有人可以告诉我是否可以修改 PHP 脚本以指示 3 天,如果可以,请告诉我我在代码中的何处进行了此指
我想在不到 1 毫秒的时间内调用线程休眠。我读到 thread.Sleep 和 Windows 操作系统都不支持它。 解决方案是什么? 对于所有想知道我为什么需要这个的人:我正在进行压力测试,想知道我
我有一个 html 文档,当 URL 长度小于 30 个字符时,我想隐藏其中的一些 id(在本例中为 id="test")。 var test = document.getElementById('t
所以,我创建了一个带有缩略图导航的 slider ,但是当它的幻灯片少于 5 个时,问题就开始出现了。 它不是只显示它应该显示的幻灯片,而是重复幻灯片以填充容器高度,并且垂直缩略图不会在单击时更改幻灯
我希望能够隐藏少于 3 个字符的列表项,我该怎么做?我下面的代码有什么问题? 我是 JavaScript/jQuery 新手。 jQuery().ready(function () { if
常识说,对于足够小的数组,插入排序是最好的。例如,Timsort对最多 64 个元素的数组使用(二进制)插入排序;来自 Wikipedia : Some divide-and-conquer algo
我从 Javascript 对象动态地将数据添加到表中。我有一个代码最终是这样的: 1 1 2 3 1 2 即使 tds 不存在,我也希望每一行都有表格边框。所以基本上对于代码中的示例
vs2005支持::stdext::hash_map::std::map. 然而,在我的测试中,::stdext::hash_map 的插入和删除 OP 似乎比::std::map 慢。(少于 100
我正在尝试使用 ViewPager 组件实现无限轮播。我基于 Antonyt 创建的那个但是使用少于 4 个 View 会出现问题。由于 View 已经到位。必须是一种欺骗 Viewpager 在不同
在这篇关于 falsehoods programmers believe about time 的有趣文章中,其中之一是 Thread.sleep(1000) sleeps for >= 1000 m
我需要编写模拟真实用户交互的加特林场景。它应该偶尔发出一些请求,例如每个用户每小时 10 个(总共 20 个用户)。 根据我在文档中看到的,constantUsersPerSec接受 double ,
我正在尝试使用只有 7 列的网格创建日历。我想让这 7 列均匀分布并适合整行。目前,7 列加起来不等于 12,我得到 12 列,其中 5 列是空的。 Bootstrap 3 中是否有办法让所有 7 个
我有一个 170k 行的 .txt 文件。我正在将 txt 文件导入 Pandas 。 每行都有许多用逗号分隔的值。 我想提取具有 9 个值的行。 我目前正在使用: data = pd.read_cs
我是一名优秀的程序员,十分优秀!