【语言处理与Python】10.1自然语言理解\10.2命题逻辑
10.1自然語言理解
查詢數據庫
如果有人提出一個問題:
Which country is Athens in?
得到的回答應該是:
Greece.
這個數據可以通過數據庫語言得到答案:
SELECT Country FROM city_table WHERE City= 'athens'這里有一個文法,可以把句子轉換成SQL語句:
>>>nltk.data.show_cfg('grammars/book_grammars/sql0.fcfg') %start S S[SEM=(?np+ WHERE+ ?vp)] -> NP[SEM=?np]VP[SEM=?vp] VP[SEM=(?v+ ?pp)] -> IV[SEM=?v] PP[SEM=?pp] VP[SEM=(?v+ ?ap)] -> IV[SEM=?v] AP[SEM=?ap] NP[SEM=(?det+ ?n)] -> Det[SEM=?det]N[SEM=?n] PP[SEM=(?p+ ?np)] -> P[SEM=?p]NP[SEM=?np] AP[SEM=?pp]-> A[SEM=?a]PP[SEM=?pp] NP[SEM='Country="greece"']-> 'Greece' NP[SEM='Country="china"']-> 'China' Det[SEM='SELECT']-> 'Which' | 'What' N[SEM='CityFROMcity_table'] -> 'cities' IV[SEM=''] -> 'are' A[SEM='']-> 'located' P[SEM='']-> 'in' 這使我們能夠分析SQL查詢: >>>from nltk import load_parser >>>cp = load_parser('grammars/book_grammars/sql0.fcfg') >>>query ='What cities are located in China' >>>trees = cp.nbest_parse(query.split()) >>>answer = trees[0].node['sem'] >>>q= ' '.join(answer) >>>print q SELECT City FROM city_table WHERE Country="china"要達到能夠從句子到后來的生成的數據庫SQL語句,也就是獨立于任何的查詢語言,我們應該建立一個經典的邏輯的標準解釋。
邏輯形式更加的抽象,更加的通用。
自然語言、語義和邏輯
一個句子集W的模型是某種情況的形式化表示,其中w中的所有句子都為真。
看下面這個圖:
段落的域D(我們當前關心的所有實體)是個體的一個集合,而當集合從D建立,關系也被確立。
例如:
域D包括3個孩子,Stefan、Klaus和Evi,分別用s、k和e表示。記為D= {s,k,e}。
表達式boy是包含Stefan和Klaus的集合,表達式girl是包含Evi的集合,表達式is running是包含Stefan和Evi的集合。
10.2命題邏輯
我們要設計一種邏輯語言,使推理更加的明確。
[Klaus chased Evi]and [Evi ran away] 例如這句話,φ和ψ替代(8)中的兩個子句,并用&替代對應的英語詞and的邏輯操作:φ&ψ。這就是這句話的邏輯形式。
下面的標重,指定了包含一些運算符的公式為真的條件。iff作為if and only if(當且僅當)的縮寫。
注意蘊含這個運算符:
形式(P ->Q)的公式是為假只有當P為真并且Q為假時。如果P為假(比如說,P對應Themoonis madeofgreen cheese)而Q為真(比如說,Q對應Twoplus two equa ls four)那么P -> Q的結果為真。
NLTK中的inference模塊通過一個第三方定理證明器Prover9的接口,可以進行邏輯證明。
例如:
SnF表示:Sylvania is to the north of Freedonia。
Fns表示:Freedonia is to the north of Sylvania。
>>>lp =nltk.LogicParser() >>>SnF= lp.parse('SnF') >>>NotFnS= lp.parse('-FnS') >>>R= lp.parse('SnF -> -FnS') >>>prover= nltk.Prover9() >>>prover.prove(NotFnS,[SnF, R]) True一個命題邏輯的模型,需要為每個可能的公式分配值True或False.
我們可以來簡單做一個實驗:
1、先為每個命題符號分配一個值
>>>val = nltk.Valuation([('P',True),('Q', True),('R', False)])我們可以查看這個值的:
>>>val['P'] True2、為了簡化實驗,我們先忽略dom和g的設置
>>>dom =set([]) >>>g= nltk.Assignment(dom)3、使用val來初始化模型m
>>>m=nltk.Model(dom, val)4、每個模型都有一個evaluate()方法,可以確定邏輯表達式。例如:
>>>print m.evaluate('(P&Q)',g) True >>>print m.evaluate('-(P&Q)',g) False >>>print m.evaluate('(P&R)',g) False >>>print m.evaluate('(P| R)',g) True現在,我們只是局限在用字母P、Q等表示原子,句子。但是我們需要超越命題邏輯到一個更有表現力的東西,能夠看到里面的基本的句子,也就是一階邏輯。
轉載于:https://www.cnblogs.com/createMoMo/archive/2013/06/04/3116613.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【语言处理与Python】10.1自然语言理解\10.2命题逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 MongoDB 上模拟事务操作来实现
- 下一篇: DB2下载