我正在寻找一种数据结构来解决以下问题。接收大量相当短的字符串(比如5000万,少于30个字符)作为输入,并根据需要将它们编入索引。然后,回答我给出一个新字符串的查询,并提供初始集合中与提供的字符串类似的字符串(例如,10个最佳字符串)。理想情况下,“相似性”的概念类似于编辑距离或Jaro-Winkler距离或其近似值,但它应该能够适应拼写和单词顺序的微小变化以及垃圾单词的添加。 (例如,与标准索引任务不同,如果它确实是集合中最接近的字符串,请求“foo bar”应该产生“foo”。
举个例子,假设字符串集合是{“Charles Dickens”,“Mary Shelley”,“Robert Stephenson”}。询问“狄更斯,查尔斯”应该找到“查尔斯狄更斯”。查询“雪莱”应该返回“玛丽雪莱”。
通过逐个计算查询字符串与集合中所有字符串的相似性的简单方法对于大型集合来说太慢了。什么是一个好的数据结构来更有效地回答这些查询?理想情况下,我会寻找一个很好的Java实现。
答案 0 :(得分:0)
我想到了两个建议:
1)选择一个满足三角不等式的距离函数并使用http://en.wikipedia.org/wiki/Cover_tree - 可能会提供一些加速但可能不是数量级。
2)猜测最接近的匹配将包括至少一段k个连续字符,这两个字符串是两个字符串之间的精确匹配。建立一个数据结构,例如使用哈希表查找可以找到集合中至少有k个连续字符与查询字符串的某些部分相同的所有字符串,然后使用距离函数查看从此返回的字符串中哪个是最佳匹配。应该很快,但有时会错过正确的答案。
答案 1 :(得分:0)
作为琐碎方法的替代方案,您可以分两步解决问题:
另一个好处是,在许多情况下,您可以在不重建单词索引的情况下更改指标。