about 4 years ago

1.Introduction

所謂的形式語義學( Formal Semantics ), 是在研究, 如何把自然語言用邏輯形式來表達

例如以下句子

傳統上, 用一皆邏輯 First Order Logic 可以把這個句子表示成這樣

其中, butter 這個邏輯式的predicate, 而 Johntoast 分別是argument, 這個邏輯式表示了 Johntoast 的關係,
當這句話為真的時候,

如果現在句子是這樣, 有個介繫詞片語修飾, 例如:

則可以把 的一階邏輯式,再加入一個論元 (argument) 擴充成這樣

但這方法有個缺點, 就是無法推論 這個邏輯式是否蘊含

而事實上, 這句話蘊含 , 是成立的

照理說, 邏輯式要可以表達這些自然語言中的蘊含關係
因此就要想出一個邏輯表達方法, 也可以讓這些蘊含推論成立

2.Davidsonian event semantics

Davidson 在 1969 年提出了 event 的概念

what adverbial clauses modify is not verbs but the events that certain verbs introduce.
Davidson (1969/1980: 167)

意思就是, 修飾動詞的修飾語, 其實是在修飾這個動詞引出的事件
例如, 針對句子 , 可以把動詞 butter 引出的事件定為 , 並加到 butter的argument,如下:

其中, 式子前面的 表示, 當這個式子成立的時候, 存在 這樣一個事件

然後, 句子 的邏輯式也可以用 event 的概念擴充, 可以把修飾語 with a knife 替換成 , 表示執行這個 eventinstrumentknife , 如下:

來檢查一下邏輯式 是否蘊含

以上蘊含成立

除此之外, 一個動詞可能同時被很多個介繫詞片與修飾, 例如以下句子

不但蘊含 也蘊含

這種句子如果用沒有引入 event 的概念, 用 的傳統邏輯式子, 問題就更大了

這樣的話, 我們就要定義 butter 可以接收很多個argument, 且要定好哪個位置是填給哪一種修飾語用的, 當然, 蘊含 的推論也不成立

event 的概念就簡單很多了, 不用修改到 butter 的argument, 只要把修飾語轉換成修飾 的predicate, 並和 butter 做conjunction, 就可以了, 如下

而且 蘊含 也蘊含

3.Implementation

來載入模組, 實作看看

>>> import nltk.sem.logic as logic
>>> from nltk import Prover9
>>> lgp = logic.LogicParser()

用前面提到的句子和邏輯式子來做練習

, , , 這三句話的邏輯式 , , 分別輸入到LogicParser, 如下:

>>> a1 = lgp.parse('exists e ( butter(John,toast,e))')
>>> a2 = lgp.parse('exists e ( butter(John,toast,e) & instr(e,knife) )')
>>> a3 = lgp.parse('exists e (butter(John,toast,e) & instr(e,knife) & in (e,bathroom) & at(e,midnight) )')

接著來看看句子 的蘊含關係
Prover9() 來證明, 我們把未知值的句子放在第一個argument , 已知為真的句子放在第二個argument中
例如, 想要證明當 為真時, 是否為真, 輸入方法如下:

>>> Prover9().prove(a1, [a2])
True

結果顯示, 當 為真, 必為真, 表示 蘊含

對調

>>> Prover9().prove(a2, [a1])
False

結果顯示, 蘊含 不成立

然後來看看 以及 的蘊含關係

>>> Prover9().prove(a2, [a3])
True
>>> Prover9().prove(a1, [a3])
True

結果顯示, 蘊含 也蘊含

4. Reference

本文參考至以下這本語意學書籍
Semantics: An International Handbook of Natural Language Meaning

← 自然語言處理 -- Hidden Markov Model 自然語言處理 -- Viterbi Algorithm →
 
comments powered by Disqus