Selyn
08-12-2013, 11:46
[C++]ciao a tutti sto facendo un dizionario con gli alberi binari di ricerca e quando effettuo una ricerca se una parola non è nel dizionario devo stampare le parole più simili e quindi uso la distanza di leveshtein...solo che ho un problema...non funziona tanto bene XD nel senso che quando cerco una parola se non c'è non mi stampa le parole più simili...vi metto il codice spero che mi riuscite ad aiutare...
questo è l'algoritmo di distanza di levshtein
int matching::dist_Levenshtein(string x, string y)
{
int row = x.size()+1;
int col = y.size()+1;
int m[row][col];
// riempio prima riga e prima colonna
for( int i = 0; i < row; i++) { m[i][0] = i; }
for( int j = 0; j < col; j++) { m[0][j] = j; }
// inizio a calcolare la distanza
for( int i = 1; i < row; i++ ) {
for( int j = 1; j < col; j++ ) {
if(x.at(i-1) != y.at(j-1) )
m[i][j] = Minimo(
m[i-1][j] + 1, // inserimento
m[i][j-1] + 1, // cancellazione
m[i-1][j-1] // sostituzione
);
}
}
int result = m[row-1][col-1];
return result;
}
questa invece è la funzione che dovrebbe stamparli le parole simili
void matching::trova_suggerimenti()
{
multimap<int, int> dist_Lev;
/*~~~~~~~~~~~~~~~~~~~*/
for(register int i = 0; i < parola_vocabolario.size(); i++)
dist_Lev.insert(pair<int, int> (dist_Levenshtein(parola_vocabolario[i], parola), i));
multimap<int, int>::iterator iter = dist_Lev.end();
iter--;
int massimo = iter->first;
do
{
suggerimenti.push_back(parola_vocabolario[iter->second]);
iter--;
}while(iter->first == massimo);
}
è strana la cosa....se io nel dizionario ho atomo e cerco invece atoma,non mi da come risultato forse cercavi :atomo...mi da tutt'altro!!
questo è l'algoritmo di distanza di levshtein
int matching::dist_Levenshtein(string x, string y)
{
int row = x.size()+1;
int col = y.size()+1;
int m[row][col];
// riempio prima riga e prima colonna
for( int i = 0; i < row; i++) { m[i][0] = i; }
for( int j = 0; j < col; j++) { m[0][j] = j; }
// inizio a calcolare la distanza
for( int i = 1; i < row; i++ ) {
for( int j = 1; j < col; j++ ) {
if(x.at(i-1) != y.at(j-1) )
m[i][j] = Minimo(
m[i-1][j] + 1, // inserimento
m[i][j-1] + 1, // cancellazione
m[i-1][j-1] // sostituzione
);
}
}
int result = m[row-1][col-1];
return result;
}
questa invece è la funzione che dovrebbe stamparli le parole simili
void matching::trova_suggerimenti()
{
multimap<int, int> dist_Lev;
/*~~~~~~~~~~~~~~~~~~~*/
for(register int i = 0; i < parola_vocabolario.size(); i++)
dist_Lev.insert(pair<int, int> (dist_Levenshtein(parola_vocabolario[i], parola), i));
multimap<int, int>::iterator iter = dist_Lev.end();
iter--;
int massimo = iter->first;
do
{
suggerimenti.push_back(parola_vocabolario[iter->second]);
iter--;
}while(iter->first == massimo);
}
è strana la cosa....se io nel dizionario ho atomo e cerco invece atoma,non mi da come risultato forse cercavi :atomo...mi da tutt'altro!!