在 Spacy 中训练两个连续的 NER 管道
Train two consecutive NER pipes in Spacy
我正在做一个项目来训练分类器来识别文本中的引用。我们正在处理的引文往往非常混乱。以下是一些示例引用:
- 参见书 A 第 3 章第 7 段
- 参见 A 书第 3 章第 7 段
- 参见 A 书的“部分章节标题”章节,第 7 段
我们已经确定了在这些引文中经常出现的少数实体。例如“书名”、“章号”、“章名”、“段落号”。
该项目分为两个阶段:
- 文中引用的二元分类
- 引用中引用实体的分类
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>]
}
如何区分训练数据中每个管道的数据?
这有几个部分。
- 您可以在一个 spaCy 管道中有两个 NER 组件,但由于问题 2 和 3,这不会按照您希望的方式工作。
- 流水线无法在下游组件训练期间设置注解。这是一个正在处理的限制,应该会尽快解决。
- NER 注释不能重叠。这是一个设计决定,不会很快改变。它可以通过自定义组件解决,但这是额外的工作。
I would want the classifier to first tag the citations and only then tag the entities within each citation.
您真的需要单独的整个引文标签,还是出于某种原因将其设计为两阶段流程以提高性能?如果是后者,我就先在第二阶段的详细标注上训练一下,看看你是不是真的有问题;我怀疑两个阶段的过程是否真的会让事情变得更容易。
如果您确实需要整个“引文”,那么您可以将详细实体的链提取到单个范围内,不需要为此创建单独的模型。
我建议你好好看看文档中关于 Combining Models and Rules 的部分。它有一些示例,例如扩展个人姓名以包括像先生或博士这样的头衔,或者使用依赖项解析信息,这些似乎适用于您的问题。
我正在做一个项目来训练分类器来识别文本中的引用。我们正在处理的引文往往非常混乱。以下是一些示例引用:
- 参见书 A 第 3 章第 7 段
- 参见 A 书第 3 章第 7 段
- 参见 A 书的“部分章节标题”章节,第 7 段
我们已经确定了在这些引文中经常出现的少数实体。例如“书名”、“章号”、“章名”、“段落号”。
该项目分为两个阶段:
- 文中引用的二元分类
- 引用中引用实体的分类
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>]
}
如何区分训练数据中每个管道的数据?
这有几个部分。
- 您可以在一个 spaCy 管道中有两个 NER 组件,但由于问题 2 和 3,这不会按照您希望的方式工作。
- 流水线无法在下游组件训练期间设置注解。这是一个正在处理的限制,应该会尽快解决。
- NER 注释不能重叠。这是一个设计决定,不会很快改变。它可以通过自定义组件解决,但这是额外的工作。
I would want the classifier to first tag the citations and only then tag the entities within each citation.
您真的需要单独的整个引文标签,还是出于某种原因将其设计为两阶段流程以提高性能?如果是后者,我就先在第二阶段的详细标注上训练一下,看看你是不是真的有问题;我怀疑两个阶段的过程是否真的会让事情变得更容易。
如果您确实需要整个“引文”,那么您可以将详细实体的链提取到单个范围内,不需要为此创建单独的模型。
我建议你好好看看文档中关于 Combining Models and Rules 的部分。它有一些示例,例如扩展个人姓名以包括像先生或博士这样的头衔,或者使用依赖项解析信息,这些似乎适用于您的问题。