2017-07-28 36 views
0

我使用了幾個NER工具來提取出現在語料庫中的命名實體,我想使用NLTK Python模塊測試它們的準確性。如何計算NER系統的準確性?

一些我所使用的工具有:

爲了獲得系統的準確性,NLTK的accuracy函數有兩個參數:正確註釋的數據集(包含語料庫中的所有記號及其分類(PERSON,LOCATION,ORGANIZATION或'O'[表示該記號不是命名實體])和輸出NER系統。

當NER返回所有令牌的分類列表時,這是可以的。但是,某些工具(如MeaningCloud)僅返回語料庫中識別的指定實體的分類。這使得無法獲得準確性(爲了獲得它,應該返回完整的單詞列表以便兩個註釋之間的比較是可行的)。

那麼這裏的方法是什麼呢?我能做些什麼才能在這種情況下獲得準確性?

回答

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