【问题标题】:Search many strings over a very large text在非常大的文本中搜索多个字符串
【发布时间】:2014-03-17 17:41:25
【问题描述】:

我有大约 200 万个字符串,我需要在 1 TB 的文本数据中搜索每个字符串。搜索所有这些并不是最好的解决方案,所以我正在考虑一种更好的方法来为所有字符串创建像 trie 这样的数据结构。换句话说,其中的每个节点都是一个单词的 trie。我想问一下,有没有什么好的算法、数据结构或库(C++)可以用于这个目的?


让我在这个问题上更具描述性,

例如,我有这些字符串: s1-“我爱你” s2-“你好吗” s3-“怎么了老兄”

我有很多文本数据,例如: t1-“嗨,我叫 Omid,我喜欢电脑。你们好吗?” t2-“你的每一个愿望都会实现,他们告诉我……” t3 t4 . . . t10000

然后我想考虑每个文本并搜索它们上的每个字符串。最后,对于这个示例,我只想说:t1 包含 s1,仅此而已。 我正在寻找一种有效的方法来搜索字符串,但不是每次都愚蠢地搜索每个字符串。

【问题讨论】:

  • 我建议您形成一个字符串的哈希映射(无序映射),表示该字符串存在于您的哈希映射中。然后遍历您的文本并继续检查每个单词的哈希图,无论它是否存在。
  • 基本问题:这是您只做一次的事情,还是您需要经常做的事情?如果您需要经常执行此操作,您要搜索的字符串、要搜索的文本或两者都在搜索之间更改吗?
  • re Abhishek Bansal:你的意思是一袋字?如果是,我应该说我可以找到我想要搜索的所有字符串单词。然后在迭代过程中,我会搜索每个单词,如果没有找到,那么将忽略许多字符串进行搜索。但是当您说哈希图时,我并没有关注您。为什么?这就是你的意思吗?
  • re Jerry:嗯,我需要在大量文本中迭代地搜索所有句子。但整个过程只需要完成一次。
  • 这是 DNA 数据吗?我希望它不是书面文本,因为非常大的书籍都在兆字节范围内(圣经 4MB,莎士比亚全集:2MB)?如果你真的在尝试构建下一个谷歌并且已经收集了大部分互联网,那么你在寻找什么?

标签: c++ string search trie large-text


【解决方案1】:

我很抱歉发布一个仅链接的答案,但如果您不介意阅读研究论文,我认为字符串匹配算法的权威参考是 http://www-igm.univ-mlv.fr/~lecroq/string/ 和以下 research paper 由 Simone Faro 和Thierry Lecroq 他们比较了不少于 85 种不同字符串匹配算法的相对性能。我很确定其中有一个适合您的需求。

【讨论】:

    【解决方案2】:

    我强烈建议您使用 CLucene (http://clucene.sourceforge.net/),它是 Apache Lucene 项目的一个端口。这将为您构建一个倒排索引并使文本搜索非常快。如果可以选择更改语言,请考虑在 Java 中执行此操作,因为 CLucene 版本有点过时了。它会更慢,但功能更多。

    【讨论】:

    • 亲爱的彼得,更准确地说,我需要在大量文本字符串中找到大量句子,然后我宁愿使用数据结构更系统地执行此操作,而不仅仅是一次又一次地搜索每个句子。您认为这个库对我来说是最佳选择还是您有其他建议?
    • @omidaskari 我想你会想要一个持久的表示来搜索字符串。倒排索引将允许您扩展数据集并将其存储到磁盘比尝试持久化您的 trie 更有效。有了这么多数据,您将无法将数据结构放入内存中,因此您需要一种有效的方法来在磁盘上进行搜索。倒排索引解决了这个问题。我不知道您希望与您的单词匹配多近,但您可能需要处理拼写错误的单词,a 让您的单词成为词干(即 find run、ran、running)。倒排索引可以做到这一点以及更多。
    • @omidaskari 并直接回答您的问题。您想针对每个文本字符串搜索该组句子。因此,如果您有一个倒排索引,它将搜索一个句子并从集合中返回所有匹配的字符串。然后你可以搜索下一句。索引只是一种具有高效磁盘格式的数据结构。使用 b-tree 的关系数据库解决了等效的问题。 b 树在内存中很有用,但在磁盘上更有用,因为当您拥有非常大的数据集时,它可以更高效地搜索键。
    • 我学倒排索引只是从:en.wikipedia.org/wiki/Inverted_index 但是
    • 我只是从en.wikipedia.org/wiki/Inverted_index学到了倒排索引,但我想你误解了我的问题。我有一个非常大的数据(比如 1TB),我无法用索引作为数据结构保存所有常用词。我正在寻找一种在我的搜索字符串上创建数据结构的方法。然后对于大数据的每个元组,我只需要使用数据结构搜索一次。这与倒排索引所做的事情非常不同。或者我对倒排索引不太了解,如果你同意,请告诉我。
    猜你喜欢
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多