我正在使用几个NER工具来提取语料库中存在的命名实体,我想使用NLTK Python模块测试它们的准确性。
我使用的一些工具是:
NTLK
为了获得系统的准确性,NLTK的accuracy
函数有两个参数:正确注释的数据集(包含语料库中的所有标记及其分类(PERSON,LOCATION) ,ORGANIZATION或' [表示令牌不是命名实体])和NER系统的输出。
当NER返回包含其分类的所有令牌的列表时,这是可以的。但是,某些工具(如MeaningCloud)仅返回语料库中识别的命名实体的分类。这使得无法获得准确性(为了获得它,应该返回完整的单词列表,以便两个注释之间的比较是可行的)。
这时的方法是什么?为了在这种情况下获得准确性,我该怎么办?
答案 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了解一些细节。