Java: связывание массивов списков друг с другом для задачи «высшей категоризации» - PullRequest
1 голос
/ 03 марта 2012

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

У меня есть задача определить, к какой категории относится пользовательский ввод.Например, если пользователь вводит: я люблю собак и кошек.Программа выведет две верхние категории: собаки, кошки

Если пользователь только введет: «Я люблю собак», программа выведет две верхние категории как «собаки, другие категории не найдены»

"нет категории" - это ответ по умолчанию, если найдена только одна категория или ее нет вообще.

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

Мне нужно получить наивысший уровень вероятности и второй наивысший уровень вероятности (если применимо) и связать их со строкой.это выведет, что категория.

Это мой код, который пытается взять 2 верхних вероятности и заставить их выводить на консоль. Моя проблема заключается в том, чтобы категории связывались с соответствующей строкой, чтобы обеспечить вывод категорий с наибольшим правдоподобием.

    //Create prioritization
    int topDouble = 0;
    String topString = "no category"; //default response
    int secondDouble = 0;
    String secondString = "no category"; // default response

    ArrayList<Double> likelyDouble = new ArrayList<Double>();
    likelyDouble.add(cats); 
    likelyDouble.add(dogs);
    likelyDouble.add(birds);

    ArrayList<String> likelyString = new ArrayList<String>();
    likelyString.add("you talked about cats"); 
                  //to parallel likelyDouble cats category
    likelyString.add("you talked about dogs");
                  //to parallel likelyDouble dogs category
    likelyString.add("you talked about birds");
                  //to parallel likelyDouble cats category

    int count = 0;
    for (double d : likelyDouble){
        if((d>0) && (d > topDouble)){
            topDouble = (int) d;
            topString = likelyString.get(count);
        }
        else if((d>0) && (d > secondDouble)){
            secondDouble = (int) d;
            secondString = likelyString.get(count);
        }
    }

    System.out.print(topString + "\n");
    System.out.print(secondString);

Вывод, который я получаю по умолчанию:

Пользовательский ввод: мне нравятся собаки и кошки.

Собаки

нет категории

К вашему сведению Программа определяет вероятность того, что пользователь говорит об определенной категории, на основе позиции впредложение и количество раз, на которые ссылается эта категория.Вероятность - это значение, которое рассчитывается.так что если категория вообще не упоминается, вероятность равна 0.

Спасибо за всю вашу помощь!

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Если я правильно понимаю, вы можете попробовать использовать Карту для хранения вероятности ваших категорий для каждого ввода, который может ввести любой пользователь.

Образец дан:

List<String> categories = new ArrayList<String>();
categories.add("dogs");
categories.add("cats");
categories.add("birds");
Map<String, Double> counterMap = new HashMap<String, Double>
for(String s : categories) {
    counterMap.put(s, 0);
}
List<String> inputString = new ArrayList<String>();
inputString.add("you talked about cats");
inputString.add("you talked about dogs");
inputString.add("you talked about birds");
for(String s : inputString) {
    for(String s2 : categories) {
        //get the likelyhood of the category in the sentence
        Double d = getLikelyhood(s2, s);
        //add the likelyhood in your map
        map.put(s2, map.get(s2) + d);
    }
}

//after setting the likelyhood of the categories with the user input
//you just need to get the 2 major values in the map
//I'll let you a small algorithm for this
int x = 0;
String[] arrS = new String[m.size()];
for(Object o : m.keySet().toArray()) {
    arrS[x++] = (String)o;
}
x = 0;
Double[] arrI = new Double[m.size()];
for(Object o : m.values().toArray()) {
    arrI[x++] = (Double)o;
}
int max1, max2, posMax1, posMax2;
max1 = arrI[0];
max2 = arrI[0];
posMax1 = 0;
posMax2 = 0;
for(int i=1; i < arrI.length; i++) {
    if (arrI[i] >= max1) {
        max2 = max1;
        max1 = arrI[i];
        posMax2 = posMax1;
        posMax1 = i;
    } else if (arrI[i] > max2) {
        max2 = arrI[i];
        posMax2 = i;
    }
}
System.out.println("Max category: " + arrS[posMax1]);
System.out.println("Second Max category: " + arrS[posMax2]);

Надеюсь, это поможет вам.

0 голосов
/ 03 марта 2012

Я не совсем понимаю, что вы ищете, но я подозреваю, что это как-то связано с вашим составом:

topDouble = (int) d;

Вы всегда устанавливаете topDouble в 0 - при условии, что вероятность находится в диапазоне [0,1].
То же самое относится к secondDouble.

Возможно, вы хотели объявить topDouble и secondDouble как double и удалить приведение к int - чтобы получить двойное значение max / second.

Кроме того - я не вижу, как вы увеличиваете count, поэтому вы всегда get() первый элемент в ArrayList.

Просто дизайн, для лучшего подхода [по моему мнению]:
Создайте новый класс: LikelyhoodStringDouble с 2 полями, одно из которых String, а другое double. Заставьте его реализовать Comparable [на основе значения double.

Все, что вам нужно сделать сейчас, это использовать Collections.sort(), чтобы отсортировать список и получить нужные вам верхние k элементов [в вашем случае k = 2]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...