我正在尝试使用Spacy的NER从德语文本中提取命名实体。我已经将该服务公开为REST POST请求,该请求接受源文本作为输入,并返回命名实体(人员、位置、组织)列表的字典(Map)。这些服务是使用托管在linux服务器上的Flask Restplus公开的。
以示例文本为例,我使用通过Swagger UI公开的REST API的POST请求得到以下响应:
{
"ner_locations": [
"Deutschland",
"Niederlanden"
],
"ner_organizations": [
"Miele & Cie. KG",
"Bayer CropScience AG"
],
"ner_persons": [
"Sebastian Krause",
"Alex Schröder"
]
}
当我使用Spring从Spring boot应用程序(在Eclipse中的Windows OS上)向托管在Linux服务器上的RestTemplate发出请求时。json解析已正确完成。为了使用UTF-8编码,我添加了以下代码行。
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
但是,当我在linux机器上部署这个spring boot应用程序并向API发出用于NER标记的POST请求时,ner_persons无法正确解析。在远程调试时,我得到以下响应
{
"ner_locations": [
"Deutschland",
"Niederlanden"
],
"ner_organizations": [
"Miele & Cie. KG",
"Bayer CropScience AG"
],
"ner_persons": [
"Sebastian ",
"Krause",
"Alex ",
"Schröder"
]
}
我不能理解为什么这种奇怪的行为发生在个人而不是组织的情况下。
发布于 2017-09-18 23:45:15
作为python的新手,我花了2天的调试时间来理解真正的问题并找到解决方法。
原因是名称(例如,"Sebastian Krause")由\xa0分隔,即不间断的空格字符(例如,"Sebastian\xa0Krause")而不是空格。因此,Spacy未能将它们作为单个NamedEntity进行检测。
浏览SO,我从here找到了以下解决方案
import unicodedata
norm_text = unicodedata.normalize("NFKD", source_text)
这还会标准化其他unicode字符,如\u2013、\u2026等。
https://stackoverflow.com/questions/46222462
复制相似问题