4

我要问的是一种方法,而不是具体的解决方案。我将从描述我认为具有挑战性的情况开始,然后继续这个问题。希望这样做更有意义。

我正在处理从自然语言中提取的数据。以后必须根据某种“知识库”分析这些数据(引用它是因为它不是真正的知识库,我稍后会谈到)。知识库很大,它的容量,到目前为止,理论上,但很快实际上将超过内存中存储的可能。我的两个担忧是:

  • 将数据转移到数据库服务器将意味着速度降低一个因素......好吧,我不知道是什么因素,但它可能很容易达到几个数量级。即在位于内存中的运行时本地对象中查找一条数据的任务要快得多,然后查询数据库。

  • 任何时候都不需要整个庞大的数据量。事实上,只使用了很小的一部分,所以,也许一些缓存可以帮助解决这个问题。我实际上希望有人已经面临这个问题并且缓存是正确的答案。

到目前为止,“知识库”只是一个复杂的数据结构,可以通过类似于使用某种查询语言查询数据库的方式来查询它。即它不是一个简单的按键操作查找值,它需要多个子查询来识别一个对象是否匹配给定的条件。

只是为了给你更具体的例子来说明我正在尝试做的事情。不像langutils,我正在尝试提出一个解析器,我称之为“预测解析器”,对不起,如果该术语已经被采用并且意味着其他内容:) 主要思想是,而不是将 POS 标签分配给单词,然后通过将一组规则应用于推断的信息来迭代地纠正原始假设,我试图以某种方式做到这一点,即给定特定的前缀,引擎将根据其“学习知识”生成延续。即假设知识库了解到前缀“我可以”几乎肯定后面跟着一个动词短语。所以解析器会假设动词短语并按原样解析它,除非它遇到错误。困难的部分是找到合适的前缀。不好的是,像“我会”和“你应该”这样的前缀将得到同等的优先级,即。e. 它们将按照相同的顺序(随机、字母顺序等)检查匹配。这个想法是,尽管在知识获取过程中,知识库将学习以这种方式存储和查找信息,最可能的前缀是首先查找,最初甚至不会加载最不可能的前缀。

这个概念有点类似于 CPU 缓存的工作原理。因此,如果我写的内容太长:我正在寻找一种数据结构,它的功能类似于 CPU 缓存,当前缓存的内容驻留在内存中,未缓存的内容存储在数据库中,或作为文件等。

PS。对不起我收集的标签。我觉得这并没有真正描述我的问题。如果您知道问题属于哪里,欢迎您对其进行调整。

4

1 回答 1

1

如果我们只考虑这部分:

这个想法是,虽然在知识获取过程中,知识库将学习以这样的方式存储和查找信息,即首先查找最可能的前缀,而最不可能的前缀甚至最初都不会被加载。

那么,如果我理解正确的话,你正在处理处理 n-gram 的任务。在您的情况下,您没有对前缀施加任何明确的限制,可以假设通常合理的限制适用,并且这些限制是 4-5 个单词的 n-gram。有很多这样的 n-gram:从真实世界的语料库中,您可以轻松获得千兆字节的数据。但是,即使您将自己限制为仅 3 克,您仍然会获得至少几千兆字节,除非您执行一些巧妙的预处理,以某种方式将“好”的 n 克分开。(加上适当的平滑,这可能是一个可行的解决方案)。

除了大小之外,n-gram 的坏消息是它们是由Zipf 定律分布的,这基本上意味着缓存不会很有用。

所以,我只是将数据放入本地机器上的一些快速数据库中(也许是dbm的一些变体)。如果你能把它全部放在内存中,也许 Memcached 或 Redis 会更快。

于 2012-12-10T05:05:00.317 回答