我在prolog中创建了一个句子解析器 . 它成功解析输入的句子... ?- sentence([input,sentence,here],Parse).
这是我用来解析句子的代码:
np([X|T],np(det(X),NP2),Rem):- /* Det NP2 */
det(X),
np2(T,NP2,Rem).
np(Sentence,Parse,Rem):- np2(Sentence,Parse,Rem). /* NP2 */
np(Sentence,np(NP,PP),Rem):- /* NP PP */
np(Sentence,NP,Rem1),
pp(Rem1,PP,Rem).
np2([H|T],np2(noun(H)),T):- noun(H). /* Noun */
np2([H|T],np2(adj(H),Rest),Rem):- adj(H),np2(T,Rest,Rem).
pp([H|T],pp(prep(H),Parse),Rem):- /* PP NP */
prep(H),
np(T,Parse,Rem).
vp([H| []], vp(verb(H))):- /* Verb */
verb(H).
vp([H|T], vp(verb(H), Rem)):- /* VP PP */
vp(H, Rem),
pp(T, Rem, _).
vp([H|T], vp(verb(H), Rem)):- /* Verb NP */
verb(H),
np(T, Rem, _).
我应该提一下输出结果是: sentence(np(det(a), np2(adj(very), np2(adj(young), np2(noun(boy))))), vp(verb(loves), np(det(a), np2(adj(manual), np2(noun(problem)))))).
使用预定义词汇表: det(a), adj(very), adj(young), noun(boy), verb(loves), det(a), adj(manual), noun(problem)
.
我想要做的是将解析后的输出传递给谓词,谓词将单词分成三个不同的类别,即“主语,动词和对象” .
(1)主语将持有前两个形容词,然后是名词 .
(2)动词将保留动词“动词短语” .
(3)对象将在“动词短语”中保留形容词和名词 .
应忽略所有决定因素 .
例如,我想要一个在输出中寻找形容词的谓词 .
我尝试了许多尝试并使其工作但没有工作 . 任何帮助都感激不尽 .
2 回答
那我正在做第二次尝试 .
您可以编写这样的过程,从您的结构映射到单词列表 .
这会产生:
下面的DCG产生这种行为:
你的语法有一些问题 . 您的第三个
np
子句直接调用自身(不消耗其间的输入),这意味着无限循环 . 您发布的语法似乎无法产生您的输出(非常年轻) . 无论如何,这是DCG:另外:如果你想处理修改(例如形容词),那么有一些简单明显的解决方案很快变得不切实际,然后有更多的通用技术,比如将一个逻辑变量添加到
np
.此变量(
X
)从不实例化,它仅用于链接名词短语的部分含义 .还有其他各种可能性 . 好书包括Gazdar&Mellish,Prolog中的NLP,以及Norvig,AI编程的范例(如果你说Lisp),以及Pereira&Shieber,Prolog和自然语言分析 .
添加#2:再次阅读你的问题,this other question后,我意识到你真的想要 three separate lists . 没问题 .
输出:
现在也许你不需要逻辑变量,但另一方面,你可能有更复杂的修饰符,比如“一个小男孩喜欢涉及红色螺栓和白色立方体的手动问题” . 然后变量将跟踪哪个形容词修改哪个名词 .