首页 > 解决方案 > 印地语的 Spacy 自定义 POS 模型

问题描述

我最近致力于在 Spacy 中为印地语训练一个词性模型。我得到了已经训练过的模型,但是在分析任何文本时,.pos_任何标记的属性总是指向X. 细粒度的标签.tag_——也就是模型训练时使用的标签——是正确的。

此细粒度标签和“通用”标签(动词、名词、ADJ 等)之间的映射可在spacy/lang/hi/tag_map.py文件中找到。

Lemma यूरोप, Lemmatized: False, POS: X, TAG: NNP
Lemma के, Lemmatized: False, POS: X, TAG: PSP
Lemma जिन, Lemmatized: False, POS: X, TAG: DEM
Lemma राजनीतिक, Lemmatized: False, POS: X, TAG: JJ
Lemma दलों, Lemmatized: False, POS: X, TAG: NN
Lemma को, Lemmatized: False, POS: X, TAG: PSP
Lemma व्यवस्था, Lemmatized: False, POS: X, TAG: NN
Lemma ,, Lemmatized: False, POS: SYM, TAG: SYM
Lemma राजनेताओं, Lemmatized: False, POS: X, TAG: NN
Lemma और, Lemmatized: False, POS: X, TAG: CC
Lemma मीडिया, Lemmatized: False, POS: X, TAG: NN
Lemma द्वारा, Lemmatized: False, POS: X, TAG: PSP
Lemma अति, Lemmatized: False, POS: X, TAG: INTF
Lemma दक्षिणपंथी, Lemmatized: False, POS: X, TAG: NN
Lemma कहा, Lemmatized: False, POS: X, TAG: VM
Lemma जाता, Lemmatized: False, POS: X, TAG: VAUX
Lemma है, Lemmatized: False, POS: X, TAG: VAUX
Lemma (, Lemmatized: False, POS: SYM, TAG: SYM
Lemma परन्तु, Lemmatized: False, POS: X, TAG: CC
Lemma मेरी, Lemmatized: False, POS: X, TAG: PRP
Lemma ओर, Lemmatized: False, POS: X, TAG: NST
Lemma से, Lemmatized: False, POS: X, TAG: PSP
Lemma सभ्यतावादी, Lemmatized: False, POS: X, TAG: NNP
Lemma कहा, Lemmatized: False, POS: X, TAG: VM
Lemma जाता, Lemmatized: False, POS: X, TAG: VAUX
Lemma है, Lemmatized: False, POS: X, TAG: VAUX
Lemma ), Lemmatized: False, POS: SYM, TAG: SYM
Lemma उनकी, Lemmatized: False, POS: X, TAG: PRP
Lemma आलोचना, Lemmatized: False, POS: X, TAG: NN
Lemma उनकी, Lemmatized: False, POS: X, TAG: PRP
Lemma भूलों, Lemmatized: False, POS: X, TAG: NN
Lemma और, Lemmatized: False, POS: X, TAG: CC
Lemma अतिवादिता, Lemmatized: False, POS: X, TAG: NN
Lemma के, Lemmatized: False, POS: X, TAG: PSP
Lemma कारण, Lemmatized: False, POS: X, TAG: PSP
Lemma की, Lemmatized: False, POS: X, TAG: VM
Lemma जाती, Lemmatized: False, POS: X, TAG: VAUX
Lemma है|, Lemmatized: False, POS: X, TAG: NNPC

稍微调查了一下,我发现 之所以.pos_有这个X值是因为在生成的lang_model/tagger/tag_map二进制文件中,它的所有键都指向101哪个是分配给词性的“代码” X,即Other.

我推断它正在生成指向的键,101因为没有关于它应该如何将每个提供的标签从数据集映射到“通用”标签的信息。问题是,我可以tag_map.py在我的类的定义中提供一个Hindi(Language),但是当通过管道传递文本时,它最终将使用命令tagger/输出创建的目录中定义的标签映射。train

这是一个链接,它将澄清我正在解释的内容: https ://universaldependencies.org/tagset-conversion/hi-conll-uposf.html

第一列的第一项(CCDEMINTF等)是提供给模型的项。通用标签是来自第二列的标签。

我的问题是,我应该在哪里定义 tag_map 以覆盖spacy train命令生成的那个?

标签: spacypart-of-speech

解决方案


您需要添加您的tag_map.pytospacy/lang/hi/并告诉默认模型(这是加载的模型spacy train hi)来加载它。听起来你已经有了一个tag_map.py,但如果没有,你可以看到任何提供 spacy 模型的语言的示例,例如:

https://github.com/explosion/spaCy/blob/master/spacy/lang/en/tag_map.py

导入标签映射并将其添加到HindiDefaultsinspacy/lang/hi/__init__.py以加载标签映射:

from .tag_map import TAG_MAP

class HindiDefaults(Language.Defaults):
    tag_map = TAG_MAP

我认为您也可以nlp.vocab.morphology.tag_map在开始训练之前初始化空白模型后即时修改标签映射,但我认为没有任何简单的方法可以使用命令行选项来执行此操作spacy train,因此需要自定义训练脚本。

您可以使用spacy debug-data hi train.json dev.json它来确保设置有效,因为它会针对训练数据中不在标签映射中的任何标签显示警告。


推荐阅读