1

我正在尝试使用 Spacy 的德语文本 NER 从文本中提取命名实体。我已将该服务公开为 REST POST 请求,该请求将源文本作为输入并返回命名实体(人、位置、组织)列表的字典(地图)。这些服务使用托管在 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 的 RestTemplate 从 Spring 启动应用程序(在 Eclipse 中的 Windows 操作系统上)在 Linux 服务器上托管的 API 上发布请求时。json解析正确完成。我添加了以下行以使用 UTF-8 编码。

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

但是当我在 linux 机器上部署这个 spring boot 应用程序并向 API 发送请求以进行 NER 标记时,ner_persons 未正确解析。远程调试时,我得到以下响应

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

我无法理解为什么这种奇怪的行为会发生在个人而不是组织的情况下。

4

1 回答 1

1

作为 python 的新手,我花了 2 天的时间调试来了解真正的问题并找到解决方法。

原因是名称(例如,“Sebastian Krause”)由\xa0分隔,即不间断的空格字符(例如,“Sebastian\xa0Krause”)而不是空格。因此 Spacy 未能将它们检测为单个 NamedEntity。

浏览 SO,我从这里找到了以下解决方案:

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

这也规范了其他 unicode 字符,例如\u2013\u2026等。

于 2017-09-18T15:45:15.450 回答