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