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

Вниз

Сравнение строк   Найти похожие ветки 

 
Назаров Евгений   (2004-04-06 15:04) [0]

Подскажите пожалуйста, где можно взять процедуру для сравнения строк с заданным уровнем правдоподобия ?? Это нужно для определения наиболее подходящих строк, где-то видел, теперь найти не могу


 
han_malign ©   (2004-04-06 15:13) [1]

StrUtils.SoundExSimilar


 
HSolo ©   (2004-04-06 15:16) [2]

http://delphibase.endimus.com/?action=viewfunc&topic=strmath&id=10289

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=722
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=727


 
Serginio666   (2004-04-06 16:55) [3]

Вообщето можно вычислить LCS для двух строк например который применяется в программе diff и сравнить его с длиной искомой строки.
Посмотри у Бакнелла
http://www.diasoft.kiev.ua/cgi/webshop.cgi?config=/home/www/htdocs/diasoft/cgi/config.txt&uid=UPTiZgAA1081172222&command =link--ds_materials_set


 
pasha_golub ©   (2004-04-06 16:59) [4]


program FuzzySearch;
const
 MaxParLen = 255;
var
 InFile: Text;
 Filename: String;
 InputStr: String;

 SearchStr: String;
 Treshold: Integer;

 function PrepareTheString ( OriginStr: String; VAR ConvStr:String): Integer;
 var
   i: Integer;
 begin
   ConvStr := OriginStr;
   for i := 1 to Length(OriginStr) do
   begin
     ConvStr[i] := UpCase(ConvStr[i]);
     if ConvStr[i] < "0" then
ConvStr[i] := " "
     else
case ConvStr[i] of
  Chr(196) : ConvStr[i] := Chr(228);
  Chr(214) : ConvStr[i] := Chr(246);
  Chr(220) : ConvStr[i] := Chr(252);
  Chr(142) : ConvStr[i] := Chr(132);
  Chr(153) : ConvStr[i] := Chr(148);
  Chr(154) : ConvStr[i] := Chr(129);
  ":" : ConvStr[i] := " ";
  ";" : ConvStr[i] := " ";
  "<" : ConvStr[i] := " ";
  ">" : ConvStr[i] := " ";
  "=" : ConvStr[i] := " ";
  "?" : ConvStr[i] := " ";
  "[" : ConvStr[i] := " ";
  "]" : ConvStr[i] := " ";
     end;
   end;
   PrepareTheString := i;
 end;

 function NGramMatch (TextPara, SearchStr: String; SearchStrLen, NGramLen: Integer;
 var MaxMatch: Integer ) : Integer;
 var
   NGram: String[8];
   NGramCount: Integer;
   i, Count: Integer;
 begin
   NGramCount := SearchStrLen - NGramLen + 1;
   Count := 0;
   MaxMatch := 0;
   for i := 1 to NGramCount do
   begin
     NGram := Copy(SearchStr, i, NGramLen);
     if (NGram[NGramLen - 1] =" ") and (NGram[1] <> " ") then
Inc(i, NGramLen - 3)
     else
     begin
Inc(MaxMatch,NGramLen);
if Pos(NGram, TextPara) > 0 then
  Inc(Count);
     end;
   end;
   NGramMatch := Count * NGramLen;
 end;

 procedure FuzzyMatching(SearchStr: String; Treshold: Integer; InString: string);
 var
   TextPara: String;
   TextBuffer: String;
   TextLen: Integer;
   SearchStrLen: Integer;
   NGram1Len: Integer;
   NGram2Len: Integer;
   MatchCount1: Integer;
   MatchCount2: Integer;
   MaxMatch1: Integer;
   MaxMatch2: Integer;
   Similarity: Real;
   BestSim: Real;
   i: integer;
 begin
   BestSim := 0.0;
   SearchStrLen := PrepareTheString(SearchStr, SearchStr);
   NGram1Len := 3;
   if SearchStrLen < 7 then
     NGram2Len := 2
   else
     NGram2Len := 5;
     while InString<>"" do
    begin
     i := pos(" ",InString);
     if i=0 then
      begin
TextBuffer := InString;
InString := "";
      end
     else
begin
 TextBuffer := concat(" ",copy(InString,1,i)," ");
 Delete(InString,1,i);
end;
     TextLen := PrepareTheString(TextBuffer, TextPara) + 1;
     TextPara := Concat(" ", TextPara);
     if TextLen < MaxParLen - 2 then
     begin
MatchCount1 := NGramMatch(TextPara, SearchStr, SearchStrLen, NGram1Len, MaxMatch1);
MatchCount2 := NGramMatch(TextPara, SearchStr, SearchStrLen, NGram2Len, MaxMatch2);
Similarity := 100.0 * (MatchCount1 + MatchCount2) / (MaxMatch1 + MaxMatch2);
if Similarity > BestSim then
   BestSim := Similarity;
if Similarity >= Treshold then
begin
  Writeln;
  Writeln("[", Similarity:8:4, "%] ", TextBuffer);
end;
     end
     else
Writeln("Текст очень большой");
    end;
   if BestSim < Treshold then
     Writeln("Нет совпадения; Наилучшее такое: ", BestSim);
 end;

begin
 Writeln("Введите строку в которой будем искать");
 Readln(InputStr);
 Writeln("Строку для которой будем искать: ");
 Readln(SearchStr);
 SearchStr := Concat(" ", SearchStr, " ");
 Write("Введите качество в %: ");
 Readln(Treshold);
 if (Treshold > 0) and (Treshold <= 100) and (SearchStr <> "") and (InputStr <> "")then
   FuzzyMatching( SearchStr, Treshold, InputStr);
 Writeln;
 Writeln("Bye!");
 readln;
end.



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

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

Наверх




Память: 0.47 MB
Время: 0.032 c
1-1081617949
Ew
2004-04-10 21:25
2004.04.25
Ищу исходник, может быть у кого есть :)


6-1077882761
LKan
2004-02-27 14:52
2004.04.25
картинка


1-1081590998
CCh
2004-04-10 13:56
2004.04.25
Dll в системе


1-1081253610
Shnurok
2004-04-06 16:13
2004.04.25
Отображение формул химических соединений


6-1077339786
Jesus_51
2004-02-21 08:03
2004.04.25
Подключение к базе данных в интернете...





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