2017-12-09 4 views
1

プロローグに文パーサを作成しました。プロローグ文パーサからの情報の扱い

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, _). 

Iが出力になることを言及する必要があります: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)))))).

それは成功した。これは私が文を解析するために使用しているコードです ?- sentence([input,sentence,here],Parse).

...と入力されている文章を解析し、

事前定義された語彙:det(a), adj(very), adj(young), noun(boy), verb(loves), det(a), adj(manual), noun(problem)を使用します。

私がしたいことは、単語を "subject、verb、and object"の3つの異なるカテゴリに分ける述語に解析出力を渡すことです。

(1)被験者は、最初の2つの形容詞とその後の名詞を保持します。

(2)動詞は「動詞句」から動詞を保持します。

(3)オブジェクトは、 "動詞句"の形容詞と名詞を保持します。

すべての決定子は無視する必要があります。

たとえば、出力に形容詞を探す述語が必要です。

私はこれを試してみるために多くのことを試しましたが、どれも動作しません。どんな助けでも大歓迎です。

+0

[OK]をクリックします。私は文を解析するために使用しているコードを追加しました。 – Joseph

答えて

2

私は2回目の試みをしています。

出力は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))))))になります。 [...]私がしたいのは、 という単語が、単語 " "を "subject、verb、および オブジェクト"という3つの異なるカテゴリに分ける述語に渡されるということです。

あなたの構造から単語のリストにマップするような手順を書くことができます。

handle_sent(sentence(NP1,vp(V,NP2)),Subj,Verb,Obj) :- 
    handle_np(NP1,Subj), handle_verb(V,Verb), handle_np(NP2,Obj). 

handle_verb(verb(V),[V]). 

handle_np(np(_,np2(adj(A),np2(noun(N)))),[A,N]). 
handle_np(np(_,np2(adj(A1),np2(adj(A2),np2(noun(N))))),[A1,A2,N]). 

これが生成します。

?- handle_sent(...,Subj,Verb,Obj). 
Subj = [very,young,boy] 
Verb = [loves] 
Obj = [manual,problem] 
1

以下DCGは、この動作を生成します。

?- s(Sem,[a,young,boy,loves,a,manual,problem],[]). 
Sem = [noun(boy),verb(loves),noun(problem)] 

あなたの文法中のいくつかの問題があります。あなたの3番目のnp句は、それ自身を直接呼び出します(間に入力を消費しません)。これは、無限ループを意味します。あなたが投稿した文法は、あなたの出力を作り出すことができないようです(非常に若い)。とにかく、ここでDCGは次のとおりです。

s(Sem) --> 
    np(Sem1), vp(Sem2), { append(Sem1,Sem2,Sem) }. 

np(Sem) --> 
    [W], { det(W) }, 
    np2(Sem). 
np(Sem) --> 
    np2(Sem). 
np(Sem) --> 
    np2(Sem1), 
    pp(Sem2), { append(Sem1,Sem2,Sem) }. 

np2([noun(W)]) --> 
    [W], { noun(W) }. 
np2(Sem) --> 
    [W], { adj(W) }, 
    np2(Sem). 

pp(Sem) --> 
    [W], { prep(W) }, 
    np(Sem). 

vp([verb(W)]) --> 
    [W], { verb(W) }. 
vp(Sem) --> 
    [W], { verb(W) }, 
    np(Sem0), { Sem = [verb(W)|Sem0] }. 
vp(Sem) --> 
    [W], { verb(W) }, 
    pp(Sem0), { Sem = [verb(W)|Sem0] }. 

追加:あなたが修飾(例えば形容詞)を処理したい場合は、その後すぐに非現実的になる簡単な明白なソリューションがあり、その後、論理を追加するような、より一般的な技術は、あります変数はnpになります。

np(X,Sem) --> 
    [W], { det(W) }, 
    np2(X,Sem). 
np(X,Sem) --> 
    np2(X,Sem). 
np(X,Sem) --> 
    np2(X,Sem1), 
    pp(Sem2), { append(Sem1,Sem2,Sem) }. 

np2(X,[noun(X,W)]) --> 
    [W], { noun(W) }. 
np2(X,[adj(X,W)|Sem]) --> 
    [W], { adj(W) }, 
    np2(X,Sem). 

この変数(X)がインスタンス化されることはありません、それだけで一緒に意味の名詞句の一部をリンクするのに役立ちます。

?- s(Sem,[a,young,boy,loves,a,manual,problem],[]). 
Sem = [adj(_A,young),noun(_A,boy),verb(loves),adj(_B,manual),noun(_B,problem)] 

さらにさまざまな可能性があります。良い本はGazdar &メリッシュ、プロローグでNLP、とNorvig、AIプログラミングパラダイム(あなたが話す場合はLispの)だけでなく、ペレイラ& Shieber、プロローグと自然言語解析です。

追加#2:もう一度質問を読んだ後、の3つの別のリストが実際にほしいと思った。問題ない。

s(L1,L2,L3) --> 
    np(_,L1), vp(L2,L3). 

np(X,L) --> 
    [W], { det(W) }, 
    np2(X,L). 
np(X,L) --> 
    np2(X,L). 
np(X,L) --> 
    np2(X,L), 
    pp(_). 

np2(X,[noun(X,W)]) --> 
    [W], { noun(W) }. 
np2(X,[adj(X,W)|L]) --> 
    [W], { adj(W) }, 
    np2(X,L). 

pp(L) --> 
    [W], { prep(W) }, 
    np(_,L). 

vp([verb(W)],[]) --> 
    [W], { verb(W) }. 
vp([verb(W)],L) --> 
    [W], { verb(W) }, 
    np(_,L). 
vp([verb(W)],L) --> 
    [W], { verb(W) }, 
    pp(L). 

出力:

| ?- s(L1,L2,L3,[a,young,boy,loves,a,manual,problem],[]). 
L1 = [adj(_A,young),noun(_A,boy)], 
L2 = [verb(loves)], 
L3 = [adj(_B,manual),noun(_B,problem)] ? 

多分あなたは論理変数を必要としませんが、一人の若い少年が関与マニュアル問題を愛している」のように、あなたは、より複雑な修飾子を持つことができる一方、赤いボルトと白い立方体 "。次に、変数はどの形容詞がどの名詞を変更するかを追跡します。

+0

私は 'extractnounphrase(np(det(A)、_))'のような別の述部を使用して、これを行うことができますか?私たちが一緒に行くようにする代わりにそれを行う。 – Joseph

+0

これは、現在生成している出力が文法の規則と同型であるため、2つのパーサを持つようなものです。 DCGがはるかに優れています。 –

+0

私はDSGが優れていることを理解していますが(人々は私に言い続けるので)、私はまだこれを学んでいます。私はあなたが私のやり方でそれをやる方法を私に見せることができるかどうか疑問に思っていました。 – Joseph

関連する問題