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

Вниз

Кому там про сравнение строки надо было?   Найти похожие ветки 

 
Kolan ©   (2007-02-06 20:05) [0]

— = нечеткое сравнение строк = — [D5, D6, D7, Win95/98, WinME, Win2k, WinXP]

WST   (14.09.05 21:29)

Представте, что у вас 2 строчки с текстом. Вам нужно сравнить насколько они совпадают. Они могут иметь разную длинну, символы, буквы, цифры. А мне необходимо узнать насколько процентов одна строка «похожа на вторую». Нужно мне это чтобы если человек введет вместо слова Мастера ДЕЛФИ, например, Мастра Делви или чтото в этом роде. Я уже долго пытаюсь что-то такое написать. Не получаеться. Подскажите, МАСТЕРА, плз.
<Цитата>

kami ©   (14.09.05 21:40) [1]

Из ветки
http://delphimaster.net/view/1-1115465140/&web=1
//------------------------------
Функция вычисляющая в процентах схожесть двух строк&#133
infom ©   (07.05.05 15:25)

Я как-то очень давно видел здесь упоминание об этой функции, но к сожалению найти её не смог&#133 помогите плиз найти или где искать !
//-----------------------------------------------
[1] Slym ©   (07.05.05 15:32)
/*
Нечеткое сравнение строк
Авторство:
  © N!ghtmare [nightmare2000@pisem.net]
*/
macro ПоискСовпаденийВСтроке(Стр1, Стр2, МаксПодстрока,ЧК,ЧС)
НомерСимволаСтр2 = 1;
while (strlen(substr(Стр2,НомерСимволаСтр2,МаксПодстрока))==МаксПодстрока)  
 НомерСимволаСтр1 = 1;
 Выход = 0;
 while ((Выход ==0) and (strlen(substr(Стр1,НомерСимволаСтр1,МаксПодстрока))==МаксПодстрока))
   if (substr(Стр1,НомерСимволаСтр1,МаксПодстрока)!=substr(Стр2,НомерСимволаСтр2,МаксП одстрока))
     НомерСимволаСтр1 = НомерСимволаСтр1 + 1;
   else
     ЧС = ЧС + 1;
     Выход = 1;
   end;
 end; // строка а
 ЧК = ЧК + 1;
 НомерСимволаСтр2 = НомерСимволаСтр2 + 1;
end; // строка б
SetParm(3, ЧК);
SetParm(4, ЧС);
end;

