如何为NER设置培训和功能模板文件? - CRF ++

时间:2018-06-12 16:25:22

标签: crf crf++

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

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

下一栏代表什么?像PERSON,LOCATION等课程?它是否必须采用任何特定格式?

是否有任何已完成的NER培训文件和模板示例?

1 个答案:

答案 0 :(得分:3)

您可以在crf ++ repo 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)