Так так есть кое какие результаты, вот нашел две реализации неточного поиска, один вычисляет расстояние Левинштейна, другой возвращает в % похожесть одной строки на другую(взят с vingard)
Расстояние Левинштейна:
| Код |
var const cuthalf = 100; buf: array [0..199] of integer;
function min3(a, b, c: integer): integer; begin Result := a; if b < Result then Result := b; if c < Result then Result := c; end;
function Levenstain(s, t: string): integer; var i, j, m, n: integer; cost: integer; flip: boolean; begin s := copy(s, 1, cuthalf - 1); t := copy(t, 1, cuthalf - 1); m := length(s); n := length(t); if m = 0 then Result := n else if n = 0 then Result := m else begin flip := false; for i := 0 to n do buf[i] := i; for i := 1 to m do begin if flip then buf[0] := i else buf[cuthalf] := i; for j := 1 to n do begin if s[i] = t[j] then cost := 0 else cost := 1; if flip then buf[j] := min3((buf[cuthalf + j] + 1), (buf[j - 1] + 1), (buf[cuthalf + j - 1] + cost)) else buf[cuthalf + j] := min3((buf[j] + 1), (buf[cuthalf + j - 1] + 1), (buf[j - 1] + cost)); end; flip := not flip; end; if flip then Result := buf[cuthalf + n] else Result := buf[n]; end;
end;
|
Вот который возвращает похожесть в процентах:
| Код |
function testpercent(s1,s2: string): double; var i,j,max: longint; chto_ishem, v_chem,test: string; begin max:=0; if Length(s1)>Length(s2) then begin chto_ishem:=s2; v_chem:=s1; end else begin chto_ishem:=s1; v_chem:=s2; end; for i:=1 to Length(chto_ishem) do for j:=Length(chto_ishem)+1-i downto i do begin test:=copy( chto_ishem,i,j); if (Pos( test ,v_chem)>0) then if (max<Length(test)) then max:= Length(test); end; Result:=max*100/Length(v_chem); end;
|
Так вот Sardar, писал что неплохо было бы сформировать из словаря префиксное дерево, можно об этом поподробнее... кстати в моем случае все содержимое словаря недоступно, есть только функция на проверку наличия слова в словаре, чувствую этого будет маловато, может есть ещё варианты куда двигаться? |