34

次に、固有表現抽出の結果を報告します。少し紛らわしいのは、適合率と再現率についての私の理解は、すべてのクラスの真陽性、真陰性、偽陽性、偽陰性を単純に合計することでした。

しかし、これは、誤分類ごとに1つの誤検知と1つの誤検知が同時に発生するため、今では信じられないようです(たとえば、「A」とラベル付けされているはずのトークンは、次の場合は誤検知です。 「A」および「B」の誤検知)。したがって、すべてのクラスの誤検知と誤検知の数は同じになります。これは、精度が(常に!)リコールに等しいことを意味します。これは単純に真実ではないので、私の推論に誤りがあり、それはどこにあるのだろうかと思います。それは確かに非常に明白で簡単なことですが、今は私を逃れています。

4

6 に答える 6

52

適合率と再現率が通常計算される方法(これは私の論文で使用しているものです)は、エンティティを相互に測定することです。グラウンドトゥルースが次のようになっていると仮定します(それらがどのタイプのエンティティであるかについての区別はありません)

[Microsoft Corp.] CEO [Steve Ballmer] announced the release of [Windows 7] today

これには3つのエンティティがあります。

実際の抽出に次のようなものがあると仮定します

[Microsoft Corp.] [CEO] [Steve] Ballmer announced the release of Windows 7 [today]

との完全一致、Microsoft Corpとの誤検知、の誤検知、CEOおよびの部分文字列の一致があります。todayWindows 7Steve

最初に一致基準を定義することにより、適合率と再現率を計算します。たとえば、完全に一致する必要がありますか?それらがまったく重なっている場合、それは一致ですか?エンティティタイプは重要ですか?通常、これらの基準のいくつかに適合率と再現率を提供したいと考えています。

