【发布时间】:2012-11-27 01:11:39
【问题描述】:
我要问的是一种方法,而不是一个具体的解决方案。我将从描述我认为具有挑战性的情况开始,然后继续这个问题。希望这样做更有意义。
我正在处理从自然语言中提取的数据。稍后必须根据某种“知识库”分析这些数据(引用它是因为它不是真正的知识库,我稍后会谈到)。到目前为止,知识库很大,其数量在理论上,但很快实际上将超过内存中可能存储的容量。我的两个担忧是:
将数据移动到数据库服务器将意味着速度降低一个因素...嗯,我不知道是什么因素,但它可能很容易降低几个数量级。 IE。在内存中的运行时本地对象中查找一条数据的任务要快得多,然后查询数据库。
任何时候都不需要整个海量数据。事实上,只使用了很小的一部分,所以,也许一些缓存可以帮助解决这个问题。我实际上希望有人已经遇到过这个问题,而缓存是正确的答案。
到目前为止,“知识库”只是一个复杂的数据结构,可以通过类似于使用某种查询语言查询数据库的方式来查询它。 IE。它不是一个简单的按键操作查找值,它需要多个子查询来识别一个对象是否匹配给定的条件。
只是为了给你一个更具体的例子来说明我正在尝试做的事情。与langutils 不同,我正在尝试提出一个解析器,我称之为“预测解析器”,对不起,如果该术语已经被采用并且意味着其他东西:) 主要思想是,而不是分配 POS 标签单词,然后通过将一组规则应用于推断信息来迭代地纠正原始假设,我试图以某种方式做到这一点,即给定特定前缀,引擎将根据其“学习知识”生成延续”。 IE。假设知识库了解到前缀“我可以”几乎肯定后面跟着一个动词短语。所以解析器会假设动词短语并按原样解析它,除非它遇到错误。困难的部分是找到合适的前缀。不好的是,像“我会”和“你应该”这样的前缀将获得同等的优先级,即它们将按照相同的顺序进行匹配检查,随机的、字母顺序等。这个想法是,虽然在知识获取过程中,知识库将学习以这样的方式存储和查找信息,即首先查找最可能的词首,而最不可能的词首最初甚至不会被加载。
这个概念有点类似于 CPU 缓存的工作原理。因此,如果我写的内容太长:我正在寻找一种数据结构,它的功能类似于 CPU 缓存,当前缓存的内容驻留在内存中,未缓存的内容存储在数据库中或作为文件等。
附言。对不起我收集的标签。我觉得这并没有真正描述我的问题。如果您知道问题属于哪里,欢迎您调整它。
【问题讨论】:
-
这是一个很难设计的问题。如果性能不重要并且(数据的)可维护性很重要,我会说去数据库。如果您的关键过程是标记,则每个令牌往返数据库将是典型成本(仅用于查询,更新更难)。对于实时马尔可夫事物,数据需要在核心中。
-
两级结构 - 前缀和规则用法 - 前缀是规则的 1:M,并且两者都被索引可能会有所帮助。前缀索引是正常的,但是规则使用索引是动态的、加权的,并且按照前缀内的权重排序。学习过程将填充 a) 规则使用表 b) 规则使用索引 c) 索引中的权重和 d) 前缀表和前缀索引。这个结构可以被缓存——两个索引和规则集适合一小组前缀。不知道有没有这样的加权索引结构。
-
听起来像 Datomic 非常适合您。它有一个和你描述的非常相似的缓存模型,它有一个基于datalog的查询系统。
-
如果你有能力构建一个网络集群,你仍然可以使用全内存实现,并划分出知识块,以便它们可以分布在集群中的不同节点上。看看这项工作作为 Erlang 实现的一个例子:act-r.psy.cmu.edu/papers/926/Douglass(2).pdf
标签: database dataset lisp common-lisp