1

Prolog で自然言語解析のタスクを設定しました。これまでのところ、プログラムはある程度機能しています。これまで のところsentence(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(mat))))))、リストを入力すると印刷されますが[the,cat,sat,on,the,mat]、これで問題ありません。

私がしなければならない次のタスクは、文からキーワードを抽出することです。つまり、名詞句から名詞を抽出し、動詞句から動詞を抽出し、動詞句から名詞を抽出することで、リストを返すことができます: [cat,sat 、マット]。私はこれに非常にこだわっているので、誰かが私に手を差し伸べてくれませんか。ありがとう!

私の現在のコードは次のとおりです。

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).
4

2 に答える 2

4

複数の連続したwrite/1呼び出しの代わりに、の使用を検討してformat/2ください。ただし、通常は副作用を避け、関係の観点から考えるのが最善です。文構造とリストの関係を説明するには、DCG 表記の使用を検討してください。

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

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

そして、のようなプログラムを使用し?- phrase(sentence(S), List).ます。次に、プログラムをあらゆる方向に使用できます。たとえば、特定のリストが文の構造に対応しているかどうかを確認することもできます。これは、出力を画面に書き込むだけでは簡単に行うことができません。

于 2011-04-05T12:17:57.067 に答える
0

あなたは出来る

a) 解析中にリストを作成する

b)構築された構文ツリーを逐語的に訪問します

c) (たとえば) =.. ( univ ) と findall を使用して一般的な訪問を記述します。

a) 現在のプログラムを変更し、構文ツリーの後にリストを追加します。

b) のスケッチ (bボーリング用ステー):

extract(sentence(NP, VP), L) :-
 extract(NP, A), extract(VP, B), append(A, B, L)
extract(noun_phrase(_, noun(N)), [N]).
etc etc...

一般的な訪問:

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).
于 2011-11-29T23:02:51.407 に答える