Сравнение двух карт для расчета точности и отзыва для 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;
}
}