首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >prolog自然语言分析

prolog自然语言分析
EN

Stack Overflow用户
提问于 2011-04-02 10:30:50
回答 2查看 2K关注 0票数 0

我有一个大学作业要做一个分析自然语言的prolog程序,即它应该输出

代码语言:javascript
复制
P = np(det(the), np2(noun(cat))), vp(verb(sat), pp(prep(on), np(det(the), np2(noun(mat)))))
L = []

当我输入np(the,cat,sat,on,the,mat,P,L)时。

取而代之的是,动词和名词短语被拆分出来,分别出现,比如:

代码语言:javascript
复制
P = np(det(the), np2(noun(cat))),
L = [sat, on, the, mat]

我想知道是否有人能指出我哪里错了,非常感谢,我的代码是:

代码语言:javascript
复制
sentence(Sentence,sentence(np(Noun_Phrase)), (vp(Verb_Phrase))):-
/* so take a sentence (first arg) and parse it into a noun phrase and a verb phase */
    np(Sentence,Noun_Phrase, Rem),
    vp(Rem, Verb_Phrase).

np([X|T],np(det(X),NP2),Rem):-
    det(X),
    np2(T,NP2,Rem).
np(Sentence,Parse,Rem):- np2(Sentence,Parse,Rem).
np(Sentence,np(NP,PP),Rem):-
    np(Sentence,NP,Rem1),
    pp(Rem1,PP,Rem).

np2([H|T],np2(noun(H)),T):- noun(H).  
np2([H|T],np2(adj(H),Rest),Rem):- adj(H),np2(T,Rest,Rem).  
pp([H|T],pp(prep(H),Parse),Rem):-
    prep(H),
    np(T,Parse,Rem).

vp([H|[]],vp(verb(H))):- verb(H).
vp([H|Rest],vp(verb(H),RestParsed),Rem):- verb(H), pp(Rest, RestParsed, Rem).
vp([H|Rest],vp(verb(H),RestParsed),Rem):- verb(H), np(Rest, RestParsed, Rem).

det(the).
det(with).
noun(cat).
noun(mat).
noun(mouse).
noun(rabbit).
noun(moon).
verb(sat).
verb(ate).
verb(ran_away).
prep(on).
adj(big).
adj(fat).
adj(comfy).
adj(yellow).
adj(silvery).
adj(orange).
EN

回答 2

Stack Overflow用户

发布于 2011-04-02 11:00:51

你真的想因为“猫坐在垫子上”而得到NP吗?这不是NP,它是一个完整的句子,不是吗?

其次,我已经有很长一段时间没有用Prolog写东西了。我认为代码应该是这样的:

代码语言:javascript
复制
sentence(S, sentence(np(NP), vp(VP))) :-
    np(S, NP, R),
    vp(R, VP, []). /* Changed here - added the third argument */

np([X | S], np(det(X), NP2), R) :-
    det(X),
    np2(S, NP2, R).
np(S, NP, R) :- 
    np2(S, NP, R).
np(S, np(NP, PP), R) :-
    append(X, Y, S), /* Changed here - otherwise possible endless recursion */
    pp(Y, PP, R),
    np(X, NP, []).

np2([X | R], np2(noun(X)), R) :- 
    noun(X).
np2([X | S], np2(adj(X), NP), R) :- 
    adj(X),
    np2(S, NP, R).

pp([X | S], pp(prep(X), NP), R):-
    prep(X),
    np(S, NP, R).

vp([X | R], vp(verb(X)), R) :- /* Changed here - added the third argument */
    verb(X).
vp([X | S], vp(verb(X), PP), R) :- 
    verb(X), 
    pp(S, PP, R).
vp([X | S], vp(verb(X), NP), R) :- 
    verb(X), 
    np(S, NP, R).

det(the).
det(with).
...

很抱歉更改了名字。我不能以这种方式来处理代码。

票数 1
EN

Stack Overflow用户

发布于 2011-04-02 16:51:52

仔细检查您的代码后,我注意到至少有两个错误。

首先,也是最重要的,你需要更小心地定义你的'vp‘谓词,我注意到你定义了两个不同的版本,它们做的不是一样的事情。你可以看出它们是不同的,因为一个只是2,而另一个是3。

我建议将所有重要的和功能性的'vp‘谓词定义为参数3,保留"Tail“参数,然后使用单个参数2,如下所示:

代码语言:javascript
复制
vp(T, Parse) :- vp(T, Parse, []).

其次,我认为你需要检查一下你是如何在“句子”谓词的定义中嵌套括号的。我想你把其中的几个搞混了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5520728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档