gpt4 book ai didi

algorithm - Prolog中信息检索的性能优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:31:01 26 4
gpt4 key购买 nike

我想用 Prolog 做一些信息检索任务。目前我有一组(大)不同的 Prolog 理论代表句子中的依赖关系(顺便说一下,我将这些 Prolog 代码存储在一个文本文件中) - 我只想找到那些与用户定义的目标子句匹配的理论。

例如我有这样的 Prolog 代码:

rel("nsubjpass","seen","It",S):-S is 1.
rel("aux","seen","can",S):-S is 1.
rel("auxpass","seen","be",S):-S is 1.
...
rel("prep", X, Y, S):-rel("dobj", Z, X, SCORE1), rel("prep", Z, Y, SCORE2), S is SCORE1*SCORE2.
...
rel(_,_,_, S):-S is 0.0001.

我想搜索这样的目标子句:

?- rel("nsubj", WRONG, "Russell", SCORE1), 
rel("nsubj", WRONG, "Russell", SCORE2),
... ,
rel("dobj",DOING,SOMETHING, SCORE9).

如果我对理论做一个简单的类似于 foreach 的循环,搜索时间会随着理论数量的增加而变慢,所以我必须引入一些优化。

我的想法是创建一个倒排索引,我可以在其中维护每个术语的频率,以及它们出现的理论的 ID。然后在搜索时,我会先过滤掉不需要的理论,否则不会包含在结果中。

在信息检索领域是否有其他经过良好尝试的方法或好的模式和算法可以很好地处理这个问题?

最佳答案

我将其写为答案而不是评论,因为评论非常有限。

首先,如果您确实打算使用 Prolog,那么做一些研究是值得的

  1. 语言本身:
    • 它的优点和缺点是什么?
    • 我可以在惯用的 Prolog 中实现我的目标吗(是否已经解决了类似的问题)
  2. 不同的实现:
    • 与其他实现相比,特定实现提供了什么
    • 将一个实现与其他语言连接起来有多容易

经过一开始的短暂挣扎,我一直只使用 SWI-Prolog,所以我有偏见。但是 SWI 提供了一个非常完整、通用、相当高效的实现、优秀的文档,并且是完全开源的。

继续,您似乎正在使用 Prolog 事实来表示您的数据。 Prolog 形式的事实:

foo(a,b,1).
foo(a,d,10).
...

构建Prolog 数据库。大多数实现都提供了某种事实索引,因此像“给我‘foo’和‘a’作为第一个参数”这样的查询:

?- foo(a,B,X).
B = b, X = 3;
B = d, X = 10.

对所有可用事实进行非常有效的搜索,并返回与您的查询匹配的事实。您绝对不需要使用 for 循环搜索事实,或编写事实搜索算法。但是请注意,事实索引可能因实现而异。

此外,根据您的用例,将字符串表示为 Prolog 原子可能是最佳解决方案,既高效又易于实现。看here ,尤其是接近尾声时,对于原子上的一些非常有用的“字符串操作”谓词。

继续前进,在 Prolog 中编写自上而下、从左到右的解析器是该语言的一个特性,使用 DCG(明确子句文法)。

最后,如果您熟悉 Java 并且只需要添加一个高效(动态)数据存储,Java + SQL 可能是更好的选择。

关于algorithm - Prolog中信息检索的性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16104540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com