1

我有一个 CoNLL NER 格式的数据集,它基本上是一个包含两个字段的 TSV 文件。第一个字段包含来自某些文本的标记 - 每行一个标记(每个标点符号也被视为一个标记),第二个字段包含 BIO 格式标记的命名实体标签。

我想将此数据集加载到 spaCy 中,使用我的模型为文本推断新的命名实体标签,并将这些标签写入与新的第三列相同的 TSV 文件中。我所知道的是,我可以通过以下方式推断命名实体:

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

我还设法使用这个 CLI 命令将 CoNLL 数据集转换为 spaCy 的 json 格式:

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

但我不知道从这里去哪里。找不到如何将此json文件加载到 spaCyDoc格式。我尝试了这段代码(在 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对象中的 ners 写回到同一个 TSV 文件中,使标记和 NER 标记与 TSV 文件的现有行对齐。

以下是 TSV 文件的摘录,作为我正在处理的数据的示例:

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

1 回答 1

4

这里的 spacy API 有一点差距,因为这种格式通常只用于训练模型。这是可能的,但并不明显。您必须加载语料库,因为它将为训练加载为GoldCorpus,这会为您提供标记化但未注释的 Docs 和 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需要一个训练文件和一个开发文件,所以第一个参数是必要的,但是我们没有对从第一个参数加载的数据做任何进一步的事情。

现在,为此使用 spacy 2.1.8,因为gold_preproc2.2.1 中的选项存在错误。gold_preproc保留您的原始标记化而不是用 spacy 重新标记化。如果您不关心保留标记化,您可以设置gold_preproc=False然后 spacy 提供的模型会更好地工作,因为标记化是相同的。

于 2019-10-09T19:09:01.220 回答