Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Люди! Не подскажите, есть ли такая функция которая выдает по типу


Maloi ©   (2002-10-29 18:31:00) 

Люди! Не подскажите, есть ли такая функция которая выдает по типу значение "похожести" двух строк? ну например если 100 (это для примера) это 100% похожесть, 50 - 50%-ная и так далее?
в люой вариации смысла "похожести". Главное, чтоб если точно похоже возвращало максимальное значение функции:-)


Alx2   (2002-10-30 12:34:00) [1]

>Maloi (29.10.02 18:31)
На UBPFD готовое решение лежит.
http://delphibase.endimus.com/?action=viewfunc&topic=strmath&id=10289


Maloi   (2002-10-30 12:07:00) [2]

спасибо большое! очень помогли!

Дремучий! а ты я вижу тут местный шутник чтоли?:-)
так лучше бы помог, а шутки лучше при себе оставь


Юрий Зотов   (2002-10-30 00:19:00) [3]

Есть такой алгоритм Soundex. Он сравнивает строки по их "звуковому" образу. Например КОРОВА и КАРОВА для него - одинаковые строки (это, конечно, лишь самый простой пример).

Видел я в сети и русскоязычную реализацию этого алгоритма, но вот ссылку не запомнил. Если это то, что нужно, сделайте поиск строки Soundex, думаю, найдете.


()utLaw   (2002-10-29 20:31:00) [4]

А вот код, дающий ответ в виде двух строк, содержащих результат ставнения (там еще тесты вставлены...):

var
s1,s2,
r1,r2:string;
i,j,k,l,s,
eq,t:integer;

begin
r1:="";r2:="";

{ s1:="abcdefgh";{}
{ s2:="adefijgh"; {Deleting & Inserting}
{ s2:="adijgklh"; {Deleting, Inserting & Replacing}
{ s2:="adijkglmh"; {Cool Test! Replacing with different lengthed pieces!}

(* Full Test *)
{ s1:="abcdefghi"; s2:="adjklgmnho";{}
(* Full Test 2*)
{ s1:="abcdefgh"; s2:="adjklgmnho";{}
(* Full Test 3*)
{ s1:="abcdefghi"; s2:="adjklgmnh";{}
s1:="abcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghia"+
"bcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdefghiabcdef"+
"ghiabcdefghiabc";
s2:="adjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnha"+
"djklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklgmnhadjklg"+
"mnhadjklgmnhadj";{}

i:=1;j:=1;eq:=0;t:=0;
while (i


()utLaw   (2002-10-29 20:28:00) [5]

Я случайно занимался этим вопросом. И решил его. Вот код, дающий только число:

var
s1,s2:string;
i,j,k,l,s,
eq,t:integer;

begin

readln(s1);
readln(s2);

i:=1;j:=1;eq:=0;t:=0;
while (i<=length(s1)) and(j<=length(s2)) do
begin
if s1[i]=s2[j] then
begin
i:=i+1;j:=j+1;eq:=eq+1;t:=t+1;
end
else
begin
k:=1;
while ((i+k<=length(s1))or(j+k<=length(s2))) and(s1[i]<>s2[j]) do
begin
if (i+k<=length(s1))and(s1[i+k]=s2[j]) then
begin
i:=i+k;t:=t+k;
continue;
end;
if (j+k<=length(s2))and(s1[i]=s2[j+k]) then
begin
j:=j+k;t:=t+k;
continue;
end;
for l:=1 to k do
begin
if (i+k<=length(s1))and(j+l<=length(s2))and
(s1[i+k]=s2[j+l]) then
begin
i:=i+k;j:=j+l;t:=t+k;
break;
end;
if (i+l<=length(s1))and(j+k<=length(s2))and
(s1[i+l]=s2[j+k]) then
begin
i:=i+l;j:=j+k;t:=t+k;
break;
end;
end;
k:=k+1;
end;
if s1[i]<>s2[j] then
begin
if length(s1)-i>length(s2)-j
then t:=t+length(s1)-i+1
else t:=t+length(s2)-j+1;
i:=length(s1)+1;
j:=length(s2)+1;
end;
end;
end;
if i<=length(s1) then t:=t+length(s1)-i+1;
if j<=length(s2) then t:=t+length(s2)-j+1;
if t=0 then begin t:=1;eq:=1;end;
writeln(eq/t*100:4:2);
end.

To be continued...


Darts   (2002-10-29 19:58:00) [6]

Это регулярные выражения.


Дремучий   (2002-10-29 19:47:00) [7]

просто нужно? :))
это ты дяде на улице расскажешь
:)))

типа решаешь прикладную задачу,
даже не зная как к ней приступиться?
из какой предметной области?
и еще - лучше промолчать, чем соврать
:)


Maloi   (2002-10-29 19:02:00) [8]

нет, не устраиваюсь на работу:-) просто нужно


MBo   (2002-10-29 19:00:00) [9]

>Дремучий
Задачу в какой-то мере же выполняет ;)

А если серьезно, то есть понятие "расстояние между строками", кажется, на algolist.manual.ru имеется информация


Дремучий   (2002-10-29 18:54:00) [10]

или генетические алгоритмы...
там тоже нечто подобно есть...

Самое простое - перебором всех комбинаций, но я так понимаю нужно красивое решение? Кстати тут, одна девчушка, с подобной задачкой заявилась... На работу устраивашься? Тестовое задание?
:))


> MBo © (29.10.02 18:45)
> http://www.lmc-mediaagentur.de/dpool/tips/0040.htm

Хеадер заинтересовал, код рассмешил...
:))


Дремучий   (2002-10-29 18:47:00) [11]

Пробуй нейронные сети юзать
или архиваторные алгоритмы...

конкретней? - не скажу, не пробовал подобные вещи ваять
читай литературку...
:))


Maloi   (2002-10-29 18:47:00) [12]

ты меня за идиота держишь чтоли?:-)
это то понятно, а вот если:
"чемпион"-исходное слов и с ним сравнивают слова "вася" и "чемпионат".
твоя "супер" функция:-) вернет для двух этих слов ноль, а ведь последнее мягко говоря более похоже на исходное слово.


MBo   (2002-10-29 18:45:00) [13]

http://www.lmc-mediaagentur.de/dpool/tips/0040.htm


Шурик Ш   (2002-10-29 18:38:00) [14]

Так пойдет?

function Likeness(Str1,Str2: string): Integer;
begin
if Str1 = Str2 then Likeness := 100
else Likeness := 0;
end;


Шурик Ш   (2002-10-29 18:34:00) [15]

Сам-то понял?


Наверх

Титульная страница Поиск, карта сайта Написать письмо