web-dev-qa-db-ja.com

spaCyを使用したPOSタギング

PythonでspaCyモジュールを使用してPOSタギングを実行しようとしています。

これは私の同じコードです

from spacy.en import English, LOCAL_DATA_DIR
import spacy.en
import os

data_dir = os.environ.get('SPACY_DATA', LOCAL_DATA_DIR)
nlp = English(parser=False, tagger=True, entity=False)


def print_fine_pos(token):
    return (token.tag_)

def pos_tags(sentence):
    sentence = unicode(sentence, "utf-8")
    tokens = nlp(sentence)
    tags = []
    for tok in tokens:
        tags.append((tok,print_fine_pos(tok)))
    return tags

a = "we had crispy dosa"
print pos_tags(a)

出力:

[(We , u'PRP'), (had , u'VBD'), (crispy , u'NN'), (dosa, u'NN')]

ここでは、形容詞ではなく名詞としてクリスピーを返します。ただし、次のようなテスト文を使用すると

a="we had crispy fries"

サクサクは形容詞であることを認識しています。出力は次のとおりです。

[(we , u'PRP'), (had , u'VBD'), (crispy , u'JJ'), (fries, u'NNS')]

最初のケースでクリスピーが形容詞としてタグ付けされなかった主な理由は、2番目のケースではドーサが「NN」とタグ付けされたのに対し、フライドポテトは「NNS」とタグ付けされたためです。

2番目のケースでも私がカリカリに形容詞としてタグ付けする方法はありますか?

13
pd176

TL;DR: You should accept the occasional error.

詳細:

Spacyのタガーは統計的です。つまり、取得するタグは、トレーニング中に表示されたデータに基づく最良の推定値です。これらのデータにはWord dosaが含まれていないと思います。タガーは推測する必要があり、間違って推測しました。ルールや簡単に変更できるものを使用していないため、出力を修正する簡単な方法はありません。モデルは英語の標準コーパスでトレーニングされているため、(ドメイン)で使用している言語の種類とはかなり異なる場合があります。エラー率が目的に対して高すぎる場合は、ドメイン固有のデータを使用してモデルを再トレーニングできます。これは非常に面倒ですが。何を達成しようとしているのか、PoSタギングの3%エラー率が問題の中で最悪かどうかを自問してください。

一般に、統計システムのパフォーマンスをケースバイケースで判断すべきではありません。現代の英語のPoSタガーの精度は 約97% であり、平均的な人間とほぼ同じです。必ずいくつかのエラーが発生します。ただし、モデルのエラーは人為的エラーと同じにはなりません。2つは異なる方法で問題を解決する方法を「学習」しているためです。時々、モデルはあなたや私が明白だと考えることで混乱するでしょう。あなたの例。これは、全体的に悪いわけではなく、PoSタグ付けが実際の問題であることを意味しません。

26
mbatchkarov