【发布时间】:2012-05-16 17:50:26
【问题描述】:
我正在寻找一种数据结构来解决以下问题。接收大量相当短的字符串(例如 5000 万,少于 30 个字符)作为输入,并根据需要对它们进行索引。然后,回答我给出一个新字符串的查询,并且您提供与提供的字符串相似的初始集合中的字符串(例如,10 个最好的此类字符串)。理想情况下,“相似性”的概念类似于编辑距离或 Jaro-Winkler 距离,或其近似值,但它应该能够适应拼写和词序的微小变化,以及添加垃圾词。 (例如,与标准索引任务不同,如果请求“foo bar”确实是集合中最接近的字符串,则它应该产生“foo”)。
举个例子,假设字符串集合是 {"Charles Dickens", "Mary Shelley", "Robert Stephenson"}。查询“狄更斯,查尔斯”应该找到“查尔斯狄更斯”。查询“by Shelley”应该返回“Mary Shelley”。
逐一计算查询字符串与集合中所有字符串的相似度的简单方法对于大型集合来说太慢了。什么是更有效地回答此类查询的好数据结构?理想情况下,我会寻找一个好的 Java 实现。
【问题讨论】:
-
这与拼写检查器在建议可能的更正时所做的非常相似。您可能想检查他们实际上是如何做到的。
-
我不认为 Lucene 可以,因为诸如“foo bar”甚至“foop bar”之类的查询返回“foo”的限制。我不想只在单词级别进行比较,也不想要求 all 查询单词出现。另外,我希望对任意编辑具有弹性,我不确定 Lucene 是否能够做到。
-
第一个近似值是“KWIC 索引”。
-
Lucene 绝对有能力(几乎)做任何你能想象到的事情。您的示例属于 Lucene 功能的微不足道的范围。请记住,Lucene 是一个 API,特定于您的要求的功能的实现掌握在您手中。 Lucene 只是完成这项工作的艰难部分的工具。
标签: java string algorithm data-structures indexing