macro НечеткоеСравнениеСтрок(МаксДлинаПодстроки,Стр1,Стр2);
if ((МаксДлинаПодстроки<=0) or (trim(Стр1)==&laquo;&#132;) or (trim(Стр2)==&#147;&#132;))
 return 0;
end;                                                  
ЧК = 0; // Число комбинаций
ЧС = 0; // Число совпадений
ДлинаПодстроки = 1;
while (ДлинаПодстроки<=МаксДлинаПодстроки)
 ПоискСовпаденийВСтроке(Стр1,Стр2,ДлинаПодстроки,ЧК,ЧС);
 ПоискСовпаденийВСтроке(Стр2,Стр1,ДлинаПодстроки,ЧК,ЧС);
 ДлинаПодстроки = ДлинаПодстроки + 1;
end;                                  
if (ЧК == 0)
 return 0;
end;
return double(ЧС)/double(ЧК);
end;

macro FuzzyCompareString(S1,S2)
rez=НечеткоеСравнениеСтрок(3, trim(S1), trim(S2));
println(&#147;Процент совпадения: &#132;+(rez*100));
end;                                          

//FuzzyCompareString(&#147;ABDUL RAHMAN YASIN&raquo;,&laquo;ABDUL RAHMAN&raquo;);
//----------------------------------------------------------------------
[2] infom ©   (07.05.05 15:35)

Спасибки !
//-------------------------------------------------------------------
<Цитата>

kami ©   (14.09.05 21:46) [2]

[3] Nik_vr   (07.05.05 18:41)

Где нашел &#151; не помню&#133

//-----------------------------------------------------------
//MaxMatching &#151; максимальная длина подстроки (достаточно 3-4)
//strInputMatching &#151; сравниваемая строка
//strInputStandart &#151; строка-образец

// Сравнивание без учета регистра
// if IndistinctMatching(4, &laquo;поисковая строка&raquo;, &laquo;оригинальная строка  &#151; эталон&raquo;) > 40 then &#133
type
TRetCount = packed record
 lngSubRows: Word;
 lngCountLike: Word;
end;

//--------------------------------------------------------------

function Matching(StrInputA: WideString;
StrInputB: WideString;
lngLen: Integer): TRetCount;
var
TempRet: TRetCount;
PosStrB: Integer;
PosStrA: Integer;
StrA: WideString;
StrB: WideString;
StrTempA: WideString;
StrTempB: WideString;
begin
StrA := string(StrInputA);
StrB := string(StrInputB);

for PosStrA := 1 to Length(strA) &#151; lngLen + 1 do
begin
 StrTempA := System.Copy(strA, PosStrA, lngLen);

 PosStrB := 1;
 for PosStrB := 1 to Length(strB) &#151; lngLen + 1 do
 begin
   StrTempB := System.Copy(strB, PosStrB, lngLen);
   if SysUtils.AnsiCompareText(StrTempA, StrTempB) = 0 then
   begin
     Inc(TempRet.lngCountLike);
     break;
   end;
 end;

 Inc(TempRet.lngSubRows);
end; // PosStrA

Matching.lngCountLike := TempRet.lngCountLike;
Matching.lngSubRows := TempRet.lngSubRows;
end; { function }
//------------------------------------------------------------------------------
function IndistinctMatching(MaxMatching: Integer;
strInputMatching: WideString;
strInputStandart: WideString): Integer;
var
gret: TRetCount;
tret: TRetCount;
lngCurLen: Integer; //текущая длина подстроки
begin
 //если не передан какой-либо параметр, то выход
if (MaxMatching = 0) or (Length(strInputMatching) = 0) or
 (Length(strInputStandart) = 0) then
begin
 IndistinctMatching := 0;
 exit;
end;

gret.lngCountLike := 0;
gret.lngSubRows := 0;
 // Цикл прохода по длине сравниваемой фразы
for lngCurLen := 1 to MaxMatching do
begin
     //Сравниваем строку A со строкой B
 tret := Matching(strInputMatching, strInputStandart, lngCurLen);
 gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
 gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
     //Сравниваем строку B со строкой A
 tret := Matching(strInputStandart, strInputMatching, lngCurLen);
 gret.lngCountLike := gret.lngCountLike + tret.lngCountLike;
 gret.lngSubRows := gret.lngSubRows + tret.lngSubRows;
end;

if gret.lngSubRows = 0 then
begin
 IndistinctMatching := 0;
 exit;
end;

IndistinctMatching := Trunc((gret.lngCountLike / gret.lngSubRows) * 100);
end;
<Цитата>

default ©   (14.09.05 22:42) [3]

для этого нужно определиться с критерием схожести
естественна такая линия поведения: Вам нужно распознать ситуацию когда человек ошибся в наборе текста по которому хочет что-то найти для помощи ему в его поиске; для этого целесообразно найти какую-нибудь статистику таких ошибок и подумать в связи с ней о том каков должен быть искомый критерий;
пример;
пишет человек слово &laquo;Масерта&raquo;, а хотел &laquo;Мастера&raquo; то есть возникла перестановка букв, состав прежний; значит стоит перебрать все комбинации букв какие есть в слове &laquo;Масерта&raquo; и проверить получающиеся комбинации букв на &laquo;словарность&raquo; &#151; то есть что получаются реальные слова, а не ненаделённые смыслом последовательности букв и тд
это лишь одна возможная ситуация ошибки; поэтому думаю стоит посмотреть на статистику ошибок и подумать как сказано выше над тем какой должен быть критерий
<Цитата>

Джо ©   (14.09.05 22:45) [4]

Алгоритм SoundEx, реализован в StrUtils.pas. Впрочем, кажется, только для английского.
<Цитата>

wicked ©   (14.09.05 22:55) [5]

еще вот такое можно предложить:
http://delphibase.spb.ru/?action=viewfunc&topic=strmath&id=10289

в общем &#151; вариантов море&#133
<Цитата>

farapiplug   (14.09.05 23:05) [6]

http://itman.narod.ru/index.htm &#151; здесь на эту тему куча информации, хотя по мне, слишком долго разбираться
<Цитата>


 
Kerk ©   (2007-02-06 20:07) [1]

http://kladovka.net.ru/delphibase/?action=viewfunc&topic=strmath&id=10289



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

Форум: "Прочее";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.138 c
3-1165165267
Rav
2006-12-03 20:01
2007.03.04
TDbComboBox "наоборот"... (или правильнее TLookupDbComboBox )


2-1171016071
RASkov
2007-02-09 13:14
2007.03.04
Печать и предпредпросмотр :)


3-1165908469
erika
2006-12-12 10:27
2007.03.04
Собрать таблицу (итоге в запросе)


2-1171096473
Kolan
2007-02-10 11:34
2007.03.04
Как установить свой компонент в IDE?


15-1170702104
@!!ex
2007-02-05 22:01
2007.03.04
Есть у кого OpenSuse 10.2???





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский