Главная страница
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.49 MB
Время: 0.024 c
1-1081148741
zxcvb
2004-04-05 11:05
2004.04.25
Как в ячейки StringGrid сделать CheckBox?


7-1078177032
Sergeika
2004-03-02 00:37
2004.04.25
Как отловить нажатие мультимедиа клавиши на клавиатуре?


14-1080679041
real_dimedrol
2004-03-31 00:37
2004.04.25
Транслятор интерпретатор


14-1080684596
ИМХО
2004-03-31 02:09
2004.04.25
На самом деле, двоичное исчисление придумал АС Пушкин


14-1080755697
Иван Сусанин
2004-03-31 21:54
2004.04.25
Кому надо засунуть иконку в трэй или спрятать процесс....