Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
r0mzes121
7 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 4
#1

Схожесть текстов (расстояние Левенштейна) - C++

19.06.2014, 07:28. Просмотров 998. Ответов 6
Метки нет (Все метки)

Программа, которая сравнивает 2 теста на схожесть из 1.txt и 2.txt нужно что бы программа не подсчитывала восклицательные знаки и вопросительные

то есть 2 одинаковых текста но в конце второго будет куча восклицательных знаков процентовка всё ровно будет 100%

C++
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
#include <vector>
#include <fstream>
#include <string.h>                                      
#include <conio.h>                                       
#include  <time.h>                                      
using namespace std;
 
char * read_file (const char * name) {
    FILE * file = fopen(name, "r");
 
    fseek(file, 0, SEEK_END);
    int len = ftell(file);
    fseek(file, 0, SEEK_SET);
 
    char * s = new char[len + 1];
    len = fread(s, 1, len, file);
    s[len] = 0;
 
    fclose(file);
 
    return s;
}
 
int min3(int n1, int n2, int n3) {
    int ans = n1;
    if (n2 < ans)
        ans = n2;
    if (n3 < ans)
        ans = n3;
    return ans;
}
 
int m(char a, char b) {
    if (a == b)
        return 0;
    else
        return 1;
}
 
int levenstein_distance(char * s1, char * s2) {
    int l1 = strlen(s1);
    int l2 = strlen(s2);
 
    vector<int> current_row(l2 + 1);
    vector<int> previous_row(l2 + 1);
 
 
    for (int j = 0; j <= l2; j++)
        current_row[j] = j;
 
    for (int i = 1; i <= l1; i++) {
        previous_row = current_row;
        current_row[0] = i;
        for (int j = 1; j <= l2; j++) {
            int temp1, temp2, temp3;
            temp1 = previous_row[j] + 1;
            temp2 = current_row[j-1] + 1;
            temp3 = previous_row[j-1] + m(s1[i-1], s2[j-1]);
            current_row[j] = min3(temp1, temp2, temp3);
 
        }
    }
 
    return current_row[l2];
}
 
int main () {
    clock_t time;
    time=clock();
    const char * NAME1 = "1.txt", * NAME2 = "2.txt";
    char * s1, * s2;
    int l1, l2;
 
    s1 = read_file(NAME1);
    s2 = read_file(NAME2);
    if (strlen(s1) == 0 && strlen(s2) == 0)
    printf("100%%\n");
    else
    printf("%.3f%%\n", 100 * (1 - (float)levenstein_distance(s1, s2) / max(strlen(s1), strlen(s2))));
    time=clock() - time;
    printf("%f", (double)time/CLOCKS_PER_SEC);
    getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2014, 07:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Схожесть текстов (расстояние Левенштейна) (C++):

Степень похожести двух строк (слов). Расстояние Левенштейна - C++
Имеется два массива, в которых содержатся слова. Одно слово из базы, второе получено от человека и может содержать ошибки. К примеру: ...

Код Левенштейна - C++
Здравствуйте. Поставили такую задачу - реализовать код Левенштейна. Очень нужно, помогите пожалуйста) Нашел вот этот алгоритм Тут

Нужен скрипт, чтобы проверить email на схожесть - C++
Доброе время суток. Создаю тему в данном разделе, поскольку мой вопрос можно отнести к разным языкам как думаю. Задача проста, но для...

Расстояние между двумя множествами точек - это расстояние между наиболее близко расположенными точками этих - C++
1. Расстояние между двумя множествами точек - это расстояние между наиболее близко расположенными точками этих множеств. Найти расстояние...

Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили пе - C++
Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если...

Совмещение текстов - C++
Здравствуйте, у меня есть класс строк и класс текст. надо 1 текст сложить с другим( в программе уже 1 текст имеется) программа...

6
8-BITOV
541 / 484 / 87
Регистрация: 05.05.2014
Сообщений: 1,107
19.06.2014, 11:35 #2
r0mzes121, Вы бы хоть рассказали нам, что такое расстояние ливейнштейна, или хотя бы ссылочку дали...
0
gazlan
3134 / 1910 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
19.06.2014, 11:37 #3
Цитата Сообщение от r0mzes121 Посмотреть сообщение
лИвейнштейна

Левенштейн, Владимир Иосифович
0
r0mzes121
7 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 4
19.06.2014, 11:43  [ТС] #4
Расстояние Левенштейна (также редакционное расстояние или дистанция редактирования) между двумя строками в теории информации и компьютерной лингвистике — это минимальное количество операций вставки одного символа, удаления одного символа и замены одного символа на другой, необходимых для превращения одной строки в другую.
Впервые задачу упомянул в 1965 году советский математик Владимир Иосифович Левенштейн при изучении последовательностей . Впоследствии более общую задачу для произвольного алфавита связали с его именем. Большой вклад в изучение вопроса внёс Дэн Гасфилд. Источник: Статья Артемьева Ю.М.
0
gazlan
3134 / 1910 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
19.06.2014, 11:50 #5
Цитата Сообщение от r0mzes121 Посмотреть сообщение
не подсчитывала восклицательные знаки и вопросительные
Вы же все равно держите текст в памяти. Что мешает их просто выбросить?
1
r0mzes121
7 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 4
19.06.2014, 11:56  [ТС] #6
Преподаватель.
0
gazlan
3134 / 1910 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
19.06.2014, 21:45 #7
А как точно сформулировано задание?

Если требуется НЕ различать эти знаки, достаточно установить в 0 цену замены. А если НЕ учитывать - то только выбрасывать.

Добавлено через 9 часов 13 минут
Цитата Сообщение от gazlan Посмотреть сообщение
только выбрасывать
Гм. Правильно будет так: цена вставки/удаления этих символов должна быть нулевой.
0
19.06.2014, 21:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2014, 21:45
Привет! Вот еще темы с ответами:

Генератор случайных текстов - C++
Здравствуйте! Помогите пожалуйста выполнить лабу. Надо создать в C++ генератор случайных чисел, а я совсем в этом не разбираюсь. Буду...

Вывод случайных текстов на экран - C++
помогите пожалуйста, мне нужен код для случайных выводов текстов на экран

Запись текстов в Шестнадцатеричный код - C++
Доброго дня! Наш кассир (женщина лет 55) сама &quot;кодирует&quot; ККА. Хотела помочь ей и поискать онлайн-конвертер(программу) и не нашла...

Написать программу-кодировщик английских текстов - C++
Написать программу-кодировщик английских текстов по таким правилу: каждую букву текста заменить букву, Стоит в алфавите на три позиции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.