Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / проверка не по символьно а по "словам" / 7 сообщений из 7, страница 1 из 1
22.11.2019, 15:09
    #39892985
Zafar Z
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка не по символьно а по "словам"
У кого найдётся идея чтоб этот алгоритм на джава сделать так чтоб он проверял не по символам а по словам? Как это реализовать в этом классе:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
public class StringSimilarity {

    /**
     * Calculates the similarity (a number within 0 and 1) between two strings.
     */
    public static double similarity(String s1, String s2) {
        String longer = s1, shorter = s2;
        if (s1.length() < s2.length()) { // longer should always have greater length
            longer = s2; shorter = s1;
        }
        int longerLength = longer.length();
        if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
    /* // If you have Apache Commons Text, you can use it to calculate the edit distance:
    LevenshteinDistance levenshteinDistance = new LevenshteinDistance();
    return (longerLength - levenshteinDistance.apply(longer, shorter)) / (double) longerLength; */
        return (longerLength - editDistance(longer, shorter)) / (double) longerLength;

    }

    // Example implementation of the Levenshtein Edit Distance
    // See http://rosettacode.org/wiki/Levenshtein_distance#Java
    public static int editDistance(String s1, String s2) {
        s1 = s1.toLowerCase();
        s2 = s2.toLowerCase();

        int[] costs = new int[s2.length() + 1];
        for (int i = 0; i <= s1.length(); i++) {
            int lastValue = i;
            for (int j = 0; j <= s2.length(); j++) {
                if (i == 0)
                    costs[j] = j;
                else {
                    if (j > 0) {
                        int newValue = costs[j - 1];
                        if (s1.charAt(i - 1) != s2.charAt(j - 1))
                            newValue = Math.min(Math.min(newValue, lastValue),
                                    costs[j]) + 1;
                        costs[j - 1] = lastValue;
                        lastValue = newValue;
                    }
                }
            }
            if (i > 0)
                costs[s2.length()] = lastValue;
        }
        return costs[s2.length()];
    }

    public static void printSimilarity(String s, String t) {
        System.out.println(String.format(
                "%.3f is the similarity between \"%s\" and \"%s\"", similarity(s, t), s, t));
    }



}
...
Рейтинг: 0 / 0
22.11.2019, 15:12
    #39892990
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка не по символьно а по "словам"
Если я правильно понял задачу, надо строки преобразовать в массив строк, например, используя split. А потом сверять размеры массивов
...
Рейтинг: 0 / 0
22.11.2019, 15:16
    #39892995
Zafar Z
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка не по символьно а по "словам"
Павел Гужанов,
абсолютно верно поняли!
...
Рейтинг: 0 / 0
22.11.2019, 15:20
    #39892998
Zafar Z
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка не по символьно а по "словам"
Павел Гужанов,

Сори, нет не правильно поняли, надо алгоритм переделать так чтобы строки сверялись не по символам а по словам
...
Рейтинг: 0 / 0
22.11.2019, 15:50
    #39893020
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка не по символьно а по "словам"
Если это алгоритм Левеншнтейна тогда он должен мерять расстояние между словами.
Типа

Код: java
1.
int editDistance("Zafar", "Jafar");



Должен вернуть 1 т.к. ровно 1 буква поменялась.

Но чтобы Левин работал для предложений то надо соотв. побить предложение на слова и каждое из них подавать
на вход отдельно. И тогда функция должна иметь примерно такой вид.

Код: java
1.
int[] editSentenceDistance("Zafar kills Zofar", "Jafar kills sofa");



И вернет вектор параметров

Код: java
1.
{ 1, 0, 1 }



который в свою очередь надо уже как-то по другому сравнивать.
Среднее квадратическое например.
...
Рейтинг: 0 / 0
22.11.2019, 16:04
    #39893028
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка не по символьно а по "словам"
Каждое слово в алгоритме левенштейна это вектор со значениями. В данном случае нужно пронумеровать все слова из строк складывая их в hashmap назначая по increment значение (по сути значение вектора)

Из каждой строки строим вектор (по сути то же слово) а накидываем на алгоритм левенштейна тот же apache commons

Можно по сути сэмулировать и вместо int value значения вектора выдавать как char, благо их там много(надеюсь уникальных слов в датасете сильно меньше чем чем вариантов char).
...
Рейтинг: 0 / 0
22.11.2019, 16:04
    #39893029
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка не по символьно а по "словам"
для языков с суффиксами это будет не очень точно, для инглиша нормуль зайдет
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / проверка не по символьно а по "словам" / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]