NLTK:从树值转换为 Lambda 函数表示法
NLTK: Converting from tree values to Lambda function notation
我正在尝试将一个句子转换为 lambda 函数符号,例如在第 4.2 节中看到的 http://www.nltk.org/book/ch10.html。使用代码我可以将句子转换为语义值并使用上下文无关语法解析句子但是将句子转换为 lambda 符号的方法是什么。
import nltk
grammar = nltk.CFG.fromstring("""
S -> NP VP
VP -> V NP
V -> "is"
Adj -> "Chewing"
Coj -> "and"
Nom -> Adj Nom | N
NP -> Nom Coj NP | N
Det -> "a" | "an" | "the" | "my"
N -> "gum" | "candy" | "thrilling"
P -> "in" | "on" | "by" | "with"
""")
sent = "Chewing gum and candy is thrilling".split()
rd_parser = nltk.RecursiveDescentParser(grammar, )
for tree in rd_parser.parse(sent):
print (tree)
简答:您必须编写自己的语义语法。没有简单的方法可以将 CFG 映射到 lambda 演算。
更长的答案:
从 CFG 中,最接近语义树的是为非终结符指定语义特征,SQLCFG 示例很好地指导了如何去做,请参阅第 1.1 节。来自 http://www.nltk.org/book/ch10.html:
>>> 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='City FROM city_table'] -> 'cities'
IV[SEM=''] -> 'are'
A[SEM=''] -> 'located'
P[SEM=''] -> 'in'
将 CFG 映射到 lambda 演算,反之亦然,或者从文本中学习这两者仍然是一项值得研究的工作,因此目前尚无明确的方法。
参见 http://dl.acm.org/citation.cfm?id=2052254 和
http://www.computer.org/csdl/proceedings/ictai/2008/3440/02/3440b135-abs.html
我正在尝试将一个句子转换为 lambda 函数符号,例如在第 4.2 节中看到的 http://www.nltk.org/book/ch10.html。使用代码我可以将句子转换为语义值并使用上下文无关语法解析句子但是将句子转换为 lambda 符号的方法是什么。
import nltk
grammar = nltk.CFG.fromstring("""
S -> NP VP
VP -> V NP
V -> "is"
Adj -> "Chewing"
Coj -> "and"
Nom -> Adj Nom | N
NP -> Nom Coj NP | N
Det -> "a" | "an" | "the" | "my"
N -> "gum" | "candy" | "thrilling"
P -> "in" | "on" | "by" | "with"
""")
sent = "Chewing gum and candy is thrilling".split()
rd_parser = nltk.RecursiveDescentParser(grammar, )
for tree in rd_parser.parse(sent):
print (tree)
简答:您必须编写自己的语义语法。没有简单的方法可以将 CFG 映射到 lambda 演算。
更长的答案:
从 CFG 中,最接近语义树的是为非终结符指定语义特征,SQLCFG 示例很好地指导了如何去做,请参阅第 1.1 节。来自 http://www.nltk.org/book/ch10.html:
>>> 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='City FROM city_table'] -> 'cities'
IV[SEM=''] -> 'are'
A[SEM=''] -> 'located'
P[SEM=''] -> 'in'
将 CFG 映射到 lambda 演算,反之亦然,或者从文本中学习这两者仍然是一项值得研究的工作,因此目前尚无明确的方法。
参见 http://dl.acm.org/citation.cfm?id=2052254 和 http://www.computer.org/csdl/proceedings/ictai/2008/3440/02/3440b135-abs.html