Как проверить и подсчитать, появляется ли слово в linkedHashset в предложении из массива?

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

UniqueBagOfWords = [мне нравится, играть, теннис, думать, футбол, потребности, большие, изменения]

вывод будет-

Предложение - я люблю играть в теннис = 1,1,1,1,0,0,0,0,0

предложение - я люблю футбол лайк = 1,2,0,0,0,0,1,0,0,0

public static void main(String[] args) {
        List<String> sentences = new ArrayList<String>();
        sentences.add("i like to play tennis");
        sentences.add("i think football needs big changes");
        sentences.add("i like football like");

List<String[]> bagOfWords = new ArrayList<String[]>();
    for(String str : sentences){
        bagOfWords.add(str.split(" "));

    }
    Set<String> uniqueBagOfWords = new LinkedHashSet<String>();
    for(String[] s : bagOfWords){
        for(String ss : s)
            for(String st : ss.split(" "))
                if(!uniqueBagOfWords.contains(st))
                    uniqueBagOfWords.add(st);

    }

Я пробовал это, я знаю, что это неправильно, но не могу понять, куда идти дальше. Любая помощь будет здорово!

for(String s : sentences){
        for(String ss : s.split(" ")){
            int count= 0;
            for(int loop=0; loop <uniqueBagOfWords.size(); loop++){
            if(uniqueBagOfWords.contains(ss)){
                count +=1;
            }



            }
            System.out.println(ss +" "+ count);

person T.newGuy1620    schedule 11.08.2016    source источник
comment
почему вы все равно хотите использовать set? вы можете сделать это только с помощью arraylist.   -  person Vipul Behl    schedule 11.08.2016
comment
Как получить 1,1,1,1,0,0,0,0,0 от "Я люблю играть в теннис"? Разве их не должно быть 5, раз теннис в сумке?   -  person Bohemian♦    schedule 12.08.2016
comment
У вас есть набор хешей. Вам не нужно его пересекать. Просто используйте contains().   -  person user207421    schedule 12.08.2016


Ответы (3)


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

Map<String, Integer> hits = Arrays.stream(sentence.split(" "))
   .filter(uniqueBagOfWords::contains)
   .collect(groupingBy(identity()), counting());

Это произведет что-то вроде:

{i=1, like=2, football=1}

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

person Bohemian♦    schedule 12.08.2016

Здесь я просто создал массив строк для набора слов и поместил все предложения в список массивов. Затем я провел сравнение, чтобы проверить, соответствует ли буква в определенной позиции в предложении позиции в массиве bagOfWords.

public static void main(String[] args) {
    String[] bagOfWords = {"i", "like", "to", "play", "tennis", "think", "football", "needs", "big", "changes"};

    List<String> sentences = new ArrayList<String>();
    sentences.add("i like to play tennis");
    sentences.add("i think football needs big changes");
    sentences.add("i like football");

    for(String s1 : sentences){
        String[] sentenceSplit = splitWords(s1);

        for(int i=0;i<sentenceSplit.length;i++){
            if(sentenceSplit[i].equals(bagOfWords[i])){
                System.out.print("1 ");
            }
            else{
                System.out.print("0 ");
            }
        }
        System.out.println("");
    }
}

private static String[] splitWords(String sentence){
    String[] afterSplit = sentence.split(" ");
    return afterSplit;
}
person Vipul Behl    schedule 11.08.2016
comment
Вы превратили задачу O(N) в задачу O(N^2). Вы должны перебрать предложение, вызывающее Set.contains(), что равно O(1) в случае набора хэшей. - person user207421; 12.08.2016
comment
Даже если вы используете contains, вам придется проверить, находится ли слово в правильном положении или нет. Для этого, я думаю, вам нужно будет разбить предложение на слова. Или вы можете просто сделать это с наборами? Я смущен. - person Vipul Behl; 12.08.2016

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

    for (String s : sentences) {

        StringBuilder numberOfOccurences = new StringBuilder();

        for (String word : uniqueBagOfWords) {
            if (s.contains(word)) {
                numberOfOccurences.append("1,");
            } else {
                numberOfOccurences.append("0,");
            }
        }

        System.out.println(s + " = " + numberOfOccurences);
    }

Выход:

я люблю играть в теннис = 1,1,1,1,1,0,0,0,0,0,

я думаю, что футболу нужны большие перемены = 1,0,0,0,0,1,1,1,1,1,

я люблю футбол = 1,1,0,0,0,0,1,0,0,0,

person Christopher    schedule 11.08.2016
comment
Как мне обновить этот код, чтобы он подсчитывал, сколько раз появляется слово? например, если футбол встречается в предложении дважды, будет напечатано 2. спасибо! - person T.newGuy1620; 12.08.2016
comment
Зачем инвертировать код и перебирать набор хэшей, если он имеет метод O(1) contains()? - person user207421; 12.08.2016