什么是`lexpr`和`ApplicationExpression` nltk?

时间:2015-01-16 01:01:58

标签: python nlp nltk semantics first-order-logic

expr究竟是什么意思,以下r'/ F x.x是什么意思?什么是Application Expression?

from nltk.sem.logic import *
lexpr = Expression.fromstring

zero = lexpr(r'\F x.x')
one = lexpr(r'\F x.F(x)')
two = lexpr(r'\F x.F(F(x))')
three = lexpr(r'\F x.F(F(F(x)))')
four = lexpr(r'\F x.F(F(F(F(x))))')
succ = lexpr(r'\N F x.F(N(F,x))')
plus = lexpr(r'\M N F x.M(F,N(F,x))')
mult = lexpr(r'\M N F.M(N(F))')
pred = lexpr(r'\N F x.(N(\G H.H(G(F)))(\u.x)(\u.u))')
v1 = ApplicationExpression(succ, zero).simplify()

2 个答案:

答案 0 :(得分:6)

请参阅http://goo.gl/zog68knltk.sem.logic.Expression是:

  

“”“这是所有逻辑表达式”“”

的基本抽象对象

nltk中实现了许多类型的逻辑表达式。见第1124行,ApplicationExpression是:

  

此类用于表示两种相关类型的逻辑表达式。

     

第一个是谓词表达式,例如“P(x,y)”。谓词表达式由FunctionVariableExpression或。ConstantExpression组成       AbstractVariableExpression作为谓词,表达式列表作为参数。

     

第二个是将一个表达式应用于另一个表达式,例如       “(\ x.dog(X))(菲多)”。

     

谓词表达式被视为应用程序表达式的原因是       可以替换表达式的变量表达式谓词       使用另一个表达式,例如LambdaExpression,这意味着       应该认为谓词应用于论证。

     

逻辑表达式读取器将始终在应用程序表达式中使用参数。       因此,“\ x y.see(x,y)(john,mary)”将在内部表示为       “((\ x y。(见(x))(y))(约翰))(玛丽)”。这简化了内部因素       在应用程序中总会有一个参数。

     

str()方法通常会打印curried的应用程序       表达式。一个例外是应用程序表达式       真的是一个谓词表达式(即底层函数是一个       >>> from nltk.sem.logic import * >>> lexpr = Expression.fromstring >>> zero = lexpr(r'\F x.x') >>> succ = lexpr(r'\N F x.F(N(F,x))') >>> v1 = ApplicationExpression(succ, zero).simplify() >>> v1 <LambdaExpression \F x.F(x)> >>> print v1 \F x.F(x) )。这意味着上面的例子       将被返回为“(\ x y.see(x,y)(john))(mary)”。

我不是正式逻辑方面的专家,但上面的代码试图声明一个逻辑函数变量x:

{{1}}

有关速成课程,请参阅http://theory.stanford.edu/~arbrad/slides/cs156/lec2-4.pdf以及针对lambda表达式的nltk速成课程,请参阅http://www.cs.utsa.edu/~bylander/cs5233/nltk-intro.pdf

答案 1 :(得分:1)

您正在查看相当复杂的工具包的一小部分。我试着通过以下网络上的一些研究提供一些背景知识。或者,如果您愿意,可以跳到“直接答案”部分。我会尝试回答你引用的具体部分的问题,但我不是哲学逻辑或自然语言处理方面的专家。我读的越多,我似乎就越少知道,但我已经包含了大量有用的参考资料。

工具/原则/介绍

的描述

您发布的代码是针对python(NLTK)的自然语言工具包的逻辑模块的回归测试的子系列。此工具包在fairly accessible academic paper here中描述,似乎由该工具的作者编写。它描述了工具包的动机和编写逻辑模块 - 简而言之,它有助于自动解释自然语言。

您发布的代码定义了许多逻辑形式(我在链接的论文中引用了LF)。 LF覆盖First order predicate logic中的语句,并结合lambda运算符(即第一顺序lambda calculus)。我不会试图在这里完整地描述一阶谓词逻辑。有lambda calculus here.

的教程

代码来自regression tests的一组the howto page(即工具箱在简单的,已知的exmample测试中正确运行的演示),演示如何使用它来演示工具箱{ {3}}。它们是nltk工具包中simple arithmetic operations的精确编码。

前四个是lambda演算中的前四个数字(this approach to arithmetic via lambda calculus (Wikipedia link))。接下来的四个是算术运算符 - succ(后继),plus(加法),mult(乘法)和pred(除法),你没有得到的测试和这些一起去,所以此刻,你只需要一些LF,然后是Lambda演算的一个例子,结合其中两个LF(succzero)得到{{1} }。正如您已将应用 v1添加到succ,结果应为1 - 这就是他们在howto页面上测试的内容 - 即zero应评估{ {1}}。

直接回答python位

让我们逐一浏览您发布的代码元素。

v1 == one是生成逻辑EXPRessions的函数 - 它是True的别名Church Encoding

需要一个字符串参数。字符串前面的r告诉python将其解释为 原始字符串文字 。出于这个问题的目的 - 这意味着我们不必逃避lexpr符号

在字符串中,Expression.fromstring是lambda运算符。

\表示函数,\是lambda演算中的绑定变量

F或点运算符将绑定函数与表达式/抽象主体分开

所以 - 在问题中引用你引用的字符串:

x

lexpr = Expression.fromstring。教会编码是相当抽象的,很难让你的头脑。这Church Encoding - 我想我已经开始明白了...不幸的是你选择的例子是零,而我可以解决的是,这是一个定义,而不是你可以得到的东西。它无法在任何有意义的意义上“评估为0”。 tutorial might help。我无法对其严谨/正确性发表评论。

  

教会数字是一个带有一个参数的过程,而该参数本身就是另一个也带有一个参数的过程。过程零表示通过返回将其输入过程应用零次的过程来表示整数0

最后,.正在使用一个表达式并应用于另一个表达式,在这种情况下,将r'/F x.x' (成功者)应用于ApplicationExpression。这恰恰称为lambda演算中的应用程序

<强> 编辑:

写下所有这些,然后发现隐藏在nltk网站上的This is the simplest explanation I've found - book特别适用于此问题,其中Chapter 10描述了lambda演算。