Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用NLTK简化逻辑表达式_Python_Nlp_Nltk - Fatal编程技术网

Python 使用NLTK简化逻辑表达式

Python 使用NLTK简化逻辑表达式,python,nlp,nltk,Python,Nlp,Nltk,我对使用自然语言工具包(NLTK)有疑问。我正在尝试制作一个应用程序,以便将一个自然语言问题转换为它的逻辑表示,并向数据库查询 我在nltk.sem.logic包下使用simplify()方法后得到的结果,得到以下表达式: exists z2.(owner(fido, z2) & (z0 = z2)) 但我需要将其简化如下: owner(fido, z0) 有没有其他方法可以根据我的需要减少句子?在NLTK中,simplify()执行beta reduce(),这不是您需要的。当你运

我对使用自然语言工具包(NLTK)有疑问。我正在尝试制作一个应用程序,以便将一个自然语言问题转换为它的逻辑表示,并向数据库查询

我在nltk.sem.logic包下使用simplify()方法后得到的结果,得到以下表达式:

exists z2.(owner(fido, z2) & (z0 = z2))
但我需要将其简化如下:

owner(fido, z0)
有没有其他方法可以根据我的需要减少句子?

在NLTK中,
simplify()
执行beta reduce(),这不是您需要的。当你运用某些策略时,你所要求的只有在定理证明者的帮助下才可行。在这种情况下,你要么需要知道你最终会得到什么,要么你知道什么样的公理可以用来得到这样的结果

NLTK中的定理证明器提供了检查蕴涵关系的工具。基本上,您只能检查是否存在从表达式列表(前提)到目标表达式的步骤有限的证明。例如,在您的案例中,结果如下:

============================== PROOF =================================

% -------- Comments from original proof --------
% Proof 1 at 0.00 (+ 0.00) seconds.
% Length of proof is 8.
% Level of proof is 4.
% Maximum clause weight is 4.
% Given clauses 0.

1 (exists x (owner(fido,x) & y = x)) # label(non_clause).  [assumption].
2 owner(fido,x) # label(non_clause) # label(goal).  [goal].
3 owner(fido,f1(x)).  [clausify(1)].
4 x = f1(x).  [clausify(1)].
5 f1(x) = x.  [copy(4),flip(a)].
6 -owner(fido,c1).  [deny(2)].
7 owner(fido,x).  [back_rewrite(3),rewrite([5(2)])].
8 $F.  [resolve(7,a,6,a)].

============================== end of proof ==========================
在NLTK python中:

from nltk import Prover9
from nltk.sem import Expression
read_expr = Expression.fromstring
p1 = read_expr('exists z2.(owner(fido, z2) & (z0 = z2))')
c = read_expr('owner(fido, z0)')
result = Prover9().prove(c, [p1])
print(result)
# returns True
更新

如果您坚持使用python中可用的工具,并且希望使用正则表达式手动检查此特定模式。您可能可以使用正则表达式执行类似的操作(我不赞成,但让我们试试我讨厌的策略):

然后你可以这样使用它:

my_nasty_tactic('exists z2.(owner(fido, z2) & (z0 = z2))')
# <ApplicationExpression owner(fido,z0)>
my_astery_策略('exists z2.(所有者(fido,z2)和(z0=z2)))
# 

请注意,要用不受限制的自然语言输入来表达玩具句子,还有很长很长的路要走。为了有一个现实的成功机会,切换到没有真正语义分析的肤浅方法。这只是我正在做的一个练习。输入仅限于英语的一个非常有限的子集。我构建了一个小的基于特征的语法,并使用lambda表达式来获得一个逻辑表达式(我简化的那个),但需要将它进一步简化。有一个数据库,里面有狗的名字和主人,我正试图把这个逻辑表达式连接到数据库,然后得到答案。我现在遇到了一些麻烦,你知道有没有什么书或链接可以让我做到这一点吗?谢谢这更有道理。。。“英语的有限子集”(又称“片段”)与“自然语言问题”截然不同!那就继续吧。我只能建议您学习Prover9文档,或者学习形式语义的介绍(如果您还不熟悉的话)。如果证明是真的,我可以用正则表达式得到期望的结果,对吗?所有包含“exists”的表达式都是相似的。有一个带编号变量的表达式,最后与z0变量相等。我不知道你所说的“得到期望的结果”到底是什么意思,但正则表达式和定理证明并不在一起。你把苹果和摩天大楼混在一起了!我想说的是,为了得到所需的表达式,我可以使用正则表达式从整个表达式中提取“owner(fido,z2)”部分,用z0替换z2,得到我想要的表达式。我需要不带量词的表达式。为了能够使用正则表达式,再加上beta缩减,首先,您需要对正在处理的表达式进行某些假设。我可以给你一个可能的为什么这样做(我的解决方案),但我不知道你是否可以将它放大到所有类型的表达式。
my_nasty_tactic('exists z2.(owner(fido, z2) & (z0 = z2))')
# <ApplicationExpression owner(fido,z0)>