Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.07;
Скачать: CL | DM;

Вниз

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

 
Maloi   (2002-10-29 18:31) [0]

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


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

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


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

Так пойдет?

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


 
MBo ©   (2002-10-29 18:45) [3]

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


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

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

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


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

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


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

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

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


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

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



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

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

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


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

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


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

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

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


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

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


 
()utLaw ©   (2002-10-29 20:28) [11]

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

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...


 
()utLaw ©   (2002-10-29 20:31) [12]

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

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<=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;
r1:=r1+"=";r2:=r2+"=";
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;
for s:=1 to k do r1:=r1+"X";
continue;
end;
if (j+k<=length(s2))and(s1[i]=s2[j+k]) then
begin
j:=j+k;t:=t+k;
for s:=1 to k do r2:=r2+"I";
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;
for s:=1 to k do r1:=r1+"R";
for s:=1 to l do r2:=r2+"R";
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;
for s:=1 to l do r1:=r1+"R";
for s:=1 to k do r2:=r2+"R";
break;
end;
end;
k:=k+1;
end;
if s1[i]<>s2[j] then
begin
for s:=i to length(s1) do r1:=r1+"R";
for s:=j to length(s2) do r2:=r2+"R";
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
begin
for s:=i to length(s1) do r1:=r1+"X";
t:=t+length(s1)-i+1;
end;
if j<=length(s2) then
begin
for s:=j to length(s2) do r2:=r2+"I";
t:=t+length(s2)-j+1;
end;
if t=0 then begin t:=1;eq:=1;end;
writeln("Похожесть строк : ",eq/t*100:4:2,"%.");
writeln("Нажмите <Enter>");
readln;
end.

Напиши мне, понравилось ли... Плз...


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

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

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


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

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

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


 
Alx2 ©   (2002-10-30 12:34) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2002.11.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
1-21642
lena13
2002-10-25 17:31
2002.11.07
DriveComboBox DirectoryListBox


1-21534
Sers
2002-10-29 12:18
2002.11.07
Размещение в памяти


7-21832
natalinka
2002-09-06 09:18
2002.11.07
выключить компьютер


1-21584
Vint
2002-10-28 16:57
2002.11.07
QuickReport


14-21758
Карлсон
2002-10-18 19:37
2002.11.07
винт запорот или еще можно восстановить?