字符串的高效索引可以进行全文索引

时间:2012-05-16 17:50:26

标签: java string algorithm data-structures indexing

我正在寻找一种数据结构来解决以下问题。接收大量相当短的字符串(比如5000万,少于30个字符)作为输入,并根据需要将它们编入索引。然后,回答我给出一个新字符串的查询,并提供初始集合中与提供的字符串类似的字符串(例如,10个最佳字符串)。理想情况下,“相似性”的概念类似于编辑距离或Jaro-Winkler距离或其近似值,但它应该能够适应拼写和单词顺序的微小变化以及垃圾单词的添加。 (例如,与标准索引任务不同,如果它确实是集合中最接近的字符串,请求“foo bar”应该产生“foo”。

举个例子,假设字符串集合是{“Charles Dickens”,“Mary Shelley”,“Robert Stephenson”}。询问“狄更斯,查尔斯”应该找到“查尔斯狄更斯”。查询“雪莱”应该返回“玛丽雪莱”。

通过逐个计算查询字符串与集合中所有字符串的相似性的简单方法对于大型集合来说太慢了。什么是一个好的数据结构来更有效地回答这些查询?理想情况下,我会寻找一个很好的Java实现。

2 个答案:

答案 0 :(得分:0)

我想到了两个建议:

1)选择一个满足三角不等式的距离函数并使用http://en.wikipedia.org/wiki/Cover_tree - 可能会提供一些加速但可能不是数量级。

2)猜测最接近的匹配将包括至少一段k个连续字符,这两个字符串是两个字符串之间的精确匹配。建立一个数据结构,例如使用哈希表查找可以找到集合中至少有k个连续字符与查询字符串的某些部分相同的所有字符串,然后使用距离函数查看从此返回的字符串中哪个是最佳匹配。应该很快,但有时会错过正确的答案。

答案 1 :(得分:0)

作为琐碎方法的替代方案,您可以分两步解决问题:

  1. 构建一个出现在所有字符串中的单词索引,它允许您查找包含给定单词的句子。这应该远小于5000万(如果我们谈论的是自然语言)。你可能不关心“foop bar” - >“foo”因为你只有单词。
  2. 将您的查询拆分为单词。对于每个单词,查找包含该单词的所有句子。对于每个句子,使用您的指标计算与查询字符串的相似性。
  3. 另一个好处是,在许多情况下,您可以在不重建单词索引的情况下更改指标。