2015-01-13 1 views
1

Prolog에서 HMM tagger를 구현하려고 시도하고 있는데, 매우 간단한 튜토리얼과 함께 here을 찾았습니다.Prolog HMM Tagger, 구문 오류, 의문의 여지가있는 프로그램 구조

프롤로그에 대한 완전한 초보자로서 나는 거기에 설명 된 결과를 얻는데 어려움을 겪고 있습니다.

는 지금까지 내가 즉, 파일에 outprob(a,det,0.300).transprob(start,det,0.30).의 모든 데이터를 서면으로 작성했습니다, 또한 내가 즉, 더 아래 같은 파일의 HMM 기능,

most_probable_sequence(Words,Ss) :- 
    findall(PS,sequence(Words,1-[start],PS)PSs), 
    max_key(PSs,P-Ss1), 
    reverse(Ss1,[start|Ss]). 

sequence([],PSs,PSs). 
sequence([Word|Words],P1-[S1|Ss],PSs) :- 
    outprob(Word,S2,Po), 
    transprob(S1,S2,Pt), 
    P2 is Po*Pt*P1, 
    sequence(Words,P2-[S2,S1|Ss],PSs). 

I를 포함했다 ['filename.pl']. 명령을 사용 프롤로그에 파일을로드하고, I는 다음과 같은 에러 메시지 수신 :

:40:42: Syntax error: Operator expected 

선 (40, 42)에 참조되어 있음? findall(PS,sequence(Words,1-[start],PS)PSs),reverse(Ss1,[start|Ss]).

내 직관을 지정하는 행에 해당하는 것입니다

그렇다면, 나는 아마 다시 한 번 더 아래로 동일한 파일에, 내 자신에 findall()reverse()에 대한 함수를 정의 할 필요가 있다는 것입니다. 그 맞습니까?

이 문제가 해결되면

, 내가 프롤로그 인터페이스에서 다음 명령을 입력하여 결과를 찾을 것이 사실이다 : 추신 포함

?- most_probable_sequence([he,can,can,a,can],Sequence). 

을 표면 상 매우 유사하다 비터 비 술래를 보여줍니다 링크 HMM에 구현하려고하는 중이지만 HMM은 하위 페이지 'More ...'아래 페이지의 맨 아래에 있습니다. 링크에 따르면 "구현을 자세히 설명하는 짧은 문서가 있습니다 ".

+0

오타의 결과이다

?- most_probable_hmm_path([he,can,can,a,can],Sequence). Sequence = [pron, aux, v, det, n]. 

. 'findall (PS, sequence (Words, 1 - [시작], PS), PS), ' – CapelliC

+0

그 점을 발견해 주셔서 감사합니다. Linux에서 실행되는 Prolog 용 IDE가 있습니까? 오류를 해결했습니다. 이제 경고 메시지 '39 : Singleton variables : [P]'가 나타납니다. 원래 질문에서 지정한 프롬프트와 함께 코드를 실행하려고 시도했지만 예외가 발생했습니다. 더 구체적으로 '예외 : (7) max_key ([5.10300000000002e-13- [aux, det ... 등] 무엇이 그것을 일으키는 지 알고 있습니까? 그리고 그것을 해결하기 위해 무엇을 할 수 있습니까? –

답변

1

@CapelliC가 지적했듯이 오류는 오타 였지만 사실은이 코드의 문제는 처음 상상했던 것보다 더 교활합니다.

수정 오타로 코드를 실행할 때 이제 오류는 말한다하도록 생성됩니다 일련의, 등등

