Uma abordagem para gerar sugestões que usei com sucesso, mas nunca vi descritas em qualquer lugar, é pré-calcular as sugestões (ao construir o dicionário) usando funções hash "ruins".
A ideia é examinar os tipos de erros ortográficos que as pessoas cometem e projetar funções hash que atribuam uma grafia incorreta ao mesmo intervalo que sua grafia correta.
Por exemplo, um erro comum é usar a vogal errado, como definate invés de definitiva . Portanto, você cria uma função hash que trata todas as vogais como a mesma letra. Uma maneira fácil de fazer isso é primeiro "normalizar" a palavra de entrada e, em seguida, colocar o resultado normalizado por meio de uma função hash regular. Neste exemplo, a função de normalização pode eliminar todas as vogais, então definite
se torna dfnt
. A palavra "normalizada" é então hash com uma função hash típica.
Insira todas as palavras do dicionário em um índice auxiliar (tabela de hash) usando esta função hash especial. Os baldes nesta tabela terão listas de colisão mais longas porque a função hash é "ruim", mas essas listas de colisão são essencialmente sugestões pré-calculadas.
Agora, ao encontrar uma palavra com erro ortográfico, você consulta as listas de colisão do depósito que o erro ortográfico mapeia nos índices auxiliares. Ta da: Você tem uma lista de sugestões! Tudo o que você precisa fazer é classificar as palavras nele.
Na prática, você precisará de alguns índices auxiliares com outras funções hash para lidar com outros tipos de erros, como letras transpostas, letras simples / duplas e até mesmo um simplista como o Soundex para detectar erros ortográficos. Na prática, descobri que as pronúncias simplistas são muito úteis e, essencialmente, obsoletas algumas das que foram projetadas para encontrar erros de digitação triviais.
Portanto, agora você procura erros de ortografia em cada um dos índices auxiliares e concatena as listas de colisão antes de classificar.
Lembre-se de que as listas de colisão contêm apenas palavras que estão no dicionário. Com abordagens que tentam gerar grafias alternativas (como no artigo de Peter Norvig), você pode obter (dezenas de) milhares de candidatos que primeiro você precisa filtrar no dicionário. Com a abordagem pré-computada, você obtém talvez algumas centenas de candidatos e sabe que estão todos escritos corretamente, então pode pular direto para a classificação.
Atualização : desde então, encontrei uma descrição de algoritmo semelhante a esta, a pesquisa distribuída FAROO . Esta ainda é uma pesquisa limitada pela distância de edição, mas é muito rápida porque a etapa de pré-cálculo funciona como minha ideia de "funções de hash ruins". FAROO usa apenas um conceito limitado de uma função hash ruim.