Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.10;
Скачать: CL | DM;

Вниз

В 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1278707383
Юрий
2010-07-10 00:29
2010.10.10
С днем рождения ! 10 июля 2010 суббота


4-1210238349
tytus
2008-05-08 13:19
2010.10.10
как прочитать текст с чужого ListView?


4-1240850870
AndreyRus
2009-04-27 20:47
2010.10.10
hfile собственного процесса


11-1224874964
AnarchyMob
2008-10-24 23:02
2010.10.10
Использование диологовых окон из ресурсов


2-1279131478
AKE
2010-07-14 22:17
2010.10.10
Почему StrToFloat требует запятую, а Readln точку?