如何计算NER系统的准确性?

时间:2017-07-28 10:42:20

标签: python classification nltk named-entity-recognition

我正在使用几个NER工具来提取语料库中存在的命名实体,我想使用NLTK Python模块测试它们的准确性。

我使用的一些工具是:

为了获得系统的准确性,NLTK的accuracy函数有两个参数:正确注释的数据集(包含语料库中的所有标记及其分类(PERSON,LOCATION) ,ORGANIZATION或' [表示令牌不是命名实体])和NER系统的输出。

当NER返回包含其分类的所有令牌的列表时,这是可以的。但是,某些工具(如MeaningCloud)仅返回语料库中识别的命名实体的分类。这使得无法获得准确性(为了获得它,应该返回完整的单词列表,以便两个注释之间的比较是可行的)。

这时的方法是什么?为了在这种情况下获得准确性,我该怎么办?

1 个答案:

答案 0 :(得分:0)

您应该为默认为“O”的所有令牌创建一个标签列表。

查看MeaningCloud,看起来variant_list包含原始字符串中检测到令牌的位置,因此您可以使用它来将标签映射到令牌。

一些伪代码:

def get_label(token, meaningcloud_data):
    variants = ...[get from meaningcloud_data somehow]...
    for variant in variant:
        if token.start_char >= variant.inip and token.end_char <= variant.endp:
            return variant.label
    return False

meaningcloud = get_meaningcloud_data(text)
labels = []
for token in tokens: 
    # default to 'O'
    labels.push(get_label(token, meaningcloud) or 'O')

请注意,在NLTK中,标准标记化器 - word_tokenize - 不保存标记位置,因此除非您完全确定间距约定,否则无法重建原始文档。这就是说NLTK确实有标记化和获取位置的方法,请参阅here了解一些细节。