在Spacy培训两个连续的NER管道



我正在进行一个项目,训练分类器来识别文本中的引文。我们正在处理的引文往往非常杂乱无章。以下是一些引用示例:

  • 见A书第3章第7段
  • 见A书第3章第7段
  • 参见";某些章节标题"A书第7段

我们已经确定了少数倾向于出现在这些引文中的实体。例如;书名"章节号"章节名称"段落编号";。

该项目分为两个阶段:

  1. 文中引文的二元分类
  2. 引文中引文实体的分类

Spacy(我们使用的是v3(是否有可能拥有两个连续的NER管道?我希望分类器首先标记引文,然后再标记每个引文中的实体。

我能够用下面的代码实例化一个带有两个NER管道的模型:

from spacy.lang.en import English
nlp = English()
nlp.add_pipe("ner", name="ner1", last=True)
ner1 = nlp.get_pipe("ner1")
ner1.add_label("Citation")
nlp.add_pipe("ner", name="ner2", last=True)
ner2 = nlp.get_pipe("ner2")
for label in ["Book Title", "Chapter Number", "Chapter Name", "Paragraph Number"]:
ner2.add_label(label)

我的问题是如何分别训练每个NER管道。通常,Spacy需要以下形状的数据来训练NER:

{
"text": <TEXT>,
"spans": [<LIST OF NAMED ENTITY SPANS>]
}

如何区分训练数据中每个管道的数据?

这有几个部分。

  1. 您可以在一个spaCy管道中有两个NER组件,但由于问题2和3,这将无法按您希望的方式工作
  2. 管道无法在下游组件的训练过程中设置注释。这是一个正在努力解决的限制,应该很快得到解决
  3. NER注释不能重叠。这是一个设计决定,不会很快改变。它可以通过自定义组件来解决,但这是额外的工作

我希望分类器首先标记引文,然后再标记每个引文中的实体。

您真的需要单独使用整个引文标记吗?还是出于某种原因将其设计为两阶段过程以提高性能?如果是后者,我会先尝试在第二阶段训练详细的注释,看看你是否真的有问题;我怀疑一个两阶段的过程是否真的会让事情变得更容易。

如果你真的需要整个";引文";然后,您可以将详细实体的链提取到一个跨度中,不需要单独的模型。

我建议您仔细阅读文档中关于组合模型和规则的部分。它有一些例子,比如将个人姓名扩展为包括Mr.或Dr.之类的头衔,或者使用依赖解析信息,这些似乎适用于您的问题。

最新更新