Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
14-21757
Ketmar
2002-10-18 15:39
2002.11.07
Кэтмару винт купили! второй. на 60GB. будет там пингвин жить...


14-21786
Rouse_
2002-10-17 21:26
2002.11.07
ВСТРЕЧА В МОСКВЕ


14-21743
MsGuns
2002-10-17 21:46
2002.11.07
Много ругаемся. А это бандитизм !


6-21718
Eugene
2002-09-11 00:25
2002.11.07
Как узнать время на другом компьютере в локальной сети?


1-21588
Tornado
2002-10-29 21:34
2002.11.07
Ничего не понимаю....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский