Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (1): [1]   

> Описание: Сравнение текста. Исправление искаверканного текста по словарю.
Kibor
Отправлено: 12 Февраля, 2021 - 01:51:12
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




comparestr Позволяет сравнить между собой 2 строки и выдать оценку схожести по содержимому. По результату выполнения схожа с функцией SequenceMatcher Python, но немного отличается оценка. Однако результат работы может с не меньшим успехом быть использован для тех же целей.
используется алгоритм Расстояние Дамерау — Левенштейна

Первое применение - возвращает оценку сравнения

Второе применение дает возможность вести проверку и выбор наиболее близкой строки с массива string

=================================================

Первое применение - возвращает оценку сравнения

Синтаксис:
CODE:
double t=comparestr("машина", "мякиш");
messagebox (t);

В виде параметров принимает сравниваемые строки.
Возвращает положительное дробное число до 1.
1 возвращается при полном совпадение.
Чем число меньше - тем меньше совпадений.

Пример:
CODE:
string all_string[7]={"junior", "working", "recognition", "with", "violet", "interest", "renewal"}

messagebox ("корявое junlor = точое "+compare("junlor"));//Узнаем каккое слово близкое к корявому junlor
messagebox ("корявое worklng = точое "+compare("worklng"));//Узнаем каккое слово близкое к корявому worklng
messagebox ("корявое recognjtion = точое "+compare("recognjtion"));//Узнаем каккое слово близкое к корявому recognjtion
messagebox ("корявое recognllltjon точое = "+compare("recognllltjon"));//Узнаем каккое слово близкое к корявому recognllltjon
messagebox ("корявое lnterest = точое "+compare("lnterest"));//Узнаем каккое слово близкое к корявому lnterest
messagebox ("корявое vlolet = точое "+compare("vlolet"));//Узнаем каккое слово близкое к корявому vlolet
messagebox ("а на что похоже это? ietsert = точое "+compare("ietsert"));//Узнаем каккое слово близкое к корявому ietsert

function compare(string A)
{
double t, max=-1;
int i=0;
for (int n=0; n<sizearray(all_string); n++)
{
t=comparestr(A, all_string[n]);
if (t>max)
{
max=t;
i=n;
}
}
return all_string[i];
}


=============================

Второе применение дает возможность вести проверку и выбор наиболее близкой строки с массива string

Синтаксис:
CODE:
comparestr("viot", 0.5, #all_string[0], 7);

Первый параметр - строка которую сравнивает
Второй - Оценка от 0 до 1 включительно, менее или равно которой слово заменено не будет.
Третий параметр - указатель на массив string в котором записаны строки с которыми будем сравнивать
Четвертый параметр - количество элементов массива с которыми будем сравнивать начиная с указателя

Возвращает наиболее близкую строку с массива.

Пример
CODE:
string all_string[7]={"junior", "working", "recognition", "with", "violet", "interest", "renewal"}

messagebox (comparestr("viot", 0.5, #all_string[0], sizearray(all_string)));


Выведет violet

=========================

Можно использовать двойной массив данных.

Пример
CODE:
string all_string[2][3];
all_string[0][0]="junior";
all_string[0][1]="valet";
all_string[0][2]="recognition";

all_string[1][0]="with";
all_string[1][1]="violet";
all_string[1][2]="interest";

messagebox (comparestr("viot", 0.2, #all_string[0][0], sizearray(all_string[])));
messagebox (comparestr("viot", 0.2, #all_string[1][0], sizearray(all_string[])));


============================

Последним, не обязательным параметром можно указать Указатель на int, в который запишется индекс совпавшего слова в массиве. Или -1 если оценка менее указанной и ничего не совпало.
Пример
CODE:
string all_string[7]={"junior", "working", "recognition", "with", "violet", "interest", "renewal"}
int n;
messagebox (comparestr("viot", 0.5, #all_string[0], sizearray(all_string), #n));
messagebox (n);
 
 Top
Kibor
Отправлено: 12 Февраля, 2021 - 02:58:44
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Переделал возвращаемую оценку, поскольку прошлая оценка была зависима от длины текста.

Возвращает положительное дробное число до 1.
1 возвращается при полном совпадение.
Чем число меньше - тем меньше совпадений.
 
 Top
Kibor
Отправлено: 12 Февраля, 2021 - 08:35:17
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Доработка comparestr
Появилась возможность вести проверку и выбор наиболее близкой строки с массива string

Синтаксис:
CODE:
comparestr("viot", 0.5, #all_string[0], 7);

Первый параметр - строка которую сравнивает
Второй - Оценка от 0 до 1 включительно, менее или равно которой слово заменено не будет.
Третий параметр - указатель на массив string в котором записаны строки с которыми будем сравнивать
Четвертый параметр - количество элементов массива с которыми будем сравнивать начиная с указателя

Возвращает наиболее близкую строку с массива.

Пример
CODE:
string all_string[7]={"junior", "working", "recognition", "with", "violet", "interest", "renewal"}

messagebox (comparestr("viot", 0.5, #all_string[0], sizearray(all_string)));


Выведет violet
 
 Top
ivantu
Отправлено: 12 Февраля, 2021 - 10:44:18
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 732
Дата рег-ции: Нояб. 2013  
Репутация: 14




Очень крутая и полезная функция! Спасибо Владимир за доработку!
 
 Top
Kibor
Отправлено: 12 Февраля, 2021 - 12:52:35
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




ivantu , Пользуйтесь)

Пример как с помощью словаря корректировать исковерканный текст:
 Цитата:
Кибарг 5.81, мосчний и удёбний инстрьюуменьть для саздания праграм атамамзации любим дейстий на кампютире.




CODE:
string slovar[5000];
int k=0;

if (fopen ("C:\словарь.txt", "r")!=0)
{
while(freadline(slovar[k])) k++;//чтение строки
fclose();
}

string Text="Кибарг 5.81, мосчний и удёбний инстрьюуменьть для саздания праграм атамамзации любим дейстий на кампютире.";

string slovo[100000];
int ks=regexsearch(100000, #slovo[0], Text, "[\wа-яА-ЯёЁ]+|[:punct:]");

string Res="";
for (int n=0; n<ks; n++)
{
Res=Res+comparestr(slovo[n], 0.4, #slovar[0], k)+" ";
}
messagebox(Text+"^r^n^r^n==========^r^n^r^n"+Res);


Нам нужен словарь в котором находятся все нужные нам слова. При распознавание текста в играх и программах мы как правило знаем весь ограниченный используемый лексикон.
В данном случае 5.81 в словаре не находится, поэтому функция comparestr не подставила вместо него ничего, так как оценка его сравнения была ниже или равна указанной 0.4.

Словарь C:\словарь.txt:
 Цитата:
кибор
мощный
и
удобный
инструмент
для
создания
программ
автоматизации
любых
действий
на
компьютере


Для исправления непредсказуемого текста нужен словарь побольше.. Ну и учитывать различные нюансы словосочетаний.. Но Кибор для этого не предназначен.
 
 Top
Skycrew
Отправлено: 16 Февраля, 2021 - 10:26:10
Post Id



Пользователь
Мастер


Покинул форум
Сообщений всего: 123
Дата рег-ции: Июль 2014  
Репутация: 0




Круто! Спасибо!
 
 Top
Kibor
Отправлено: 15 Ноября, 2023 - 12:17:22
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Доработал comparestr

Можно использовать двойной массив данных.

Пример
CODE:
string all_string[2][3];
all_string[0][0]="junior";
all_string[0][1]="valet";
all_string[0][2]="recognition";

all_string[1][0]="with";
all_string[1][1]="violet";
all_string[1][2]="interest";

messagebox (comparestr("viot", 0.2, #all_string[0][0], sizearray(all_string[])));
messagebox (comparestr("viot", 0.2, #all_string[1][0], sizearray(all_string[])));


============================

Последним, не обязательным параметром можно указать Указатель на int, в который запишется индекс совпавшего слова в массиве. Или -1 если оценка менее указанной и ничего не совпало.
Пример
CODE:
string all_string[7]={"junior", "working", "recognition", "with", "violet", "interest", "renewal"}
int n;
messagebox (comparestr("viot", 0.5, #all_string[0], sizearray(all_string), #n));
messagebox (n);
 
 Top
Kibor
Отправлено: 23 Ноября, 2023 - 20:43:07
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Демонстрация сортировки по названиям команд с помощью comparestr

Нажмите для увеличения
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« О программе Кибор »


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




Powered by