![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Люди! Не подскажите, есть ли такая функция которая выдает по типу
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]Сам-то понял?