Сравнение двух карт для расчета точности и отзыва для NER

Я пытаюсь вычислить точность и вспомнить для нашего распознавателя именованных сущностей, сравнивая наш вывод с выводом золотого набора. annotationMap - это карта набора золота, а myMap - это вывод моего NER. Чтобы дать вам представление, карты содержат такие данные, как:

{ORGANIZATION=[Pearl Williams Hartsfield, Fulton Superior Court],
DATE=[Friday], PERSON=[William B. Hartsfield]}

В соответствии с ответом, который я прочитал здесь, при переполнении стека, способ, которым мы рассчитываем точность и отзыв, (скопируйте оттуда):

[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]

Точное соответствие: True Positives = 1 (Microsoft Corp., единственное точное соответствие), False Positives =3 (CEO, сегодня, и Steve, который не является точным соответствием), False Negatives = 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

Любое перекрытие ОК: True Positives = 2 (Microsoft Corp. и Steve, который перекрывает Steve Ballmer), False Positives =2 (CEO и сегодня), False Negatives = 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

Я смоделировал мой код по той же логике, но значение ложных срабатываний для меня всегда равно нулю, в результате мои значения точности и отзыва равны 1 и 0 соответственно.

Я думаю, что способ расчета ложных срабатываний неверен. Но я следую той же логике и проверяю, есть ли у меня какие-либо сущности в myMap, которых нет в annotatioMap, и называю их ложноположительными (как CEO и Today в приведенном выше примере). В результате я не понимаю, где именно проблема!

private static List<Integer> compareMaps(LinkedHashMap<String, Vector<String>> annotationMap, LinkedHashMap<String, Vector<String>> myMap) 
        {
            List<Integer> compareResults = new ArrayList<Integer>();  
                if (annotationMap != null && myMap != null){
                   for (String key: annotationMap.keySet()){
                       if (key.equals("ORGANIZATION")){
                           if (annotationMap.get(key).equals(myMap.get(key))){
                               orgTruePositiveCount++;
                               continue;
                           }
                           if (annotationMap.get(key).contains(myMap.get(key))){
                               orgFalseNegativeCount++;
                               continue;
                           }
                           if (!annotationMap.get(key).contains(myMap.get(key))){
                               orgFalseNegativeCount++;
                               continue;
                           }
                           if (!myMap.get(key).contains(annotationMap.get(key))){
                               orgFalsePositiveCount++;
                               continue;
                           }
                       }

0 ответов

Другие вопросы по тегам