我想用 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。然后在搜索时,我会首先过滤掉那些不会包含在结果中的不必要的理论。
信息检索领域有没有其他行之有效的方法或好的模式和算法可以很好地处理这个问题?