使用 Tiger 语料库进行德语动词词形还原
German verbs lemmatization with Tiger corpus
最近我正在培训构建德语单词词形还原服务。
我找到了很好的文章here
完成文章中描述的所有步骤后,我的服务运行良好,但在测试时我注意到某些动词无法转换为不定式。
例如科赫斯特 -> 科亨。
根本原因是我的词性标注器给了我 'kochst' 的 ADV 而 VVFIN 或至少 V... 因为这是一个动词。
我还发现原始 TIGER 语料库文件不包含 'kochst' 形式,只有 'kocht'.
我不熟悉 conll 格式,但又添加了一行,如下所示
50475_11 kochst kochen _ VVFIN _ number=sg|person=2|tense=pres|mood=ind _ 0 _ -- _ _ _ _
并重新训练标记器但没有成功,请参见下面的列表
>>> import nltk
>>> corp = nltk.corpus.ConllCorpusReader('.', 'tiger_release_aug07.corrected.16012013.conll09',
... ['ignore', 'words', 'ignore', 'ignore', 'pos'],
... encoding='utf-8')
>>>
>>> tagged_sents = corp.tagged_sents()
>>>
>>> from ClassifierBasedGermanTagger.ClassifierBasedGermanTagger import ClassifierBasedGermanTagger
>>> tagger = ClassifierBasedGermanTagger(train=tagged_sents)
>>> tagger.tag(['kochst'])
[('kochst', u'ADV')]
>>>
>>>
>>> tagged_sents[-1]
[(u'kochst', u'VVFIN')]
所以可能是我添加的'kochst'记录不正确或者TIGER语料库不完整(我发现很多第二人称形式的动词都没有)或者我根本不明白这里的东西,如何将词性标注器训练为 return 共轭动词的动词。
'kochst'举个例子,估计还有很多动词不能识别
>>> tagger.tag(['fahre'])
[('fahre', u'XY')]
>>> tagger.tag(['musst'])
[('musst', u'PPER')]
TIGER 只包含报纸文本,因此没有很多非第三人称动词。统计模型将无法了解几乎看不到的动词结尾。
可能有帮助的事情:
选择更好的标注器。您提到的那个具有一组有限的功能,尤其是在前缀和后缀方面。我不熟悉 NLTK 中的所有选项(可能有一些同样好),但作为替代方案,我建议尝试使用土拨鼠进行标记,加上 lemming 进行词形还原,来自 http://cistern.cis.lmu.de,它们相对快速和容易使用。还有很多更新的标注方法可能会更好一些,但很难说出它们之间的比较,因为最近的许多评估都是基于 UD 德国语料库,不幸的是,它的标注质量相对较低。
标注器依赖上下文,因此当您添加一些新的训练数据时,它有助于添加整个句子,或者至少是整个短语。
即使是大型手动注释语料库也不会涵盖大量词形,因此词汇资源对词形还原非常有帮助。我会看一下 Zmorge,一个基于德国维基词典数据的词法分析器。如果您的主要目标是词形还原,我建议您从 Zmorge 之类的东西开始,然后退回到用于歧义或看不见的词的统计模型。
最近我正在培训构建德语单词词形还原服务。
我找到了很好的文章here
完成文章中描述的所有步骤后,我的服务运行良好,但在测试时我注意到某些动词无法转换为不定式。
例如科赫斯特 -> 科亨。 根本原因是我的词性标注器给了我 'kochst' 的 ADV 而 VVFIN 或至少 V... 因为这是一个动词。
我还发现原始 TIGER 语料库文件不包含 'kochst' 形式,只有 'kocht'.
我不熟悉 conll 格式,但又添加了一行,如下所示
50475_11 kochst kochen _ VVFIN _ number=sg|person=2|tense=pres|mood=ind _ 0 _ -- _ _ _ _
并重新训练标记器但没有成功,请参见下面的列表
>>> import nltk
>>> corp = nltk.corpus.ConllCorpusReader('.', 'tiger_release_aug07.corrected.16012013.conll09',
... ['ignore', 'words', 'ignore', 'ignore', 'pos'],
... encoding='utf-8')
>>>
>>> tagged_sents = corp.tagged_sents()
>>>
>>> from ClassifierBasedGermanTagger.ClassifierBasedGermanTagger import ClassifierBasedGermanTagger
>>> tagger = ClassifierBasedGermanTagger(train=tagged_sents)
>>> tagger.tag(['kochst'])
[('kochst', u'ADV')]
>>>
>>>
>>> tagged_sents[-1]
[(u'kochst', u'VVFIN')]
所以可能是我添加的'kochst'记录不正确或者TIGER语料库不完整(我发现很多第二人称形式的动词都没有)或者我根本不明白这里的东西,如何将词性标注器训练为 return 共轭动词的动词。
'kochst'举个例子,估计还有很多动词不能识别
>>> tagger.tag(['fahre'])
[('fahre', u'XY')]
>>> tagger.tag(['musst'])
[('musst', u'PPER')]
TIGER 只包含报纸文本,因此没有很多非第三人称动词。统计模型将无法了解几乎看不到的动词结尾。
可能有帮助的事情:
选择更好的标注器。您提到的那个具有一组有限的功能,尤其是在前缀和后缀方面。我不熟悉 NLTK 中的所有选项(可能有一些同样好),但作为替代方案,我建议尝试使用土拨鼠进行标记,加上 lemming 进行词形还原,来自 http://cistern.cis.lmu.de,它们相对快速和容易使用。还有很多更新的标注方法可能会更好一些,但很难说出它们之间的比较,因为最近的许多评估都是基于 UD 德国语料库,不幸的是,它的标注质量相对较低。
标注器依赖上下文,因此当您添加一些新的训练数据时,它有助于添加整个句子,或者至少是整个短语。
即使是大型手动注释语料库也不会涵盖大量词形,因此词汇资源对词形还原非常有帮助。我会看一下 Zmorge,一个基于德国维基词典数据的词法分析器。如果您的主要目标是词形还原,我建议您从 Zmorge 之类的东西开始,然后退回到用于歧义或看不见的词的统计模型。