Сравните два предложения и проверьте, есть ли в них похожее слово - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь взять два предложения и посмотреть, есть ли в них общие слова. Пример: A- «Привет, мир, это тест» B- «Тест для создания вещей»

Общее слово здесь - «тест»

Я пробовал использовать .contains(), но он не работает, потому что я могу искать только одно слово.

text1.toLowerCase ().contains(sentence1.toLowerCase ())

Ответы [ 5 ]

1 голос
/ 06 августа 2020

Вы можете создать HashSet s из обоих слов после разделения на пробел. Вы можете использовать Set#retainAll, чтобы найти пересечение (общие слова).

final String a = "Hello world this is a test", b = "Test to create things";
final Set<String> words = new HashSet<>(Arrays.asList(a.toLowerCase().split("\\s+")));
final Set<String> words2 = new HashSet<>(Arrays.asList(b.toLowerCase().split("\\s+")));
words.retainAll(words2);
System.out.println(words); //[test]
0 голосов
/ 07 августа 2020

Попробуйте это.

static boolean contains(String text1, String text2) {
    String text1LowerCase = text1.toLowerCase();
    return Arrays.stream(text2.toLowerCase().split("\\s+"))
        .anyMatch(word -> text1LowerCase.contains(word));
}

и

String text1 = "Hello world this is a test";
String text2 = "Test to create things";
System.out.println(contains(text1, text2));

вывод:

true
0 голосов
/ 06 августа 2020

Вот один из подходов:

    // extract the words from the sentences by splitting on white space
    String[] sentence1Words = sentence1.toLowerCase().split("\\s+");
    String[] sentence2Words = sentence2.toLowerCase().split("\\s+");
        
    // make sets from the two word arrays
    Set<String> sentence1WordSet = new HashSet<String>(Arrays.asList(sentence1Words));
    Set<String> sentence2WordSet = new HashSet<String>(Arrays.asList(sentence2Words));
        
    // get the intersection of the two word sets
    Set<String> commonWords = new HashSet<String>(sentence1WordSet); 
    commonWords.retainAll(sentence2WordSet);        

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

Обратите внимание, что реальный (ie. полезно) реализация проверки на подобие обычно намного сложнее, так как вы обычно хотите проверить слова, которые похожи, но с небольшими расхождениями. Некоторые полезные отправные точки для изучения этого типа проверки сходства строк: расстояние Левенштейна и метафоны .

Обратите внимание, что существует дублирующая копия набора в приведенном выше коде, где я создаю набор commonWords, потому что пересечение выполняется на месте, так что вы можете повысить производительность, просто выполнив пересечение с предложением1WordSet, но я предпочел ясность кода производительности.

0 голосов
/ 06 августа 2020

Два предложения разделены пробелом и добавляются каждое слово из первой строки набора. Теперь в al oop попробуйте добавить слова из второй строки в наборе. Если операция добавления возвращает false, это обычное слово.

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Sample {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str1 = "Hello world this is a test";
        String str2 = "Test to create things";
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        String[] str1words = str1.split(" ");
        String[] str2words = str2.split(" ");
        boolean flag = true;
        Set<String> set = new HashSet<String>(Arrays.asList(str1words));
        for(int i = 0;i<str2words.length;i++) {
            flag = set.add(str2words[i]);
            if(flag == false)
                System.out.println(str2words[i]+" is common word");
        }
    }

}
0 голосов
/ 06 августа 2020

Вы можете разделить предложение по пробелу и собрать слово в виде списка, а затем выполнить поиск одного элемента списка в другом списке и собрать общие слова.

Вот пример использования Java Stream API. Здесь первые слова предложения собираются как Установить для ускорения операции поиска для каждого слова (O(1))

String a = "Hello world this is a test";
String b = "Test to create things";
Set<String> aWords = Arrays.stream(a.toLowerCase().split(" "))
                            .collect(Collectors.toSet());
List<String> commonWords = Arrays.stream(b.toLowerCase().split(" "))
                                 .filter(bw -> aWords.contains(bw))
                                 .collect(Collectors.toList());
System.out.println(commonWords);

Вывод: test

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