-
【说话处理惩罚与Python】10.1天然说话懂得\10.2命题逻辑
添加时间:2013-6-4 点击量: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查询:
>>> 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]
True
2、为了简化实验,我们先忽视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等默示原子,句子。然则我们须要超出命题逻辑到一个更有发挥解析力的器材,可以或许看到里面的根蒂根基的句子,也就是一阶逻辑。
我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》