2017-09-14 92 views
1

我想從文本中使用Spacy的NER爲德文文本提取命名實體。我將該服務公開爲REST POST請求,該請求將源文本作爲輸入並返回名稱實體(人員,位置,組織)列表的字典(地圖)。這些服務使用Linux服務器上託管的Flask Restplus進行公開。其他模板無法正確解析json rest api響應

考慮了樣本的文字,我獲得以下的REST API通過揚鞭UI曝光使用POST請求響應:

{ 
    "ner_locations": [ 
    "Deutschland", 
    "Niederlanden" 
    ], 
    "ner_organizations": [ 
    "Miele & Cie. KG", 
    "Bayer CropScience AG" 
    ], 
    "ner_persons": [ 
    "Sebastian Krause", 
    "Alex Schröder" 
    ] 
} 

當我使用Spring的RestTemplate到發表於在Linux服務器從春天啓動託管API請求應用程序(在Eclipse中的Windows操作系統上)。 json解析正確完成。我添加了以下使用UTF-8編碼的行。

restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8"))); 

但是當我部署的Linux機器和POST請求在今年春季啓動應用程序,爲NER標註API,該ner_persons不能正確解析。雖然遠程調試,我得到如下回應

{ 
    "ner_locations": [ 
    "Deutschland", 
    "Niederlanden" 
    ], 
    "ner_organizations": [ 
    "Miele & Cie. KG", 
    "Bayer CropScience AG" 
    ], 
    "ner_persons": [ 
    "Sebastian ", 
    "Krause", 
    "Alex ", 
    "Schröder" 
    ] 
} 

我無法理解爲什麼,但人沒有組織的情況下,會出現這種奇怪的行爲。

回答

1

作爲python的新手,我花了2天的時間來了解真正的問題並找到解決方法。

的理由是,該名稱(例如,「克勞斯塞巴斯蒂安」)通過\ XA0即非斷裂空格字符(例如,「塞巴斯蒂安\ xa0Krause」),而不是一個空格分開。因此Spacy未能將它們視爲單一的NamedEntity。

通過SO瀏覽,我發現以下溶液從here

import unicodedata 
norm_text = unicodedata.normalize("NFKD", source_text) 

這也歸其他Unicode字符如\ u2013\ U2026