Форум: "Основная";
Текущий архив: 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.054 c