Форум: "Прочее";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];
ВнизВ MSSQL есть SoundEx(str), есть ли такое для Delphi? Найти похожие ветки
← →
12 © (2010-07-12 08:43) [0]сторонние какие либо компаненты м.б.
ну и тупой вопрос :), а для русского что-то видел кто?
хочу добится
OtherSoundEx("Солнце")=OtherSoundEx("Сонце") и т.п.
← →
12 © (2010-07-12 08:53) [1]О, есть идейка транслитерировать слово, и потом натравить soundEx
← →
Anatoly Podgoretsky (2010-07-12 09:03) [2]> 12 (12.07.2010 08:53:01) [1]
Зачем когда существует русский вариант функции, алгоритм опубликован в Сети,
вот только как найти. Мне какжется, что на Королевстве было.
← →
12 © (2010-07-12 09:53) [3]спасибо, Анатолий
думаю, такой идеи вполне хватит, если не загнется на объемах
function TForm1.CheckStr(Str, Mask: String): Boolean;
var
mi, si: Integer;
begin
Result := False;
Str := AnsiUpperCase(Str);
Mask := AnsiUpperCase(Mask);
for mi := 1 to Length(Mask) do
begin
si := Pos(Mask[mi], Str);
if si = 0 then
Exit;
Delete(Str, 1, si);
end;
Result := True;
end;
← →
sniknik © (2010-07-12 09:55) [4]> О, есть идейка транслитерировать слово, и потом натравить soundEx
не получится
SELECT SOUNDEX ("Solnce"), SOUNDEX ("Sonce")
S452, S520
← →
12 © (2010-07-12 10:15) [5]вообще-то нет :)
этого CheckStк маловато будет
> SELECT SOUNDEX ("Solnce"), SOUNDEX ("Sonce")
> S452, S520
и то верно.
тогда тем более надо про расстояние Левинштейна глянуть
← →
12 © (2010-07-12 10:33) [6]да, так интереснее получается
function min(a,b,c: integer):integer;
begin
if a > b then result := b else result := a;
if result > c then result := c;
end;
function LevenshteinDistance(s, t: string):integer;
var
d: array [0..50, 0..50] of integer; // хорошее число 50, если 4 отнять, и на 46 поделить - 1 будет :)
i,j:integer;
m,n:integer;
begin
m := length(s);
n := length(t);
for i := 0 to m do d[i, 0] := i; // deletion
for j := 0 to n do d[0, j] := j; // insertion
for j := 1 to n do
begin
for i := 1 to m do
begin
if s[i] = t[j] then
d[i, j] := d[i-1, j-1]
else
d[i, j] := min
(d[i-1, j] + 1, // deletion
d[i, j-1] + 1, // insertion
d[i-1, j-1] + 1 // substitution
)
end;
end;
Result := d[m,n];
end;
теперь тока боюсь за объемы текстов для обработки
← →
12 © (2010-07-12 11:14) [7]круто..
валебалист = волейболист
, при допуске <5..
наверное оно!
← →
Омлет (2010-07-12 11:20) [8]Расстояние Левинштейна - не панацея.
← →
12 © (2010-07-12 11:32) [9]
> Расстояние Левинштейна - не панацея.
согласен
но результаты
еще, пример, - васкрисение(воскресенье), при < 5
пока заставляют остановится на этом
зы
Модификация Damerau-Levenshtein - на тестах не проявила себя как-то лучше
http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
← →
Омлет (2010-07-12 11:36) [10]А прикладная задача какая? У нас расстояние использовалось для поиска дублей по ФИО и номеру паспорта.
← →
12 © (2010-07-12 11:48) [11]искать товар в прайсах, в случае опечатки оператора
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c