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

Вниз

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

 
Назаров Евгений   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
6-1077195126
csr
2004-02-19 15:52
2004.04.25
Открытые порты! Трабл!!!


1-1081168645
snake1977
2004-04-05 16:37
2004.04.25
OpenDialog


1-1081507555
Srg
2004-04-09 14:45
2004.04.25
Создание собственного компонента


1-1081662810
Sphinx
2004-04-11 09:53
2004.04.25
Событие восстановления окна


7-1077801100
Seldon
2004-02-26 16:11
2004.04.25
Кто сколько CPU времени ест.





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