2013-07-30 33 views
7

以從Introduction to Latin Wikiversity例如,考慮了一句:解析活用非詞序語言(如拉丁語)

the sailor gives the girl money 

我們可以在序言與DCG用這堆規則處理這個相當優雅:

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

而且我們看到,這個工程:

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

在我看來,該是DCG真正爲處理詞序語言而優化。我在一個完全不知如何處理這個拉丁句子:

nauta dat pecuniam puellae 

這意味着同樣的事情(水手給女孩錢),但詞序是完全免費的:所有這些排列也意思是完全一樣的東西:

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

發生在我的第一件事是枚舉排列:

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

,但是這不會做,因爲雖然nauta屬於s到主語名詞短語,puellae屬於對象名詞短語從屬於動詞,但可以在它之前。我不知道我是否應該首先建立某種原因列表,像這樣來解決:

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

這似乎是它會變成是必要的(我沒有看到一個很好的辦法做到這一點),但從語法上講,它是在我的盤子上推動食物。也許我可以寫了某種可怕的非DCG玩意兒像這樣的解析器:

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) 

這似乎是它的工作,但只要只因爲我沒有遞歸;只要我介紹一個從屬條款,我就會以不健康的方式重用主題。

我只是看不出如何從一個非單詞順序句子到一個分析樹。有沒有討論這個問題的書?謝謝。

回答

2

Here我找到了一個相關資源(用於自由詞語的語法)。 似乎值得一讀(嘿,我們都非常討厭這些強制拉丁課程,早在60年代!)。

附錄中有一個要測試的實現。

我忘了指出,科文頓」自由詞序解析器(它只是一個草圖......) 可以在PRoNTo工具箱找到(我這裏報到的完整性的緣故,但我確信你已經瞭解它)。

+0

我沒有,真的。 –

1

好像(高中拉丁文我非常生鏽內存圖),你的詞法分析器需要看每個令牌(單詞)和屬性每個令牌與適當的元數據:

  • 類型詞(名詞,動詞,形容詞等))
  • 對於名詞,變格,性別,情況和數量
  • 對於動詞,接合,人稱,數,時態,語態和情緒
  • 爲形容詞,性別,變格,數...
  • 等。 (這是很長一段時間的LOL)。

然後,您的解析應該以元數據爲指導,因爲這是將所有內容聯繫在一起的原因。

+0

是的,很明顯,但是一旦我有了這些,我仍然不會有任何特定順序的代幣,這似乎是擊敗了DCG的前提。 –

1

您可以使用此元子句:

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

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