Vielleicht ist jemand zu faul, um die ZIP-Datei mit dem Code herunter zu laden, entpacken und in Delphi zu öffnen (nett gemeint
), deswegen hier den Inhalt der Fuzzy-
Unit:
Delphi-Quellcode:
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) (* Wird in der Schleife noch erhoeht! *)
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;
VAR InFile: Text );
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;
BEGIN
BestSim:=0.0;
SearchStrLen:=PrepareTheString(SearchStr,SearchStr);
NGram1Len:=3;
IF SearchStrLen<7 THEN
NGram2Len:=2
ELSE
NGram2Len:=5;
WHILE NOT Eof(InFile) DO
BEGIN
Readln(InFile,TextBuffer);
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, '] ', TextBuffer);
END;
END
ELSE
Writeln('Absatz zu lang!');
END;
IF BestSim<Treshold THEN
Writeln('Kein Treffer; Best Match war ', BestSim);
END;
(***************************************************************************)
BEGIN
Writeln;
Writeln('+------------------------------------------+');
Writeln('| Unscharfe Suche im Information Retrieval |');
Writeln('| (C) 1997 Reinhard Rapp |');
Writeln('+------------------------------------------+');
Writeln;
Write('Name der zu durchsuchenden Datei: ');
Readln(Filename);
Write('Suchstring: ');
Readln(InputStr);
SearchStr:=Concat(' ',InputStr,' ');
Write('Mindesttrefferguete in % : ');
Readln(Treshold);
IF (Treshold>0) AND (Treshold<=100) AND (SearchStr<>'') AND (Filename<>'') THEN
BEGIN
Assign( InFile, Filename);
Reset( InFile );
FuzzyMatching( SearchStr, Treshold, InFile);
Close( InFile );
END;
Writeln;
Writeln('Tschuess!');
END.
Ich habe versucht, Funktionen zu kopieren und mit ein Paar Änderungen eine Test-Anwendung zu erstellen. Kann aber nicht testen, weil immer einen Compiler-Error an dieser Stelle bekomme:
Delphi-Quellcode:
...
Inc(i,NGramLen-3)
...
[Error] Unit1.pas(76): Assignment to FOR-Loop variable 'i'
und kann trotz Delphi-Referenz nicht kapieren, was es bedeuted.
Bitte, hilft mir die Code wie oben beschrieben zu medernisieren. Ich bin den ganzen Tag dabei und leider ohne Erfolg.
Danke im Voraus!