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

У меня есть набор данных в формате 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 файл в спа-центр 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..

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

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

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

1 ответ

Здесь есть небольшой пробел в просторном 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 модели будут работать немного лучше, потому что токенизация идентична.

Другие вопросы по тегам