【说话处理惩罚与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等默示原子,句子。然则我们须要超出命题逻辑到一个更有发挥解析力的器材,可以或许看到里面的根蒂根基的句子,也就是一阶逻辑。

    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: