Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение строк 
:(
    Опции темы
ASGDeveloper
Дата 20.7.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Младшие товарищи спросили, есть ли функция сравнения строк. Но функция более интеллектульная, которая возвращает "процент схожести" строк. Например строки "string1" и "string2" похожи примерно процентов на 95. А строки "string_abc" и "string_def" похожи на 70 процентов (примерно). На ум приходит только по символьное сравнение, но оно обломится при первом же другом символе. То есть строки "a_string" и "bс_string" похожи на 85 процентов, а посимвольное сравнение посчитает строки вообще не похожими ИМХО.

Подскажите, есть ли еще варианты сравнения? 

ЗЫ Есть вариант сравнивать по 2 символа. 
PM MAIL   Вверх
_hunter
Дата 20.7.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



судя по примерам -- сравниваеш посимвольно до первого расхождения и потом делиш длину полученнй строки на длину одной из строк 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Romikgy
Дата 20.7.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



можно искать слово функцией Pos, не нашли , убираем последний символ и снова ищем , до победного или нет конца 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 20.7.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Я бы сделал так
1) посимвольно сравниваем строки записываем, сколько подряд идущих символов совпало. Сдвигаем вторую строку на один символ - опять сравниваем и вычисляем максимум идущих подряд одинаковых символов.
Продолжаем сдвигать и сравнивать до окнчания второй строки.
2)Находим в какой из позиций сдвига была максимальная схожесть.
3)Удаляем одинаковые фрагменты в обоих строках.
4)Переходим опять к пункту 1 и делаем это до тех пор пока за все время поиска не найдем одинаковых последовательностей больше длинны в один символ.

сумма длин всех вычтеных последовательностей деленная на всю длинну строки даст нам степень схожести 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Girder
Дата 20.7.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Называеться сие: приблизительный(нечеткий) поиск

Например одна из реализаций СДВИГ-И 


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
skyboy
Дата 20.7.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



в PHP вычисляется... как же его... расстояние Ливенштейна? вроде, так... посмотри в интернете, что это такое. Уже довольно зрелый и отлаженный алгоритм... 
PM MAIL   Вверх
Palladin
Дата 20.7.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Цитата(_hunter @  20.7.2006,  15:35 Найти цитируемый пост)
судя по примерам -- сравниваеш посимвольно до первого расхождения и потом делиш длину полученнй строки на длину одной из строк



Да-да вроде как всё пашет(на форму кидаеш 3 edita и одну кнопку, в первом и втором едите строки которые сравниваеш, в третью выводиш процент), вот реализованый по алгоритму код:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
s,v:string[255];
i,k:integer;
begin
s:=edit1.text;
v:=edit2.text;
k:=0;
 for i:=1 to length(s) do
 if s[i]=v[i] then k:=k+1;

 if length(s)>length(v) then
 edit3.Text:=floattostr(k/length(s)*100)+'%'
 else edit3.text:=floattostr(k/length(v)*100)+'%';
end;

end.


P.S. Это то что ты хотел??? 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
volvo877
Дата 20.7.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Цитата(RooR @  20.7.2006,  22:09 Найти цитируемый пост)
Да-да вроде как всё пашет

Угу... Как бы не так  smile 

В первый Edit занеси 'a_string', во второй - 'bc_string', и получи совпадение в 0%  smile  
PM MAIL   Вверх
Palladin
Дата 20.7.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Гы маленькая доработка и всё пашетsmile)))


Код

procedure TForm1.Button1Click(Sender: TObject);
var
s,v:string[255];
i,k,j:integer;
begin
s:=edit1.text;
v:=edit2.text;
k:=0;
 for i:=1 to length(s) do
 for j:=1 to length(v) do
 if s[i]=v[j] then k:=k+1;

 if length(s)>length(v) then
 edit3.Text:=floattostr(k/length(s)*100)+'%'
 else edit3.text:=floattostr(k/length(v)*100)+'%';
end;
 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Mechanic
Дата 20.7.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Смотря где ещё применять такое сравнение. Вот к примеру писал сравнение прайсов от разных фирм, так там предпочтение отдавалось цифровым индексам перед словами. А ещё есть подход, когда анализируют фонетическую схожесть (типа "sounds like.." в том же буржуйском WinWord'е). В любом случае, строку всегда раскладывал на слова, потом чистил всю пунктуацию, отделял цифры от букв, переводил зарубежные слова по словарю (или тупой транслит).
Всё зависит от области применения.

Кста, можно и пример посмореть (не реклама, просто, чтоб не быть голословным): Exceller  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
skyboy
Дата 20.7.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 4
Всего: 260



...ищем "расстояние Левенштейна"... 
PM MAIL   Вверх
Palladin
Дата 20.7.2006, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Цитата(Mechanic @  20.7.2006,  22:41 Найти цитируемый пост)
Смотря где ещё применять такое сравнение. Вот к примеру писал сравнение прайсов от разных фирм, так там предпочтение отдавалось цифровым индексам перед словами. А ещё есть подход, когда анализируют фонетическую схожесть (типа "sounds like.." в том же буржуйском WinWord'е). В любом случае, строку всегда раскладывал на слова, потом чистил всю пунктуацию, отделял цифры от букв, переводил зарубежные слова по словарю (или тупой транслит).
Всё зависит от области применения.


Я думаю что "Младшим товарищам"  то что ты написал не нужноsmile хотя.... smile 
 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
ASGDeveloper
Дата 21.7.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Цитата(RooR @  20.7.2006,  22:38 Найти цитируемый пост)
Гы маленькая доработка и всё пашетsmile)))

Загоняем в оба эдита строку "my_super_string_test" и получаем совпадение 210%.
в первый едит пишем "_estt_" и получаем совпадение в 85%.  smile  
PM MAIL   Вверх
Palladin
Дата 21.7.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



ГЫ, ща будем думать smile

Добавлено @ 13:42 
Код

procedure TForm1.Button1Click(Sender: TObject);
var
s,v:string[255];
i,k,j:integer;
begin
s:=edit1.text;
v:=edit2.text;
k:=0;
 for i:=1 to length(s) do
 for j:=1 to length(v) do
 if s[i]=v[j] then
   begin
   if length(s)>length(v) then
     begin
      if k<>length(v) then
        begin
         k:=k+1;
        end;
     end
      else
       if k<>length(s) then k:=k+1;
   end;

 if length(s)>length(v) then
 edit3.Text:=floattostr(k/length(s)*100)+'%'
 else edit3.text:=floattostr(k/length(v)*100)+'%';
end;


Ошибки описанные выше устраненыsmile)) "Да-да вроде как пашетsmile" smile  


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Romikgy
Дата 21.7.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Пашет smile
Код

function testpercent(s1,s2: string): double;
var i,j,max: longint;
chto_ishem, v_chem,test: string;

begin
max:=0;

   if Length(s1)>Length(s2) then
   begin
   chto_ishem:=s2;
   v_chem:=s1;
   end else
   begin
    chto_ishem:=s1;
   v_chem:=s2;
   end;
   for i:=1 to Length(chto_ishem) do

   for j:=Length(chto_ishem)+1-i downto i do
    begin
   test:=copy( chto_ishem,i,j);
   if (Pos(
   test
   ,v_chem)>0) then
   if (max<Length(test))
   then
   max:= Length(test);
   end;
   Result:=max*100/Length(v_chem);

end;
 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.