如何将prolog解析树转换回逻辑句子

时间:2013-07-20 10:57:12

标签: parsing prolog declarative dcg

我设法为给定的句子构建了解析树,这里的句子是:“那个人回家了。”

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=theN(Subject)=manV=wentN(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].

谢谢Mathee

1 个答案:

答案 0 :(得分:3)

更简单的方法是访问树,在您感兴趣的符号上“硬编码”。

这是一个更通用的实用程序,它使用(=..)/ 2来捕获树的命名部分:

part_of(T, S, R) :- T =.. [F|As],
    (   F = S,
        R = T
    ;   member(N, As),
        part_of(N, S, R)
    ).

?- part_of(s(np(det(the), n(man)), vp(v(went), np(n(home)))),np,P).
P = np(det(the), n(man)) ;
P = np(n(home)) ;
false.

它是一种成员/ 2,仅适用于树木。顺便说一下,我不明白你问题的第一部分:你为什么要在语法树上使用短语/ 2?通常语法(短语/ 2的第一个参数)意味着构建来自“原始”字符流的语法树...