7

拉丁语维基学院简介为例,考虑以下句子:

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

但这不行,因为whilenauta属于主语名词短语,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)

这似乎可行,但前提是我没有递归;一旦我引入一个从句,我就会以一种不健康的方式重用主题。

我只是不知道如何从非词序句子到解析树。有书讨论这个吗?谢谢。

4

3 回答 3

2

在这里我找到了一个相关的资源(PERMUTATIONAL GRAMMAR FOR FREE WORD ORDER LANGUAGES)。似乎值得一读(嘿,我们都非常讨厌那些强制性的拉丁语课程,早在 60 年代!)。

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

我忘了指出 Covington 的自由词序解析器(它只是一个草图......)你可以在PRONTo工具包中找到(为了完整起见,我在这里报告,但我相当确定你已经知道它)。

于 2013-07-30T09:27:40.683 回答
1

似乎(从我对高中拉丁语极其生疏的记忆中汲取灵感),您的词法分析器需要查看每个标记(单词)并使用适当的元数据为每个标记分配属性:

  • 词的类型(名词、动词、形容词等)
  • 对于名词、变格、性别、格和数
  • 用于动词、变位、人称、数字、时态、语态和语气
  • 对于形容词、性别、变格、数字...
  • 等等(已经很久了,哈哈)。

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

于 2013-07-30T18:38:30.733 回答
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)]).
于 2014-07-22T20:43:08.713 回答