解析变形非

以拉丁维基大学导论为例,请考虑以下句子:

the sailor gives the girl money

我们可以在Prolog中用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属于主语名词短语时,属于宾语名词短语的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)

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

我只是没有看到如何从一个非字序句子到一个分析树。 有没有讨论这个问题的书? 谢谢。


在这里,我找到了一个相关的资源(用于自由词的语言的永久语法)。 似乎值得一读(嘿,我们都非常讨厌这些强制拉丁课程,早在60年代!)。

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

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


看起来像(从我高中拉丁语的极其生疏的记忆中抽象出来),你的词法分析器需要查看每个令牌(单词)并将每个令牌赋予适当的元数据:

  • 单词的类型(名词,动词,形容词等)
  • 用于名词,变体,性别,个案和数字
  • 适用于动词,动词,人物,数字,时态,语态和心情
  • 对于形容词,性别,变体,数字......
  • 等等(这是很长一段时间的大声笑)。
  • 然后,您的解析应该以元数据为指导,因为这是将所有内容联系在一起的原因。


    你可以使用这个元语句:

    unsorted([]) --> [].
    unsorted([H|T]) -->
        H, unsorted(T).
    unsorted([H|T]) -->
        unsorted(T), H.
    
    sentence(s(NP, VP)) --> unsorted([noun_phrase(NP), verb_phrase(VP)]).
    
    链接地址: http://www.djcxy.com/p/73123.html

    上一篇: Parsing inflected non

    下一篇: How to use Delphi's built