Mark Chang's Blog

Machine Learning, Deep Learning and Python

Python Nltk -- Logic 2 : Lambda Calculus

本篇介紹如何用python nltk 的應用,邏輯語意與lambda calculus

1.introduction

邏輯語意學在語意推導方面,通常會用到

使用就可以把一個句子的語意,從個別單字中推導出來

至於 是什麼呢?

簡而言之,lambda calculus是一種數學運算,由以下三種元素組成

,就是把function中的variable拿到前面,加個

是將另一個 放到 後面

然後可以進行一種運算,叫做 ,如下

還有另一種運算叫做 ,其實就是更改變數名稱而已

也是計算理論的一種,和Turing Machine等價

實際上以 實現的程式語言有Functional Programming,例如Lisp或Haskell

2. lambda expression

接著來實作untyped lambda calculus,

首先,載入模組 nltk.sem.logicLogicParser

1
2
>>> import nltk.sem.logic as logic
>>> lgp = logic.LogicParser()

再看看 要用哪個符號

1
2
3
4
>>> logic.binding_ops()
existential    	exists
universal      	all
lambda         	\

要表示lambda 符號,要用 \ 字串

然後,用LogicParser來輸入這個式子:

1
2
3
>>> e1 = lgp.parse(r'\x.P(x)')
>>> print e1
\x.P(x)

3. alpha conversion

再來試試看 :

從以下結果得知, 轉換前和轉換後,在邏輯上是相等

因為只是更改變數名稱而已

1
2
3
4
5
6
>>> e2 = e1.alpha_convert(logic.Variable('z'))
>>> print e2
\z.P(z)

>>> e1 == e2
True

4. beta reduction

接著,來看看

舉一個自然語言的例子,例如 Gary walks. 這個句子,用邏輯語意可以表示成

根據Principle of Compositionality,

句子的語意是由單字的語意所組成的(但實際上還是有例外,例如片語)

推導出這個句子的語意,可由單字的語意推導出來,

walks 的語意是

Gary 的語意是

Gary walks 的語意是

接著來實作看看

1
2
3
4
>>> e3 = lgp.parse(r'\x.walks(x)(Gary)')
>>> e4 = e3.simplify()
>>> print e4
walks(Gary)

再舉一個例子,例如 Gary sees Mary. 這個句子, sees 是及物動詞

及物動詞,是表示一個主詞和受詞的關係,

可用 First Order LogicRelation 來表示

sees 的語意為

Gary sees Mary. 的語意是

接著,輸入nltk看看

1
2
3
4
5
6
>>> e5 = lgp.parse(r'\x \y.see(x,y)(Gary)(Mary)')
>>> print e5
((\x y.see(x,y))(Gary))(Mary)

>>> print e5.simplify()
see(Gary,Mary)

還有其他的輸入方式,結果都一樣

1
2
3
4
>>> e6 = lgp.parse(r'\x \y.see(x,y)(Gary,Mary)')
>>> e7 = lgp.parse(r'\x y.see(x,y)(Gary,Mary)')
>>> e8 = lgp.parse(r'\x y.see(x,y)(Gary)(Mary)')
>>> e9 = lgp.parse(r'(\x y.see(x,y)(Gary))(Mary)')

結果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> print e6
((\x y.see(x,y))(Gary))(Mary)

>>> print e7
((\x y.see(x,y))(Gary))(Mary)

>>> print e8
((\x y.see(x,y))(Gary))(Mary)

>>> print e9
((\x y.see(x,y))(Gary))(Mary)

>>> e6 == e7 == e8 == e5
True

5.further reading

想要瞭解 , 請參考http://en.wikipedia.org/wiki/Lambda_calculus

想要看看 nltk 裡面的 , 請至http://www.nltk.org/howto/logic.html

還有關於邏輯語意的研究,可以參考這本書 Blackburn & Bos’ Representation and Inference for Natural Language

Comments