java - 复杂的字符串匹配

标签 java artificial-intelligence string-comparison string-matching

在 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/

相关文章:

java - Google App Engine Java小操作

java - 上限通配符与绑定(bind)类型参数有什么不同?

artificial-intelligence - 神经网络的标称值输入

objective-c - 面向 Objective-C 的 AI

javascript - 如何比较 Javascript 中的字符串数组?

python - 两个带有字符串的列表的相似度分数

java - map 对??用于存储姓名和分数

java - Android Jack mockito 替代品

algorithm - 应用 A* 数独的启发式函数

.net - 在这种情况下,StringComparer.CurrentCulture 是正确的选择吗?