【问题标题】:How to set up training and feature template files for NER? - CRF++如何为 NER 设置训练和特征模板文件? - CRF++
【发布时间】:2018-11-22 03:03:42
【问题描述】:

对于命名实体识别的问题,

分词后,如何设置列?看起来文档中的一列是 POS 标签,但是这些来自哪里?我应该自己标记 POS 还是有生成这些的工具?

下一列代表什么?像PERSON,LOCATION等这样的类?它必须采用任何特定格式吗?

是否有完整的 NER 训练文件和模板示例?

【问题讨论】:

  • 如果您觉得我的回答有帮助,如果您能通过点击复选标记接受它,我将不胜感激。

标签: crf crf++


【解决方案1】:

您可以在 crf++ 存储库 here 中找到示例训练和测试数据。名词短语分块的训练数据如下所示:

Confidence NN B
in IN O
the DT B
pound NN I
is VBZ O
widely RB O
expected VBN O
... etc ...

列是任意的,因为它们可以是任何东西。 CRF++ 要求每行具有相同数量的列(或为空白,以分隔句子),并非所有 CRF 包都要求这样做。 您必须自己提供数据值;它们是分类器从中学习的数据。

虽然任何内容都可以放在各个列中,但您应该知道的一个约定是IOB Format。为了处理潜在的多令牌实体,您将它们标记为内部/外部/开始。举个例子可能会有用。假设我们正在训练一个分类器来检测名称 - 为了简洁起见,我将在一行中写下:

John/B Smith/I ate/O an/O apple/O ./O

在柱状格式中,它看起来像这样:

John B
Smith I
ate O
an O
apple O
. O

使用这些标签,B(开头)表示单词是实体中的第一个单词,I 表示单词在实体内部(位于 B 标签之后),O 表示词不是实体。如果您有不止一种类型的实体,通常使用B-PERSONI-PLACE 之类的标签。

使用 IOB 标记的原因是为了让分类器可以学习开始、继续和结束实体的不同转换概率。因此,如果您正在学习公司名称,它将了解到 Inc./I-COMPANY 通常会转换为 O 标签,因为 Inc. 通常是公司名称的最后一部分。

模板是另一个问题,CRF++ 使用自己的特殊格式,但同样,您可以查看源代码分发中的示例。另见this question


要回答对我的回答的评论,您可以使用任何 POS 标记器生成 POS 标签。您甚至根本不需要提供 POS 标签,尽管它们通常很有帮助。其他标签可以手动添加或自动添加;例如,您可以使用已知名词列表作为起点。这是一个使用spaCy 进行简单名称检测器的示例:

import spacy
nlp = spacy.load('en')
names = ['John', 'Jane', etc...]
text = nlp("John ate an apple.")
for word in text:
    person = 'O' # default not a person
    if str(word) in names:
        person = 'B-PERSON'
    print(str(word), word.pos_, person)

【讨论】:

  • 好的,所以POS栏必须自己提供。关于如何获得这个有什么建议吗?它是如何获得各种示例的?它是由 POS 标记器生成的,还是通过检查每个令牌手动输入的?我的训练集中有很多数据。
  • 我认为示例代码是最好的,所以请查看我的更新答案。
  • 头衔怎么样?John Smith 博士或 Jim Doe 医学博士?那么像 Name: Joe Smith 这样的标题呢?这些标题是否包含在名称的开始/结束部分?
  • 我认为它们不是名字的一部分,但你可以让它们成为名字的一部分或给它们另一个标签,这取决于你。
  • 如果句子之间没有换行符会怎样?只需提供一系列连续的令牌。
猜你喜欢
  • 2015-06-29
  • 2020-03-03
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2019-10-11
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多