【问题标题】:How to import text from CoNNL format with named entities into spaCy, infer entities with my model and write them to the same dataset (with Python)?如何将带有命名实体的 CoNNL 格式的文本导入 spaCy,用我的模型推断实体并将它们写入同一个数据集(使用 Python)?
【发布时间】:2019-10-09 08:08:50
【问题描述】:

我有一个 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 文件加载到 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.

另外,我不知道如何将来自 doc 对象的 ners 写回到同一个 TSV 文件中,将标记和 NER 标记与 TSV 文件的现有行对齐。

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

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

【问题讨论】:

  • 非常感谢您提出这个问题!

标签: python json spacy named-entity-recognition conll


【解决方案1】:

这里的 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,因为 2.2.1 中的 gold_preproc 选项存在错误。 gold_preproc 保留您的原始标记,而不是用 spacy 重新标记。如果您不关心保留标记化,您可以设置gold_preproc=False,然后 spacy 提供的模型会更好地工作,因为标记化是相同的。

【讨论】:

  • 感谢您的回答,它似乎工作!我设法加载数据集,然后用另一个模型推断出新的 NER 标签。您能否就如何将结果保存回带有 IOB 标签的 CoNLL 格式(具有两个字段的 tsv - 一个令牌及其标签)给我一个建议?
  • IOB 标签可通过token.ent_iob_token.ent_type_ 获得。在此处查看 Token 属性:spacy.io/api/token#attributes
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多