3.5 德语中的格和性别

与英语相比,德语的协议具有相对丰富的形态。例如,在德语中定冠词根据格、性别和数量变化,如3.1所示。

表 3.1:

德语定冠词的形态范式

  1. >>> nltk.data.show_cfg('grammars/book_grammars/german.fcfg')
  2. % start S
  3. # Grammar Productions
  4. S -> NP[CASE=nom, AGR=?a] VP[AGR=?a]
  5. NP[CASE=?c, AGR=?a] -> PRO[CASE=?c, AGR=?a]
  6. NP[CASE=?c, AGR=?a] -> Det[CASE=?c, AGR=?a] N[CASE=?c, AGR=?a]
  7. VP[AGR=?a] -> IV[AGR=?a]
  8. VP[AGR=?a] -> TV[OBJCASE=?c, AGR=?a] NP[CASE=?c]
  9. # Lexical Productions
  10. # Singular determiners
  11. # masc
  12. Det[CASE=nom, AGR=[GND=masc,PER=3,NUM=sg]] -> 'der'
  13. Det[CASE=dat, AGR=[GND=masc,PER=3,NUM=sg]] -> 'dem'
  14. Det[CASE=acc, AGR=[GND=masc,PER=3,NUM=sg]] -> 'den'
  15. # fem
  16. Det[CASE=nom, AGR=[GND=fem,PER=3,NUM=sg]] -> 'die'
  17. Det[CASE=dat, AGR=[GND=fem,PER=3,NUM=sg]] -> 'der'
  18. Det[CASE=acc, AGR=[GND=fem,PER=3,NUM=sg]] -> 'die'
  19. # Plural determiners
  20. Det[CASE=nom, AGR=[PER=3,NUM=pl]] -> 'die'
  21. Det[CASE=dat, AGR=[PER=3,NUM=pl]] -> 'den'
  22. Det[CASE=acc, AGR=[PER=3,NUM=pl]] -> 'die'
  23. # Nouns
  24. N[AGR=[GND=masc,PER=3,NUM=sg]] -> 'Hund'
  25. N[CASE=nom, AGR=[GND=masc,PER=3,NUM=pl]] -> 'Hunde'
  26. N[CASE=dat, AGR=[GND=masc,PER=3,NUM=pl]] -> 'Hunden'
  27. N[CASE=acc, AGR=[GND=masc,PER=3,NUM=pl]] -> 'Hunde'
  28. N[AGR=[GND=fem,PER=3,NUM=sg]] -> 'Katze'
  29. N[AGR=[GND=fem,PER=3,NUM=pl]] -> 'Katzen'
  30. # Pronouns
  31. PRO[CASE=nom, AGR=[PER=1,NUM=sg]] -> 'ich'
  32. PRO[CASE=acc, AGR=[PER=1,NUM=sg]] -> 'mich'
  33. PRO[CASE=dat, AGR=[PER=1,NUM=sg]] -> 'mir'
  34. PRO[CASE=nom, AGR=[PER=2,NUM=sg]] -> 'du'
  35. PRO[CASE=nom, AGR=[PER=3,NUM=sg]] -> 'er' | 'sie' | 'es'
  36. PRO[CASE=nom, AGR=[PER=1,NUM=pl]] -> 'wir'
  37. PRO[CASE=acc, AGR=[PER=1,NUM=pl]] -> 'uns'
  38. PRO[CASE=dat, AGR=[PER=1,NUM=pl]] -> 'uns'
  39. PRO[CASE=nom, AGR=[PER=2,NUM=pl]] -> 'ihr'
  40. PRO[CASE=nom, AGR=[PER=3,NUM=pl]] -> 'sie'
  41. # Verbs
  42. IV[AGR=[NUM=sg,PER=1]] -> 'komme'
  43. IV[AGR=[NUM=sg,PER=2]] -> 'kommst'
  44. IV[AGR=[NUM=sg,PER=3]] -> 'kommt'
  45. IV[AGR=[NUM=pl, PER=1]] -> 'kommen'
  46. IV[AGR=[NUM=pl, PER=2]] -> 'kommt'
  47. IV[AGR=[NUM=pl, PER=3]] -> 'kommen'
  48. TV[OBJCASE=acc, AGR=[NUM=sg,PER=1]] -> 'sehe' | 'mag'
  49. TV[OBJCASE=acc, AGR=[NUM=sg,PER=2]] -> 'siehst' | 'magst'
  50. TV[OBJCASE=acc, AGR=[NUM=sg,PER=3]] -> 'sieht' | 'mag'
  51. TV[OBJCASE=dat, AGR=[NUM=sg,PER=1]] -> 'folge' | 'helfe'
  52. TV[OBJCASE=dat, AGR=[NUM=sg,PER=2]] -> 'folgst' | 'hilfst'
  53. TV[OBJCASE=dat, AGR=[NUM=sg,PER=3]] -> 'folgt' | 'hilft'
  54. TV[OBJCASE=acc, AGR=[NUM=pl,PER=1]] -> 'sehen' | 'moegen'
  55. TV[OBJCASE=acc, AGR=[NUM=pl,PER=2]] -> 'sieht' | 'moegt'
  56. TV[OBJCASE=acc, AGR=[NUM=pl,PER=3]] -> 'sehen' | 'moegen'
  57. TV[OBJCASE=dat, AGR=[NUM=pl,PER=1]] -> 'folgen' | 'helfen'
  58. TV[OBJCASE=dat, AGR=[NUM=pl,PER=2]] -> 'folgt' | 'helft'
  59. TV[OBJCASE=dat, AGR=[NUM=pl,PER=3]] -> 'folgen' | 'helfen'

