Индивидуальная модель POS Spacy для хинди

Недавно я работал над обучением модели частей речи для хинди в Spacy. Я уже обучил модель, но при анализе любого текста атрибут .pos_ любого токена всегда указывает на X. Тем не менее, детализированные теги .tag_, с которыми обучалась модель, верны.

Сопоставление между этими точными тегами и «универсальными» тегами (ГЛАГОЛ, СУЩЕСТВИТЕЛЬНОЕ, ПРИЛАГ и т. д.) находится в файле 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

Первый элемент первого столбца (CC, DEM, INTF и т. д.) предоставляется модели. Универсальные теги — это теги из второго столбца.

Мой вопрос: где я должен определить tag_map, чтобы перезаписать карту, сгенерированную командой spacy train?


person Adrián    schedule 30.10.2019    source источник


Ответы (1)


Вам нужно добавить tag_map.py к spacy/lang/hi/ и указать модели по умолчанию (которая загружается с spacy train hi) загрузить ее. Похоже, у вас уже есть tag_map.py, но если нет, вы можете увидеть примеры для любого из языков, которые предоставили пространственные модели, например:

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

Импортируйте карту тегов и добавьте ее в HindiDefaults в spacy/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, чтобы убедиться, что настройки работают, поскольку он будет отображать предупреждения для любых тегов в ваших тренировочных данных, которых нет на карте тегов.

person aab    schedule 30.10.2019
comment
Эй, спасибо за помощь! Я уже разобрался, и именно так, как вы предложили, мне пришлось разместить его на исходниках Spacy. Теперь у меня другая проблема: мой пользовательский NER не обнаруживает никаких сущностей. Я проверил, что конвейер NER загружен и содержит теги, с которыми я его тренировал. Есть идеи, что мне не хватает? Благодарю вас! - person Adrián; 31.10.2019