【发布时间】:2013-07-20 10:57:11
【问题描述】:
我设法为给定句子构建了解析树,这就是句子:“男人回家了。”
T = s(np(det(the), n(man)), vp(v(went), np(n(home))))
1) 如何在此使用短语/2?
How to translate a sentence in a logical language using prolog? - 与我需要的类似,但它的解决方案对我不起作用。
2)我想用语法模式映射它并获取单词标签。
Det=the、N(Subject)=man、V=went、N(Object)=home
有没有办法用给定的树结构映射这棵树并识别语法。 如何使用解析树来识别主语、动词、宾语、语法模式并生成目标语言句子。
稍后编辑.. 我试过这段代码,它给出了相当多的答案。有关此代码的任何建议。
sent("(s(np(n(man))) (vp(v(went)) (np(n(home)))))").
whitespace --> [X], { char_type(X, white) ; char_type(X, space) }, whitespace.
whitespace --> [].
char(C) --> [C], { char_type(C, graph), \+ memberchk(C, "()") }.
chars([C|Rest]) --> char(C), chars(Rest).
chars([C]) --> char(C).
term(T) --> chars(C), { atom_chars(T, C) }.
term(L) --> list(L).
list(T) --> "(", terms(T), ")".
terms([]) --> [].
terms([T|Terms]) --> term(T), whitespace, !, terms(Terms).
simplify([s,[np, [n,[Subject]]], [vp,[v,[Verb]],[np,[n,[Object]]]]],Result) :- Result = [Subject,Verb,Object].
谢谢马西
【问题讨论】:
-
phrase/2关联 DCG 规则和某种类型的输入列表。您可以在任一方向使用它,但如果您既不解析也不生成列表,它可能不是适合这项工作的工具。它在另一个答案中对我有用,因为 Lisp s 表达式本质上是列表。 -
请检查我稍后添加的代码。我按照你的方法。它在 SWI prolog 中工作。您能否建议改进代码以匹配多个语法模式并识别给定句子的语法模式。
-
white是制表符和空格;space包括那些,所以你只需要whitespace//0中的space。我会从simplify/2中删除Result并将列表作为第二个参数,并且在此规则上没有正文。否则对我来说看起来不错。令人惊讶的是,这根本不是我认为你要问的,但对我来说看起来并不坏。 :) -
谢谢。我会尝试你的建议。你认为如果我添加更多具有不同模式的简化规则,它会在与给定句子的语法匹配中很好地工作。这是在语言翻译中识别源语言语法语法模式的好方法吗?
-
我原本以为你有一个 Prolog 解析树,而不是 s 表达式。我认为处理 Prolog 解析树会比这更简单。我认为
simplify/2不会给您带来麻烦,但您会希望积极地重构通用代码并尽可能多地重用。我没有深入做过这种事情,也对你的问题领域了解得不够多,无法推测。试试吧;如果它有效,那就太好了;如果没有,请回来尝试另一种方法。 :)
标签: parsing prolog declarative dcg