powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / проверка не по символьно а по "словам"
7 сообщений из 7, страница 1 из 1
проверка не по символьно а по "словам"
    #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
проверка не по символьно а по "словам"
    #39892990
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял задачу, надо строки преобразовать в массив строк, например, используя split. А потом сверять размеры массивов
...
Рейтинг: 0 / 0
проверка не по символьно а по "словам"
    #39892995
Zafar Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
абсолютно верно поняли!
...
Рейтинг: 0 / 0
проверка не по символьно а по "словам"
    #39892998
Zafar Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

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

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

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


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