代码之家  ›  专栏  ›  技术社区  ›  erotavlas

如何建立内河网的训练和特征模板文件?- CRF+

  •  2
  • erotavlas  · 技术社区  · 6 年前

    对于命名实体识别问题,

    将句子标记后,如何设置列?看起来文档中有一列是pos tag,但是它们是从哪里来的呢?我应该自己标记POS还是有工具生成这些?

    下一列代表什么?像人、地点等类?它一定要有特定的格式吗?

    有没有一个完整的NER培训文件和模板的例子?

    1 回复  |  直到 6 年前
        1
  •  3
  •   polm23    6 年前

    您可以在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 . 要处理潜在的多令牌实体,请将它们标记为inside/outside/start。举个例子也许有用。假设我们正在训练一个分类器来检测名称-为了简洁起见,我将在一行写下:

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

    以列格式显示如下:

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

    有了这些标签, B (开头)是指该词在一个实体中是第一个, I 意思是一个单词在一个实体中(它在 标签) O 意思是这个词不是一个实体。如果有多个类型的实体,通常使用如下标签 B-PERSON I-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)
    
    推荐文章