使用NLTK简化逻辑表达式

我对使用自然语言工具包(NLTK)有疑问.我正在尝试制作一个应用程序,以将自然语言问题翻译成它的逻辑表示形式,并查询数据库.

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

exists z2.(owner(fido, z2) & (z0 = z2))

但是我需要将其简化如下:

owner(fido, z0)

是否有另一种方法可以根据需要减少句子?

解决方法:

在NLTK中,simple()执行beta减少(according to the book)并不是您所需要的.当您采用某些策略时,您所要问的仅适用于定理证明.在这种情况下,您要么需要知道最终期望得到什么,要么知道可以应用哪种公理来获得这种结果.

NLTK中的定理证明者为Prover9,它提供了检查蕴含关系的工具.基本上,您只能检查是否存在从表达式列表(前提)到目标表达式步数有限的证明.例如,在您的情况下,结果如下:

============================== 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中的可用工具,并且想要使用正则表达式手动检查此特定模式.您可能可以使用正则表达式执行类似的操作(我不赞成,但是让我尝试一下我讨厌的策略):

def my_nasty_tactic(exp):
    parameter = re.findall(r'exists ([^.]*)\..*', exp)
    if len(parameter) == 1:
        parameter = parameter[0]
        substitution = re.findall(r'&[ ]*\([ ]*([^ ]+)[ ]*=[ ]*'+parameter+r'[ ]*\)', exp)
        if len(substitution) == 1:
             substitution = substitution[0]
             exp_abs = re.sub(r'exists(?= [^.]*\..*)', "\ ", exp)
             exp_abs = re.sub(r'&[ ]*\([ ]*' + substitution + '[ ]*=[ ]*'+parameter+r'[ ]*\)', '', exp_abs)
             return read_expr('(%s)(%s)' % (exp_abs, substitution)).simplify()

然后,您可以像这样使用它:

my_nasty_tactic('exists z2.(owner(fido, z2) & (z0 = z2))')
# <ApplicationExpression owner(fido,z0)>

相关文章

python方向·数据分析   ·自然语言处理nlp   案例:中...
原文地址http://blog.sina.com.cn/s/blog_574a437f01019poo....
ptb数据集是语言模型学习中应用最广泛的数据集,常用该数据集...
 Newtonsoft.JsonNewtonsoft.Json是.Net平台操作Json的工具...
NLP(NaturalLanguageProcessing)自然语言处理是人工智能的一...
做一个中文文本分类任务,首先要做的是文本的预处理,对文本...