正如你可以看到的,特征<cite>objcase</cite>被用来指定动词支配它的对象的格。下一个例子演示了包含支配与格的动词的句子的分析树。

  1. >>> tokens = 'ich folge den Katzen'.split()
  2. >>> cp = load_parser('grammars/book_grammars/german.fcfg')
  3. >>> for tree in cp.parse(tokens):
  4. ... print(tree)
  5. (S[]
  6. (NP[AGR=[NUM='sg', PER=1], CASE='nom']
  7. (PRO[AGR=[NUM='sg', PER=1], CASE='nom'] ich))
  8. (VP[AGR=[NUM='sg', PER=1]]
  9. (TV[AGR=[NUM='sg', PER=1], OBJCASE='dat'] folge)
  10. (NP[AGR=[GND='fem', NUM='pl', PER=3], CASE='dat']
  11. (Det[AGR=[NUM='pl', PER=3], CASE='dat'] den)
  12. (N[AGR=[GND='fem', NUM='pl', PER=3]] Katzen))))

在开发语法时,排除不符合语法的词序列往往与分析符合语法的词序列一样具有挑战性。为了能知道在哪里和为什么序列分析失败,设置load_parser()方法的trace参数可能是至关重要的。思考下面的分析故障:

  1. >>> tokens = 'ich folge den Katze'.split()
  2. >>> cp = load_parser('grammars/book_grammars/german.fcfg', trace=2)
  3. >>> for tree in cp.parse(tokens):
  4. ... print(tree)
  5. |.ich.fol.den.Kat.|
  6. Leaf Init Rule:
  7. |[---] . . .| [0:1] 'ich'
  8. |. [---] . .| [1:2] 'folge'
  9. |. . [---] .| [2:3] 'den'
  10. |. . . [---]| [3:4] 'Katze'
  11. Feature Bottom Up Predict Combine Rule:
  12. |[---] . . .| [0:1] PRO[AGR=[NUM='sg', PER=1], CASE='nom']
  13. -> 'ich' *
  14. Feature Bottom Up Predict Combine Rule:
  15. |[---] . . .| [0:1] NP[AGR=[NUM='sg', PER=1], CASE='nom'] -> PRO[AGR=[NUM='sg', PER=1], CASE='nom'] *
  16. Feature Bottom Up Predict Combine Rule:
  17. |[---> . . .| [0:1] S[] -> NP[AGR=?a, CASE='nom'] * VP[AGR=?a] {?a: [NUM='sg', PER=1]}
  18. Feature Bottom Up Predict Combine Rule:
  19. |. [---] . .| [1:2] TV[AGR=[NUM='sg', PER=1], OBJCASE='dat'] -> 'folge' *
  20. Feature Bottom Up Predict Combine Rule:
  21. |. [---> . .| [1:2] VP[AGR=?a] -> TV[AGR=?a, OBJCASE=?c] * NP[CASE=?c] {?a: [NUM='sg', PER=1], ?c: 'dat'}
  22. Feature Bottom Up Predict Combine Rule:
  23. |. . [---] .| [2:3] Det[AGR=[GND='masc', NUM='sg', PER=3], CASE='acc'] -> 'den' *
  24. |. . [---] .| [2:3] Det[AGR=[NUM='pl', PER=3], CASE='dat'] -> 'den' *
  25. Feature Bottom Up Predict Combine Rule:
  26. |. . [---> .| [2:3] NP[AGR=?a, CASE=?c] -> Det[AGR=?a, CASE=?c] * N[AGR=?a, CASE=?c] {?a: [NUM='pl', PER=3], ?c: 'dat'}
  27. Feature Bottom Up Predict Combine Rule:
  28. |. . [---> .| [2:3] NP[AGR=?a, CASE=?c] -> Det[AGR=?a, CASE=?c] * N[AGR=?a, CASE=?c] {?a: [GND='masc', NUM='sg', PER=3], ?c: 'acc'}
  29. Feature Bottom Up Predict Combine Rule:
  30. |. . . [---]| [3:4] N[AGR=[GND='fem', NUM='sg', PER=3]] -> 'Katze' *

跟踪中的最后两个Scanner行显示 den 被识别为两个可能的类别:Det[AGR=[GND='masc', NUM='sg', PER=3], CASE='acc']Det[AGR=[NUM='pl', PER=3], CASE='dat']。我们从3.2中的语法知道Katze的类别是N[AGR=[GND=fem, NUM=sg, PER=3]]。因而,产生式NP[CASE=?c, AGR=?a] -&gt; Det[CASE=?c, AGR=?a] N[CASE=?c, AGR=?a]中没有变量?a的绑定,这将满足这些限制,因为KatzeAGR值将不与 den 的任何一个AGR值统一,也就是[GND='masc', NUM='sg', PER=3][NUM='pl', PER=3]