从prolog结构中提取单词

从prolog结构中提取单词,prolog,dcg,Prolog,Dcg,我已经被设定了一个在Prolog中进行自然语言解析的任务。到目前为止,我的计划在一定程度上是可行的。到目前为止,如果我输入一个[the,cat,sat,on,the,mat]列表,它将打印句子(名词短语(det(the),np2(名词短语(cat)),动词短语(动词短语(sat),pp(prep(on),名词短语(det(the),np2(名词短语(mat '))),这很好 我要做的下一个任务是从句子中提取关键词,即提取名词短语中的名词、动词短语中的动词和动词短语中的名词,这样我就可以返回一个列

我已经被设定了一个在Prolog中进行自然语言解析的任务。到目前为止,我的计划在一定程度上是可行的。到目前为止,如果我输入一个
[the,cat,sat,on,the,mat]
列表,它将打印
句子(名词短语(det(the),np2(名词短语(cat)),动词短语(动词短语(sat),pp(prep(on),名词短语(det(the),np2(名词短语(mat ')))
,这很好

我要做的下一个任务是从句子中提取关键词,即提取名词短语中的名词、动词短语中的动词和动词短语中的名词,这样我就可以返回一个列表:[cat、sat、mat]。有谁能帮我一个忙,因为我被这件事缠住了。谢谢

我目前的代码是:

sentence(S,sentence((NP), (VP))):-
   nl,
np(S, NP, R),
vp(R, VP, []),
write('sentence('), nl, write('   '), write((NP))
      ,nl,write('    '), write((VP)),nl,write('  ').

np([X | S], noun_phrase(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], verb_phrase(verb(X)), R) :- /* Changed here - added the third argument */
    verb(X).
vp([X | S], verb_phrase(verb(X), PP), R) :-
    verb(X),
    pp(S, PP, R).
vp([X | S], verb_phrase(verb(X), NP), R) :-
    verb(X),
    np(S, NP, R).


det(the).
det(with).
noun(cat).
noun(mat).
verb(sat).
prep(on).
adj(big).

<>而不是多个连续的<代码>写/ 1 < /代码>调用,考虑使用<代码>格式/ 2 < /代码>。然而,通常最好避免副作用,而是从关系的角度考虑。为了描述你的句子结构和列表之间的关系,考虑使用DCG符号:

sentence(sentence(NP, VP)) -->
    np(NP),
    vp(VP).

np(noun_phrase(det(D), np2(noun(N)))) --> [D, N].
... etc.

然后使用类似于
?-短语(句子,列表)的程序。
。然后你可以在所有的方向上使用这个程序,例如,也检查一个给定的列表是否对应于一个句子结构,如果你只是把输出写在屏幕上,那么你就不容易做到。

而不是多个连续的<代码>写/ 1 < /代码>调用,考虑使用<代码>格式/ 2 < /代码>。然而,通常最好避免副作用,而是从关系的角度考虑。为了描述你的句子结构和列表之间的关系,考虑使用DCG符号:

sentence(sentence(NP, VP)) -->
    np(NP),
    vp(VP).

np(noun_phrase(det(D), np2(noun(N)))) --> [D, N].
... etc.
然后使用类似于
?-短语(句子,列表)的程序。
。然后,您可以在各个方向上使用该程序,例如,还可以检查给定列表是否与句子结构相对应,如果您只是将输出写入屏幕,则很难做到这一点。

您可以

a) 在解析时生成列表

b) 对构建的语法树进行逐字访问

c) 使用(例如)=编写一般访问。。(大学)和芬德尔

要遵循a)更改当前程序,请在语法树后添加列表

A草图b)(b用于钻孔的支架):

一般访问:

extract(SynTree, O) :-
  SynTree =.. [F|As],
  findall(R, (member(M, As), extract(M, R)), Rs),
  ((F = noun ; F = verb) -> As = [K], L = [K|Rs] ; L = Rs),
  flatten(L, O).
你可以

a) 在解析时生成列表

b) 对构建的语法树进行逐字访问

c) 使用(例如)=编写一般访问。。(大学)和芬德尔

要遵循a)更改当前程序,请在语法树后添加列表

A草图b)(b用于钻孔的支架):

一般访问:

extract(SynTree, O) :-
  SynTree =.. [F|As],
  findall(R, (member(M, As), extract(M, R)), Rs),
  ((F = noun ; F = verb) -> As = [K], L = [K|Rs] ; L = Rs),
  flatten(L, O).

好的,谢谢你的回复。但是我不想改变我已经拥有的东西的符号,因为时间是一个问题:(好的,谢谢你的回答。但是我不想改变我已经拥有的东西的符号,因为时间是一个问题:(