2011-04-05 12 views
1

나는 프롤로그에서 자연어 구문 분석 작업을 설정했습니다. 지금까지 나는 어느 정도 프로그램을 작동 시켰습니다. 지금까지 [the,cat,sat,on,the,mat]의 목록을 입력하면 sentence(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(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). 

답변

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). 같은 프로그램을 사용하여. 그런 다음 모든 방향으로 프로그램을 사용할 수 있습니다. 예를 들어 주어진 목록이 문장 구조에 해당하는지 여부도 확인하십시오. 화면에 출력을 작성하는 경우 그렇게 쉽게 할 수 없습니다.

B를 구문 분석하는 동안

+1

, 감사합니다. 그러나 나는 오히려 시간이 문제이기 때문에 나는 이미 가지고있는 것의 표기법을 바꾸지 않을 것이다. ( – MartinM

0

당신은

A) (=) 예를 들어 사용하여 일반 방문을 쓰기)

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