Я задал этот вопрос по-разному пару раз. Каждый раз, когда я получаю прорыв, я сталкиваюсь с другой проблемой. Это также связано с тем, что я еще не владею Java и испытываю трудности с такими коллекциями, как Maps. Поэтому, пожалуйста, медведь со мной.Сравнение двух LinkedHashMaps со значениями как список
У меня есть две карты, как это:
Map1 -{ORGANIZATION=[Fulton Tax Commissioner 's Office, Grady Hospital, Fulton Health Department], LOCATION=[Bellwood, Alpharetta]}
Map2 - {ORGANIZATION=[Atlanta Police Department, Fulton Tax Commissioner, Fulton Health Department], LOCATION=[Alpharetta], PERSON=[Bellwood, Grady Hospital]}
Карты определяются как: LinkedHashMap<String, List<String>> sampleMap = new LinkedHashMap<String, List<String>>();
Я сравниваю эти две карты на основе значений и есть только три клавиши т.е. организации, лица и МЕСТО НАХОЖДЕНИЯ. Map1 - это мой золотой набор, который я сравниваю с Map2 против. Теперь проблема, с которой я столкнулся, - это когда я перебираю значения ключа ORGANIZATION в Map1 и проверяю совпадения в Map2, хотя моя первая запись имеет частичное совпадение в Map2 (Fulton Tax Commissioner), но поскольку первая запись Map2 (Полицейский отдел Атланты) - это не совпадение. Я получаю неверный результат (я ищу точные и частичные совпадения). Результат здесь заключается в приращении истинных положительных, ложных положительных и ложных отрицательных счетчиков, которые позволяют мне в конечном счете вычислить точность и вызвать для этого, т. Е. Распознанного распознавания сущностей.
EDIT
В результате я ожидаю за это
Organization:
True Positive Count = 2
False Negative Count = 1
False Positive Count = 1
Person:
False Positive Count = 2
Location:
True Positive Count = 1
False Negative Count = 1
Выход Сейчас я получаю:
Organization:
True Positive Count = 1
False Negative Count = 2
False Positive Count = 0
Person:
True Positive Count = 0
False Negative Count = 0
False Positive Count = 2
Location:
True Positive Count = 0
False Negative Count = 1
False Positive Count = 0
КОД
private static List<Integer> compareMaps(LinkedHashMap<String, List<String>> annotationMap, LinkedHashMap<String, List<String>> rageMap)
{
List<Integer> compareResults = new ArrayList<Integer>();
if (!annotationMap.entrySet().containsAll(rageMap.entrySet())){
for (Entry<String, List<String>> rageEntry : rageMap.entrySet()){
if (rageEntry.getKey().equals("ORGANIZATION") && !(annotationMap.containsKey(rageEntry.getKey()))){
for (int j = 0; j< rageEntry.getValue().size(); j++) {
orgFalsePositiveCount++;
}
}
if (rageEntry.getKey().equals("PERSON") && !(annotationMap.containsKey(rageEntry.getKey()))){
// System.out.println(rageEntry.getKey());
// System.out.println(annotationMap.entrySet());
for (int j = 0; j< rageEntry.getValue().size(); j++) {
perFalsePositiveCount++;
}
}
if (rageEntry.getKey().equals("LOCATION") && !(annotationMap.containsKey(rageEntry.getKey()))){
for (int j = 0; j< rageEntry.getValue().size(); j++) {
locFalsePositiveCount++;
}
}
}
}
for (Entry<String, List<String>> entry : annotationMap.entrySet()){
int i_index = 0;
if (rageMap.entrySet().isEmpty()){
orgFalseNegativeCount++;
continue;
}
// for (Entry<String, List<String>> rageEntry : rageMap.entrySet()){
if (entry.getKey().equals("ORGANIZATION")){
for(String val : entry.getValue()) {
if (rageMap.get(entry.getKey()) == null){
orgFalseNegativeCount++;
continue;
}
recusion: for (int i = i_index; i< rageMap.get(entry.getKey()).size();){
String rageVal = rageMap.get(entry.getKey()).get(i);
if(val.equals(rageVal)){
orgTruePositiveCount++;
i_index++;
break recusion;
}
else if((val.length() > rageVal.length()) && val.contains(rageVal)){ //|| dataB.get(entryA.getKey()).contains(entryA.getValue())){
orgTruePositiveCount++;
i_index++;
break recusion;
}
else if((val.length() < rageVal.length()) && rageVal.contains(val)){
orgTruePositiveCount++;
i_index++;
break recusion;
}
else if(!val.contains(rageVal)){
orgFalseNegativeCount++;
i_index++;
break recusion;
}
else if(!rageVal.contains(val)){
orgFalsePositiveCount++;
i_index++;
break recusion;
}
}
}
}
......................... //(Same for person and location)
compareResults.add(orgTruePositiveCount);
compareResults.add(orgFalseNegativeCount);
compareResults.add(orgFalsePositiveCount);
compareResults.add(perTruePositiveCount);
compareResults.add(perFalseNegativeCount);
compareResults.add(perFalsePositiveCount);
compareResults.add(locTruePositiveCount);
compareResults.add(locFalseNegativeCount);
compareResults.add(locFalsePositiveCount);
System.out.println(compareResults);
return compareResults;
}
Вам следует более формально описать, какой результат вы хотите получить – Andremoniy
@Andremoniy Done! У меня есть код, который выполняет большую часть этого, но я предполагаю, что я ищу, это ответ на такие вопросы, как «Нужно ли сортировать карты перед сравнением?» или есть что-то еще, что я должен сделать, чтобы предотвратить эту проблему? – serendipity
Каков тип значения? Это набор или список? – vanje