完全一致: True Positive = 1(Microsoft Corp.、唯一の完全一致)、False Positive = 3(、、、CEOおよびtodaySteve完全一致ではありません)、False Negative = 2(Steve BallmerおよびWindows 7

Precision = True Positives / (True Positives + False Positives) = 1/(1+3) = 0.25
Recall = True Positives / (True Positives + False Negatives) = 1/(1+2) = 0.33

任意の重複OK:真陽性= 2(Microsoft Corp.、およびSteve重複Steve Ballmer)、偽陽性= 2(CEO、およびtoday)、偽陰性= 1(Windows 7

Precision = True Positives / (True Positives + False Positives) = 2/(2+2) = 0.55
Recall = True Positives / (True Positives + False Negatives) = 2/(2+1) = 0.66

次に、読者は、「実際のパフォーマンス」(人間の判断を使用して、どの重複の不一致が重要でどれが重要でないかを判断することを許可されたときに、偏りのない人間のチェッカーが与える適合率と再現率)が2つの間のどこかにあると推測します。

適合率と再現率の調和平均であり、適合率と再現率をトレードオフする必要がある場合の「パフォーマンス」のアイデアを提供するF1メジャーを報告することもしばしば役立ちます。

于 2009-11-29T05:42:29.557 に答える
14

CoNLL-2003 NERタスクでは、論文「CoNLL-2003共有タスクの概要:言語に依存しない名前付きエンティティの認識」で説明されているように、評価はトークンではなく、正しくマークされたエンティティに基づいていました。システムがドキュメント内の正しい開始点と終了点を持つ正しいタイプのエンティティを識別する場合、エンティティは正しくマークされます。実際のタスクのパフォーマンスの尺度に近いため、評価ではこのアプローチを好みます。NERシステムのユーザーは、個々のトークンではなく、エンティティを気にします。

ただし、説明した問題はまだ存在します。タイプORGのエンティティをタイプLOCでマークすると、LOCの誤検知とORGの誤検知が発生します。このブログ投稿には、この問題に関する興味深い議論があります。

于 2009-11-23T16:12:19.257 に答える
3

前述のように、NERのパフォーマンスを測定する方法はいくつかあります。テキスト内の位置とクラス(人、場所、組織など)の観点から、エンティティがどの程度正確に検出されているかを個別に評価することができます。または、両方の側面を1つのメジャーに組み合わせます。

次の論文で素晴らしいレビューを見つけることができます:D。Nadeau、半教師あり名前付きエンティティの認識:ほとんど監督なしで100のエンティティタイプを認識することを学ぶ(2007)。セクション2.6をご覧ください。NERの評価

于 2013-05-04T20:46:18.490 に答える
2

この質問に対する簡単な正しい答えはありません。エラーをカウントするには、さまざまな方法があります。MUCコンテストでは、1つを使用し、他の人は他の人を使用しました。

ただし、すぐに混乱する場合は、次のようにします。

タグのセットがありますね NONE、PERSON、ANIMAL、VEGETABLEのようなものですか?

トークンが人である必要があり、それをNONEとタグ付けした場合、それはNONEの場合は誤検知であり、PERSONの場合は誤検知です。トークンがNONEである必要があり、それをPERSONとタグ付けした場合、その逆になります。

したがって、各エンティティタイプのスコアを取得します。

これらのスコアを集計することもできます。

于 2009-11-23T15:19:12.827 に答える
2

明確にするために、これらは定義です:

精度=TP/(TP + FP)=見つけたもののどの部分がグラウンドトゥルースでしたか?

リコール=TP/(TP + FN)=グラウンドトゥルースのどの部分を回復しましたか?

誤検知の数は必ずしも誤検知の数と同じではないため、は必ずしも同じになるとは限りません。

私があなたの問題を正しく理解しているなら、あなたは各トークンを2つ以上の可能なラベルの1つに割り当てています。適合率と再現率を理解するには、二項分類器が必要です。したがって、トークンがグループ「A」にあるかどうかとして分類子を表現した場合は、適合率と再現率を使用して、グループごとに繰り返すことができます。この場合、分類を見逃すと、あるグループでは誤検知、別のグループでは誤検知として2回カウントされます。

バイナリではない(各トークンをグループに割り当てる)このような分類を行う場合は、代わりにトークンのペアを調べると便利な場合があります。問題を「トークンXとYは同じ分類グループにありますか?」と表現します。これにより、適合率を計算し、ノードのすべてのペアを呼び出すことができます。分類グループにラベルが付けられているか、関連する意味がある場合、これは適切ではありません。たとえば、分類グループが「果物」と「野菜」であり、「リンゴ」と「オレンジ」の両方を「野菜」として分類する場合、このアルゴリズムは、間違ったグループが割り当てられていても、真陽性としてスコア付けします。ただし、グループにラベルが付いていない場合、たとえば「A」と「B」の場合、リンゴとオレンジの両方が「A」に分類されていると、

于 2009-11-23T16:07:03.883 に答える
0

spacy nerモデルをトレーニングしている場合は、nerの精度、再現率、再現率を提供するscorer.pyAPIを使用します。

コードと出力は次の形式になります:-

17

次のリンクで同じ質問をしている人のために:

spaCy / scorer.py'''python

import spacy

from spacy.gold import GoldParse

from spacy.scorer import Scorer


def evaluate(ner_model, examples):

scorer = Scorer()
for input_, annot in examples:
    doc_gold_text = ner_model.make_doc(input_)
    gold = GoldParse(doc_gold_text, entities=annot)
    pred_value = ner_model(input_)
    scorer.score(pred_value, gold)
return scorer.scores

実行例

examples = [
    ('Who is Shaka Khan?',
     [(7, 17, 'PERSON')]),
    ('I like London and Berlin.',
     [(7, 13, 'LOC'), (18, 24, 'LOC')])
]

ner_model = spacy.load(ner_model_path) # for spaCy's pretrained use 'en_core_web_sm'
results = evaluate(ner_model, examples)
'''
Output will be in format like:-
{'uas': 0.0, 'las': 0.0, **'ents_p'**: 43.75, **'ents_r'**: 35.59322033898305, **'ents_f'**: 39.252336448598136, 'tags_acc': 0.0, 'token_acc': 100.0}**strong text**
于 2019-06-14T06:33:36.040 に答える