Newsgroup: it.comp.lang.delphi
Titolo: Esiste una implementazione della SOUNDEX per l'italiano?

Come in oggetto.
Saluti.
Marco Kregar
marco....@FirebirdSQL.it
www.FirebirdSQL.it
"over the bench the goat sings, under the bench the goat dies"

Penso che la "versione" inglese vada bene anche perchč dubito esista una
"versione" italiana
dell'algoritmo...
Al limite potrebbe essere utile avere gią un database di parole italiane e
relative chiavi...

Il giorno Sat, 23 Aug 2003 14:13:17 GMT il buon Balbar scriveva ...

Io ne avevo scritta una italiana ma in clipper : se non dovesse saltar 
fuori di meglio, la posso trovare e postare.
Ciao.Alberto.
-- 
Alberto Rubinelli - A2 SISTEMI               posted with Gravity 2.60b
Via Costantino Perazzi 22 - 28100 NOVARA (NO) - ITALY     ICQ 49872318
E-Mail : 
alb...@retrocomputing.net
  Tel. 0321 640149 
Web    : 
www.retrocomputing.net
      Fax  0321 391669 BBS  0321 392320

> Penso che la "versione" inglese vada bene
Siccome la SOUNDEX si basa sulla pronuncia dubito
che quella inglese possa essere di aiuto (!)
--


 che quella inglese possa essere di aiuto (!)
basta trovare i "pesi" delle varie lettere per l'italiano allora...

> basta trovare i "pesi" delle varie lettere per l'italiano allora...
simpatico ;-)


ci sono altre vie.
Ho trovato un algoritmo che se ne frega della lingua, e ci ho implementato
una funzione per interbase.
Presum che questo algoritmo o uno simile sia usato in funzini tipo la
similar di Sybase.
Ho tutto in  ufficio: domani posto un po di roba, ok?
Bye
A

 
Tempo fa avevo fatto una piccola ricerca sulla funzione Soundex, ma
tutte quelle che ho trovato erano per la lingua inglese (ne avevo
trovata una sola per una lingua diversa, non ricordo quale, ma
sicuramente non era italiano).
Sono curioso anch'io... sto in ascolto.
-- 
Roal Zanazzi

servono le vacanze.... :((
L'avevo qui, non in uff.
Se la usate direttamente nelle vs app potete ovviamente togilere la cdecl e
passare i parametri come stringhe invece come come pchar.
Il codice non č ottimizzato in quanto č la traduzione rapida di un blocco
scritto in vb.
La prima cosa ovvia che salta agli occhi č la sotituzione delle chiamate
alla funzione copy x estrarre i caratteri da una string (funzione mid di
basic).
Avevo trovato lo stesso algo in pascal ma era scritto da cani e non si
capiva un tubazzo.
Ricordate che non č farina del mio sacco, ok?
Per fare i test provate a passare stringhe simili pu aventi lunghezze
diverse e verificate il valore restituito dalla funzione.
uses sysutils, math;
function LCS(as1,as2: pchar): integer; cdecl;
implementation
function LCS(as1,as2: pchar): integer;
var
  d: array of array of integer;
  m,n,i,j: integer;
  s_i: string;
  t_j: string;
  cost: integer;
  s1, s2: string;
begin
  SetString(s1, as1,  StrLen(as1));
  SetString(s2, as2, StrLen(as2));
  n := length(s1);
  m := Length(s2);
  IF n = 0 THEN
    begin
    Result := m;
    exit;
    end;
  IF m = 0 THEN
    begin
    Result := n;
    exit;
    end;
  SetLength(d, n+1, m+1);
  for i:= 0 TO n do
    d[i, 0] := i;
  FOR j:= 0 TO m do
    d[0, j] := j;
  FOR i:= 1 TO n do
    begin
    s_i := copy(s1, i, 1);
    FOR j:= 1 TO m do
     begin
     t_j := copy(s2, j, 1);
     if s_i = t_j then
       cost := 0
     else
       cost := 1;
     d[i, j] := MIN(d[i - 1, j] + 1, d[i, j - 1] + 1);
     d[i, j] := MIN(d[i, j], d[i - 1, j - 1] + cost);
  end;
end;
Result := d[n, m];
Proposta:
aggiungere alle faq un po di queste cose.
Tipo il b.moore, questo che calcola lcs, e altri.
Che ne dite di mettere qualcosa anche nella guida di delphi che č in prep?
BaiBai
A
--
Per rispondere a questo messaggio non usare il reply ma scrivere al seguente
indirizzo:
al.salvati(at)mclink(puntino)it

a me piace questa funzione
trova se Text e' = Pattern a meno di k possibili errori, dove 
-una lettera diversa e' un errore
-2 lettere scambiate sono un errore
etc
function Approx(k: Integer; const Pat, Text: shortstring): Boolean;
{               |                  |     |
{               |                  |     +-- testo
{               |                  |
{               |                  +--- pattern
{               |
{               +--- n. errori possibili
}
var
   i,j,m,Tj,Tj1: integer;
   T: array[0..254] of integer;
   a,b:char;
begin
   m := length(Pat);
   if m <= k then {se la lunghezza di Pat e' minore del n.}
   begin  {degli errori ammessi, result:=True}
      result := True;
      exit;
   end;
   for j:=0 to m do
      T[j]:=j;
   for i:=length(Text) downto 1 do
   begin
      Tj1 := 0;
      for j:=1 to m do
      begin
         Tj := T[j];
         a:=Text[i];
         b:=Pat[length(Pat)-j+1];
         if a<>b then
            Inc(Tj1);
         if (Tj+1)<Tj then
            Tj1:=Tj + 1;
         if (T[j-1]+1)<Tj1 then
            Tj1:=T[j-1]+1;
         T[j]:=Tj1;
         Tj1:=Tj;
      end;
      if T[m]<=k then
      begin
         result:=True;
         exit;
      end;
   end;
   result := False;
end;