2017-09-14 20 views
1

SpacyのNERを使用してテキストから名前付きエンティティを抽出しようとしています。私はソーステキストを入力としてREST POSTリクエストとしてサービスを公開し、名前付きエンティティ(人、場所、組織)のリストの辞書(Map)を返します。これらのサービスは、Linuxサーバー上でホストされているFlask Restplusを使用して公開されています。Restテンプレートが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" 
    ] 
} 

私は春ブーツからLinuxサーバでホストされているAPIでリクエストを投稿するSpringのRestTemplateを使用する場合アプリケーション(EclipseのWindows OS上) jsonの解析は正しく行われます。 UTF-8エンコーディングを使用するために次の行を追加しました。

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

しかし、私はLinuxマシンとNERタギングのためのAPIへのPOSTリクエストでこの春ブートアプリケーションをデプロイすると、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) 

をこれはまた、など\ u2013\ています...

などの他のUnicode文字を正規化
関連する問題