印地语的 Spacy 自定义 POS 模型

Spacy custom POS model for Hindi

我最近致力于在 Spacy 中训练印地语的词性模型。我已经训练了模型,但是在分析任何文本时,任何标记的 .pos_ 属性始终指向 X。细粒度标签 .tag_ - 这是训练模型的标签 - 是正确的。

这个细粒度标签和 "universal" 标签(VERB、NOUN、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 的 "code",即 Other

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

这里有一个 link 可以阐明我正在解释的内容:https://universaldependencies.org/tagset-conversion/hi-conll-uposf.html

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

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

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

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

导入标签映射并添加到spacy/lang/hi/__init__.py中的HindiDefaults以加载标签映射:

from .tag_map import TAG_MAP

class HindiDefaults(Language.Defaults):
    tag_map = TAG_MAP

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

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