用于存储由 n-gram 索引的数据的高效数据库模型

数据挖掘 nlp 数据库
2021-10-01 04:22:14

我正在开发一个应用程序,该应用程序需要创建一个非常大的 n-gram 数据库,这些数据库存在于大型文本语料库中。

我需要三种高效的操作类型:由 n-gram 本身索引的查找和插入,以及查询包含子 n-gram 的所有 n-gram。

在我看来,数据库应该是一个巨大的文档树,而文档数据库(例如 Mongo)应该能够很好地完成这项工作,但我从未大规模使用过这些数据库。

了解 Stack Exchange 问题格式后,我想澄清一下,我不是在寻求有关特定技术的建议,而是我应该寻找一种数据库类型,以大规模实施类似的事情。

3个回答

请参阅Lucene NGramTokenizer

您确定不能只使用 lucene 或类似的索引技术吗?

倒排索引将只存储一次 n-gram,然后只存储包含 ngram 的文档 id;他们不会将其存储为高度冗余的原始文本。

至于查找包含您的查询子 n-gram 的 ngram,我将在观察到的 ngram 上建立一个索引,例如使用第二个 lucene 索引或任何其他子字符串索引,例如 trie 或后缀树。如果您的数据是动态的,那么 lucene 可能是一个合理的选择,使用短语查询来查找您的 n-gram。

基本上,对于这项任务,您可以有效地使用任何支持基于 B+树的索引的 SQL 数据库(MySQL 将满足您的完美需求)。

创建 3 个表:

  1. 文档表,列:id/document
  2. N-gram 表:n_gram_id/n_gram
  3. n-gram 和文档之间的映射:document_id/n_gram_id

在 N-gram table/n_gram string 和 Mapping table/n_gram_id 上创建索引,默认情况下主键也会被索引。

您的操作将是高效的:

  1. 插入文档:只需提取所有 n-gram 并插入到文档表和 N-gram 表中
  2. 在索引的支持下查找 in_gram 将很快
  3. 查询包含子 n-gram 的所有 n-gram:分 2 步 - 只需根据索引查询所有包含来自第二个表的子 n-gram 的 n-gram。然后 - 检索每个 n-gram 的所有相应文档。

您甚至不需要使用连接来实现所有这些操作,因此索引会有很大帮助。此外,如果数据不适合在一台机器上 - 您可以实施分片方案,例如将 n_grams 存储在一台服务器上,然后将 oz 存储在另一台或其他合适的方案上。

您也可以使用 MongoDB,但我不确定您需要如何实现索引方案。对于 MongoDB,您将免费获得分片方案,因为它已经内置。

我以前没有这样做过,但考虑到你想要的功能,这听起来像是图形数据库的工作。这是 neo4j 中的演示