在 Java 中,我使用 Levenshtein 算法(apache commons)来尝试将 say 对象列表与另一个“几乎完美”的列表进行匹配。几乎抛光的包含以下内容:
- 面包
- Screwdriver
- 螺丝
- 番茄
- 预订
- 番茄汁
- 半个苹果
- 青苹果
- 苹果
另一个大列表可以包含与上面相同的单词,但也可以包含其他内容,因为它可以是句子的一部分或只是一个特定项目(例如,四分之一个青苹果或一本关于编程的旧书)。此列表中的项目已编入索引并属于特定的 Box。它是一个数据库表,其中的项目被索引。
我想做的是将大项目列表与“抛光”列表链接起来。喜欢
- 四分之一个青苹果 => 苹果
- 一本稍微用过的编程书 => 书(或者编程书,如果它在列表中)
Levenshtein 可能是解决方案,但我没有得到我所期望的,有时是完全错误的,有时它不够智能(“编程键盘”是用“编程书”而不是“键盘”索引的)。
有没有更有效的方法来做到这一点?我认为我的第一步是清理抛光列表,但我还不知道该怎么做。也许我也应该对列表中的单词进行加权(例如,如果有多个单词,“-ing”单词就不那么重要)
我还怀疑我应该给出几个级别的匹配。 100%匹配,80%等。
最佳答案
我认为你有两个问题。首先,您需要从一个句子中找到关键字(book f.e.)。如果你有一个像“spooky parasol”这样的句子,其中 spooky 的 Levenstein-distance 为 4,那么你就会遇到问题。
从句子中检索出关键字后,您当然可以将每个单词与特定的项目词进行比较,并将拼写错误的单词视为最短levenstein距离的项目词。问题是,对于每个单词,您需要与每个项目进行 levenstein 比较。
如果您知道您的商品是什么,则查找关键字会更容易。如果您没有一组特定的项目,但所有专有名词都可以,那么您确实有问题了;)
关于java - 复杂的字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23427849/