Как импортировать текст из формата CoNNL с именованными объектами в spaCy, вывести объекты с моей моделью и записать их в один и тот же набор данных (с Python)? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть набор данных в формате CoNLL NER, который в основном представляет собой файл TSV с двумя полями. Первое поле содержит токены из некоторого текста - по одному токену на строку (каждый символ пунктуации там также считается токеном), а второе поле содержит именованные теги сущностей для токенов в формате BIO.

Я хотел бы загрузить этотНабор данных в spaCy, выведите новые теги именованных объектов для текста с моей моделью и запишите эти теги в тот же файл TSV, что и новый третий столбец. Все, что я знаю, это то, что я могу вывести именованные сущности примерно так:

nlp = spacy.load("some_spacy_ner_model")
text = "text from conll dataset"
doc = nlp(text)

Также мне удалось преобразовать набор данных CoNLL в формат json spaCy с помощью этой команды CLI:

python -m spacy convert conll_dataset.tsv /Users/user/docs -t json -c ner

Но я не знаю, куда идти отсюда. Не удалось найти способ загрузки этого файла json в формат spaCy Doc. Я попробовал этот кусок кода (нашел его в документации spaCy):

from spacy.tokens import Doc
from spacy.vocab import Vocab
doc = Doc(Vocab()).from_disk("sample.json")

, но выдает ошибку, говорящую ExtraData: unpack(b) received extra data..

Также я не знаю, как писать ners изdoc объект возвращается в тот же файл TSV, выравнивая токены и теги NER с существующими строками файла TSV.

А вот выдержка из файла TSV в качестве примера данных, с которыми я имею дело:

The O
epidermal   B-Protein
growth  I-Protein
factor  I-Protein
precursor   O
.   O

1 Ответ

1 голос
/ 09 октября 2019

Здесь есть небольшой пробел в просторном API, поскольку этот формат обычно используется только для моделей обучения. Это возможно, но это не очевидно. Вы должны загрузить корпус так, как он будет загружен для обучения, как GoldCorpus, что дает вам токенизированные, но в противном случае аннотированные документы и GoldParses с аннотацией в необработанном формате.

Затем вы можете преобразовать необработанный GoldParse аннотации в нужном формате и добавьте их в Doc от руки. Вот эскиз для сущностей:

import spacy
from spacy.gold import GoldCorpus
nlp = spacy.load('en')
gc = GoldCorpus("file.json", "file.json")
for doc, gold in gc.dev_docs(nlp, gold_preproc=True):
    doc.ents = spacy.gold.spans_from_biluo_tags(doc, gold.ner)
    spacy.displacy.serve(doc, style='ent')

dev_docs() используется здесь, потому что он загружает документы без дальнейшей перестановки, увеличения и т. Д., Как это может быть для обучения, и загружает файл во втором аргументе. до GoldCorpus. GoldCorpus требуется обучающий файл и файл dev, поэтому первый аргумент необходим, но мы не будем ничего делать с данными, загруженными из первого аргумента.

Пока что используйте spacy 2.1.8 дляэто, так как есть ошибка для опции gold_preproc в 2.2.1. gold_preproc сохраняет исходный токенизацию, а не повторяет с пространством. Если вы не заботитесь о сохранении токенизации, вы можете установить gold_preproc=False, и тогда предоставляемые spacy модели будут работать немного лучше, потому что токенизация идентична.

...