2013-07-20 24 views
5

Udało mi się zbudować drzewo parsowane dla danego zdania i oto jest ono dla zdania: "Mężczyzna poszedł do domu".Jak przekonwertować drzewo prologu do logicznego zdania

T = s(np(det(the), n(man)), vp(v(went), np(n(home)))) 

1) Jak używać wyrażenia/2 na ten temat?

How to translate a sentence in a logical language using prolog? - jest podobny do tego, czego potrzebuję, ale jego rozwiązanie nie działa na mnie.

2) Chcę to odwzorować za pomocą wzoru gramatycznego i uzyskać etykietę słów. Det=the, N(Subject)=man, V=went, N(Object)=home

Czy istnieje sposób mapować tego drzewa z danego zbioru drzewiastych struktur i identyfikacji gramatyki. Jak korzystać z drzewa parse do identyfikacji tematu, czasownika, obiektu, wzoru gramatycznego i wygenerowania zdania w języku docelowym.


Zmieniano później .. Próbowałem ten kod i daje znaczną odpowiedź. Wszelkie sugestie dotyczące tego kodu.

sent("(s(np(n(man))) (vp(v(went)) (np(n(home)))))"). 

whitespace --> [X], { char_type(X, white) ; char_type(X, space) }, whitespace. 
whitespace --> []. 

char(C) --> [C], { char_type(C, graph), \+ memberchk(C, "()") }. 

chars([C|Rest]) --> char(C), chars(Rest). 
chars([C]) --> char(C). 

term(T) --> chars(C), { atom_chars(T, C) }. 
term(L) --> list(L). 

list(T) --> "(", terms(T), ")". 

terms([]) --> []. 
terms([T|Terms]) --> term(T), whitespace, !, terms(Terms). 

simplify([s,[np, [n,[Subject]]], [vp,[v,[Verb]],[np,[n,[Object]]]]],Result) :- Result = [Subject,Verb,Object]. 

Dzięki Mathee

+0

'phrase/2' odnosi się do reguły DCG i listy wejściowej. Możesz go używać w dowolnym kierunku, ale jeśli nie analizujesz ani nie tworzysz listy, prawdopodobnie nie jest to właściwe narzędzie do pracy. W drugiej odpowiedzi zadziałało dla mnie, ponieważ wyrazy s Lisp są z natury listami. –

+0

proszę sprawdzić kod dodałem później. Postępowałem zgodnie z twoją metodą. i działało w prologu SWI. Czy możesz zaproponować ulepszenia kodu pasujące do kilku szablonów gramatycznych i zidentyfikować wzór gramatyczny dla danego zdania. – Mathee

+0

'white' jest tabulatorem i spacją; "spacja" obejmuje je, więc potrzebujesz tylko "spacji" w "spacji" // 0 ". Chciałbym usunąć 'Result' z' upraszczać/2' i po prostu umieścić listę jako drugi argument i nie ma ciału na tej zasadzie. W przeciwnym razie wygląda mi dobrze. Zaskakujące, to nie było to, o czym myślałem, że pytasz w ogóle, ale nie wygląda mi to źle. :) –

Odpowiedz

3

prostszy sposób zrobić to drogą wizytę drzewa, „sztywno” na symbolach jesteś zainteresowany.

Oto bardziej ogólne narzędzie, które zastosowań (=..)/2 do przechwytywania nazwie części drzewa:

part_of(T, S, R) :- T =.. [F|As], 
    ( F = S, 
     R = T 
    ; member(N, As), 
     part_of(N, S, R) 
    ). 

?- part_of(s(np(det(the), n(man)), vp(v(went), np(n(home)))),np,P). 
P = np(det(the), n(man)) ; 
P = np(n(home)) ; 
false. 

Jest to rodzaj członka/2, tuż za drzewami. BTW Nie rozumiem pierwszej części twojego pytania: dlaczego chcesz użyć frazy/2 na drzewie składni? Zwykle gramatyka (pierwszy argument do wyrażenia/2) ma na celu zbudować drzewo składniowe ze strumienia "surowych" znaków ...

+0

Cieszę się, że wiem rzeczy z twojej odpowiedzi. Ale muszę porównać dane drzewo z wzorcem gramatycznym, w którym mogę uzyskać człowieka jako przedmiot i dom jako obiekt. Po to mam pomysł frazy z http://stackoverflow.com/questions/14953960/how-to-translate-a-sentence-in-a-logical-language-using-prolog/17759505#17759505. – Mathee