本篇介紹如何用python nltk 的應用,邏輯語意與lambda calculus
1.introduction
邏輯語意學在語意推導方面,通常會用到
使用就可以把一個句子的語意,從個別單字中推導出來
至於 是什麼呢?
簡而言之,lambda calculus是一種數學運算,由以下三種元素組成
是
是 ,就是把function中的variable拿到前面,加個
是將另一個 放到 後面
然後可以進行一種運算,叫做 ,如下
還有另一種運算叫做 ,其實就是更改變數名稱而已
也是計算理論的一種,和Turing Machine等價
實際上以 實現的程式語言有Functional Programming,例如Lisp或Haskell
2. lambda expression
接著來實作untyped lambda calculus,
首先,載入模組 nltk.sem.logic
和 LogicParser
>>> import nltk.sem.logic as logic
>>> lgp = logic.LogicParser()
再看看 要用哪個符號
>>> logic.binding_ops()
existential exists
universal all
lambda \
要表示lambda 符號,要用 \
字串
然後,用LogicParser
來輸入這個式子:
>>> e1 = lgp.parse(r'\x.P(x)')
>>> print e1
\x.P(x)
3. alpha conversion
再來試試看 :
從以下結果得知, 轉換前和轉換後,在邏輯上是相等
因為只是更改變數名稱而已
>>> 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 的語意是
接著來實作看看
>>> e3 = lgp.parse(r'\x.walks(x)(Gary)')
>>> e4 = e3.simplify()
>>> print e4
walks(Gary)
再舉一個例子,例如 Gary sees Mary. 這個句子, sees 是及物動詞
及物動詞,是表示一個主詞和受詞的關係,
可用 First Order Logic 的 Relation 來表示
sees 的語意為
而 Gary sees Mary. 的語意是
接著,輸入nltk看看
>>> 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)
還有其他的輸入方式,結果都一樣
>>> 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)')
結果如下:
>>> 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