Exception: (7) max_key([5.103000000002e-13-[aux, det, aux, aux, pron 

다음에 그리고있다

ERROR: most_probable_sequence/2: Undefined procedure: max_key/2 

매우 큰 숫자의 태그와 연관된 태그 목록.

첫 번째 오류는 most_probable_sequence() 함수에 입력 된 양과 관련이 있다고 말하는 것이 옳은가요?

예외의 원인은 무엇입니까? 그 숫자의 크기?

:39: 
Singleton variables: [P] 

는이 문제 함께 할 수있는 뭔가가 가능 : 또한 경고가 *

말한다 파일의 때 첫 번째로드를 생성?

+0

P는 PS, 내 생각 엔. max_key/2 정의되지 않은, 원래 코드를 개발하는 데 사용되는 프롤로그 내장 된 수 있는지 모르겠다. 것 같아요 ... – CapelliC

+0

max_key에 대한 모든 문서를 보지 못했지만 찾는 중입니다. 방금 시도했는데 작동하지 않았지만 max_assoc이라는 항목에 대한 참조가있었습니다. 태그에 대한 확률 값을 저장하는 것이 무엇을하려는 것일까 요? 나중에 확률이 가장 높은 것을 선택할 수 있습니다 –

+0

예, 정의를 복구하려고했습니다 ... 아마도 나중에 게시 할게요 – CapelliC

1

하지 확인 결과는 의미를 (하지만 할 것 같다)는

outprob(a,det,0.300). 
outprob(can,aux,0.010). 
outprob(can,v,0.005). 
outprob(can,n,0.001). 
outprob(he,pron,0.070). 

transprob(start,det,0.30).   transprob(v,det,0.36). 
transprob(start,aux,0.20).   transprob(v,aux,0.01). 
transprob(start,v,0.10).   transprob(v,v,0.01). 
transprob(start,n,0.10).   transprob(v,n,0.26). 
transprob(start,pron,0.30).   transprob(v,pron,0.36). 
transprob(det,det,0.20).   transprob(n,det,0.01). 
transprob(det,aux,0.01).   transprob(n,aux,0.25). 
transprob(det,v,0.01).    transprob(n,v,0.39). 
transprob(det,n,0.77).    transprob(n,n,0.34). 
transprob(det,pron,0.01).   transprob(n,pron,0.01). 
transprob(aux,det,0.18).   transprob(pron,det,0.01). 
transprob(aux,aux,0.10).   transprob(pron,aux,0.45). 
transprob(aux,v,0.50).    transprob(pron,v,0.52). 
transprob(aux,n,0.01).    transprob(pron,n,0.01). 
transprob(aux,pron,0.21).   transprob(pron,pron,0.01). 

most_probable_hmm_path(Words,Path) :- 
     probable_paths(Words,[1-[start]],PPaths), 
     keymax(PPaths,_P-Path1), 
     reverse(Path1,[start|Path]). 

probable_paths([],PPaths,PPaths). 
probable_paths([Word|Words],PPaths0,PPaths) :- 
     findall(PPath, 
      (outprob(Word,Tag2,PL), 
      findall(P2-[Tag2,Tag1|Tags], 
       (member(P1-[Tag1|Tags],PPaths0), 
       transprob(Tag1,Tag2,PT), 
       P2 is PL*PT*P1), 
      AllPaths), 
      keymax(AllPaths,PPath)), 
     PPaths1), 
     probable_paths(Words,PPaths1,PPaths). 

keymax(AllPaths,U-V) :- 
    aggregate(max(N,P), member(N-P,AllPaths), max(U,V)). 
+0

나는 지옥에 빠질 것입니다. 내가 태양을 보았 더라면 당신은 햇볕이 잘 드는 그리스 신이에요. 괜찮으 시다면 당신이 그 문제에 접근 한 방식으로 저를 따라 다니십시오. 나는 당신이 그와 같은 해결책을 찾을 수 있도록 당신 머리에 무슨 일이 일어나고 있는지 알고 싶어합니다. –

+0

Torbjorn '페이지 링크를 따라 코드를 잡고 간단한 maxkey/2를 추가했습니다. 물론 IDE와 디버깅 도구를 제공하는 SWI-Prolog를 사용합니다. 그러나 여기서 간단히 얻은 첫 번째 결과를 게시했습니다. 디버깅하거나 코드를 이해할 필요가 없습니다. – CapelliC

+0

코드가 어떻게 작동하는지 더 잘 이해하기 위해 출력물을 여러 단계에서 인쇄하는 방법을 알고 있습니까? {printRowValues ​​(keymax, N)를 사용하여 시도했다. - N은 1 + len (keymax)이다. } 하지만 그건 효과가 없습니다. –