2017-09-14 1 views
1

독일어 텍스트 용 Spacy의 NER를 사용하여 텍스트에서 명명 된 엔터티를 추출하려고합니다. 소스 텍스트를 입력으로 사용하여 명명 된 엔터티 (사람, 위치, 조직) 목록의 사전 (Map)을 반환하는 REST POST 요청으로 서비스를 노출했습니다. 이러한 서비스는 Linux 서버에서 호스팅되는 Flask Restplus를 사용하여 노출됩니다.나머지 템플릿이 json rest api 응답을 제대로 구문 분석 할 수 없습니다.

, 내가 자신감 UI를 통해 노출의 REST API에서 POST 요청을 사용하여 응답 다음 얻을 샘플 텍스트 고려 :

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

나는 봄 부팅에서 리눅스 서버에서 호스팅 API에서 요청을 게시 봄의 RestTemplate를 사용하는 경우 응용 프로그램 (Eclipse의 Windows OS). json 구문 분석이 올바르게 수행됩니다. UTF-8 인코딩을 사용하여 다음 줄을 추가했습니다. 내가 NER 태그에 대한 API에 리눅스 머신과 POST 요청에 봄 부팅 응용 프로그램을 배포 할 때

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

단, ner_persons가 올바르게 구문 분석되지 않습니다. 원격 디버깅하는 동안이 이상한 행동은 개인이 아닌 단체의 경우에 발생하는 이유, 내가 이해할 수 아니다 응답

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

다음 얻는다.

답변

1

파이썬에 익숙하지 않아서 실제 문제를 이해하고 해결 방법을 찾기 위해 2 일간의 디버깅이 필요했습니다.

이유는 이름 (예를 들어, "세바스찬 크라우스는") \ xa0 즉 비 분리 공백 문자 (예를 들면, "세바스찬 \ xa0Krause") 대신 공백으로 분리 하였다이었다. 따라서 Spacy는 단일 NamedEntity로 이들을 감지하지 못했습니다.

SO를 통해 찾아, 나는 here에서 다음과 같은 해결책을 발견 :

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

를이는 등 \ u2013, \ U2026,

같은 다른 유니 코드 문자를 정규화
관련 문제