【问题标题】:How to convert prolog parse tree back to a logical sentence如何将prolog解析树转换回逻辑句子
【发布时间】: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=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].

谢谢马西

【问题讨论】:

  • phrase/2 关联 DCG 规则和某种类型的输入列表。您可以在任一方向使用它,但如果您既不解析也不生成列表,它可能不是适合这项工作的工具。它在另一个答案中对我有用,因为 Lisp s 表达式本质上是列表。
  • 请检查我稍后添加的代码。我按照你的方法。它在 SWI prolog 中工作。您能否建议改进代码以匹配多个语法模式并识别给定句子的语法模式。
  • white 是制表符和空格; space 包括那些,所以你只需要whitespace//0 中的space。我会从 simplify/2 中删除 Result 并将列表作为第二个参数,并且在此规则上没有正文。否则对我来说看起来不错。令人惊讶的是,这根本不是我认为你要问的,但对我来说看起来并不坏。 :)
  • 谢谢。我会尝试你的建议。你认为如果我添加更多具有不同模式的简化规则,它会在与给定句子的语法匹配中很好地工作。这是在语言翻译中识别源语言语法语法模式的好方法吗?
  • 我原本以为你有一个 Prolog 解析树,而不是 s 表达式。我认为处理 Prolog 解析树会比这更简单。我认为simplify/2 不会给您带来麻烦,但您会希望积极地重构通用代码并尽可能多地重用。我没有深入做过这种事情,也对你的问题领域了解得不够多,无法推测。试试吧;如果它有效,那就太好了;如果没有,请回来尝试另一种方法。 :)

标签: parsing prolog declarative dcg


【解决方案1】:

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

这是一个更通用的实用程序,它使用 (=..)/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.

它是一种 member/2,仅用于树。顺便说一句,我不明白你问题的第一部分:你为什么要在语法树上使用短语/2?通常,语法(phrase/2 的第一个参数)旨在构建从“原始”字符流中生成语法树...

【讨论】:

  • 很高兴从您的回答中了解情况。但是我需要将给定的树与语法模式进行比较,在那里我可以将 man 作为主体,将 home 作为宾语。为此,我从stackoverflow.com/questions/14953960/… 得到了这个词组想法。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多