解析变形的非词序语言(例如拉丁语)

时间:2013-07-30 05:58:41

标签: prolog dcg

Introduction to Latin Wikiversity为例,考虑一下句子:

the sailor gives the girl money

我们可以使用DCG在Prolog中处理这个问题,这个规则非常优雅:

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属于主题名词短语,但属于对象的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)

这似乎可行,但只要我没有递归;一旦我引入了一个从属条款,我就会以不健康的方式重用主题。

我只是没有看到如何从非单词序列句子到解析树。有没有一本书可以讨论这个问题?感谢。

3 个答案:

答案 0 :(得分:2)

Here我找到了一个相关的资源(免费语言顺序语言的PERMUTATIONAL GRAMMAR)。 似乎值得一读(嘿,我们都非常讨厌那些强制性的拉丁语课程,早在60年代!)。

在附录中有一个要测试的实现。

我忘了指出Covington的自由词序解析器(它只是一个草图......) 您可以在PRoNTo工具包中找到(为了完整起见,我在此报告,但我很确定您已经了解它)。

答案 1 :(得分:1)

似乎(从我的非常生锈的高中拉丁语记忆中提取),你的词法分析器需要查看每个标记(单词)并使用适当的元数据归属每个标记:

  • 单词的类型(名词,动词,形容词等)
  • 名词,变体,性别,案例和数字
  • 动词,结合,人,数,紧张,声音和情绪
  • 形容词,性别,变化,数字......
  • 等。 (这是很长一段时间LOL)。

然后你的解析应该以元数据为指导,因为这就是把所有东西联系在一起的东西。

答案 2 :(得分: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)]).