2013-07-20 55 views
5

我设法为给定的句子构建解析树,这里是句子:“这个人回家了。”如何将序言树解析树转换回逻辑句子

T = s(np(det(the), n(man)), vp(v(went), np(n(home)))) 

1)如何在这个上使用phrase/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

+0

“短语/ 2”涉及DCG规则和某种类型的输入列表。你可以在任何方向使用它,但是如果你既没有解析也没有生成一个列表,它可能不适合这份工作。它在另一个答案中适用于我,因为Lisp s表达式本质上是列表。 –

+0

请检查我稍后添加的代码。我遵循你的方法。它在SWI prolog中起作用。你能否建议对代码进行改进以匹配几个语法模式,并为给定句子确定语法模式。 – Mathee

+0

'白色'是标签和空格; 'space'包括那些,所以你只需要'空白'中的空格// 0。我将从'simplify/2'中移除'Result',并将列表作为第二个参数,并且在此规则中没有任何内容。否则它对我来说很好。令人惊讶的是,这并不是我认为你所要求的,但它对我来说并不坏。 :) –

回答

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的第一个参数)意味着构建来自'原始'字符流的语法树...

+0

很高兴从你的答案中知道事情。但我需要将给定的树与语法模式进行比较,在这里我可以将人作为主题,把家当作物体。 为此,我从http://stackoverflow.com/questions/14953960/how-to-translate-a-sentence-in-a-logical-language-using-prolog/17759505#17759505得到了这个短语的想法。 – Mathee