2013-07-30 12 views
7

Biorąc przykład z Introduction to Latin Wikiversity Rozważmy zdanie:analizowaniem odmieniane języki inne niż słowo zamówienie (np łacińskie)

the sailor gives the girl money 

Możemy obsłużyć to w Prologu z DCG dość elegancko z tego stosu zasad:

sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP). 
noun_phrase(Noun) --> det, noun(Noun). 
noun_phrase(Noun) --> noun(Noun). 
verb_phrase(vp(Verb, DO, IO)) --> verb(Verb), noun_phrase(IO), noun_phrase(DO). 

det --> [the]. 
noun(X) --> [X], { member(X, [sailor, girl, money]) }. 
verb(gives) --> [gives]. 

i widzimy, że to działa:

?- phrase(sentence(S), [the,sailor,gives,the,girl,money]). 
S = s(sailor, vp(gives, money, girl)) ; 

wydaje mi się, że jest DCG naprawdę zoptymalizowany do obsługi języków w kolejności alfabetycznej. Jestem w całkowitej utraty, jak obsługiwać to zdanie łac

nauta dat pecuniam puellae 

Oznacza to samo (marynarz dziewczyna daje pieniądze), ale kolejność słowo jest całkowicie za darmo: wszystkie z tych permutacji także znaczy dokładnie to samo:

nauta dat puellae pecuniam 
nauta puellae pecuniam dat 
puellae pecuniam dat nauta 
puellae pecuniam nauta dat 
dat pecuniam nauta puellae 

pierwszą rzeczą, która przychodzi mi do głowy jest wyliczyć permutacje:

sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP). 
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP). 

ale to nie wystarczy, ponieważ podczas nauta należeć s do rzeczownika fraza rzeczownikowa, puellae, która należy do frazy rzeczownikowej obiektu, podporządkowana jest czasownikowi, ale może ją poprzedzić. Zastanawiam się, czy powinienem podejść do niego budując jakąś nadana liście pierwszy tak:

?- attributed([nauta,dat,pecuniam,puellae], Attributed) 
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)] 

Wydaje się to okaże się konieczne (i nie widzę dobry sposób, aby to zrobić), ale gramatycznie to popycha jedzenie na moim talerzu. Może mógłbym napisać parser z jakimś przerażającym-DCG non ustrojstwo jak ten:

parse(s(NounPhrase, VerbPhrase), Attributed) :- 
    parse(subject_noun_phrase(NounPhrase, Attributed)), 
    parse(verb_phrase(VerbPhrase, Attributed)). 

parse(subject_noun_phrase(Noun), Attributed) :- 
    member(noun(Noun,nom), Attributed). 

parse(object_noun_phrase(Noun), Attributed) :- 
    member(noun(Noun,acc), Attributed) 

Wydaje się, że to działa, ale tylko tak długo, jak nie mam rekurencji; jak tylko wprowadzę podrzędną klauzulę, zamierzam ponownie użyć przedmiotów w niezdrowy sposób.

Po prostu nie widzę sposobu, w jaki można uzyskać od zdania niepasującego do drzewa parse. Czy istnieje książka, która to omawia? Dzięki.

Odpowiedz

2

Here Znalazłem powiązany zasób (GRAMATYKA PERMUTACYJNA DLA DARMOWYCH JĘZYKÓW WORD ORDER). Wydaje się, że warto przeczytać (Hej, wszyscy tak bardzo nienawidziliśmy tych obowiązkowych lekcji łaciny, w latach 60.!).

W załączniku znajduje się wdrożenie do przetestowania.

zapomniałem podkreślić Covington”free-word-order parsera (to tylko szkic ...) można znaleźć w PRoNTo Toolkit (zgłosić tutaj Uzupełniająco, ale jestem już dość pewno o tym wiecie).

+0

ja nie, rzeczywiście. –

1

Wydaje się (rysunek z mojego ekstremalnie zardzewiałą pamięci liceum Łacińskiej), Twój leksykalny analizator musi wyglądać na każdym tokena (Word) i przypisać każdy żeton z odpowiednim meta-danych:

  • typu słowa (rzeczownik, czasownik, przymiotnik itp.)
  • Dla rzeczowników deklinacji, płeć, numer sprawy i
  • Dla czasowników, koniugacji, osoby, liczby, napiętej, głosu i nastroju
  • Dla przymiotników deklinacji, płeć, ilość ...
  • etc. (To był długi czas LOL).

W takim razie należy przeanalizować metadane, ponieważ to wszystko łączy.

+0

Tak, oczywiście, ale gdy już to zrobię, nadal nie będę miał żadnych żetonów w jakiejś określonej kolejności, co zdaje się kolidować z założeniem DCG. –

1

Można użyć tej meta klauzuli:

unsorted([]) --> []. 
unsorted([H|T]) --> 
    H, unsorted(T). 
unsorted([H|T]) --> 
    unsorted(T), H. 

sentence(s(NP, VP)) --> unsorted([noun_phrase(NP), verb_phrase(VP)]). 
Powiązane problemy