Bom galera, encontrei na net um algoritmo de correção ortografica e gostaria de entender ele mais afundo para poder implentar algo para uso próprio, pois o conceito que eu usaria seria praticamente o mesmo, procurar uma palavra em um banco de dados e retornar a palavra que tiver o maior ‘score’ de acerto.
Vou colocar o código que eu encontrei e dizer um poco do que eu entendi, o problema é que ele usa de algumas classes que eu nunca tinha nem visto, então estou com dificuldade de entender o que ele realmente faz.
private final HashMap<String, Integer> nWords = new HashMap<String, Integer>();
public Spelling(String file) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(file));
String temp = null;
Pattern p = Pattern.compile("\w+");
while ((temp = in.readLine()) != null) {
Matcher m = p.matcher(temp.toLowerCase());
while (m.find()) {
//System.out.println(nWords.containsKey(temp) ? nWords.get(temp) + 1 : 1);
nWords.put((temp = m.group()), nWords.containsKey(temp) ? nWords.get(temp) + 1 : 1);
}
}
in.close();
}
private final ArrayList<String> edits(String word) {
ArrayList<String> result = new ArrayList<String>();
for (int i = 0; i < word.length(); ++i) {
result.add(word.substring(0, i) + word.substring(i + 1));
}
for (int i = 0; i < word.length() - 1; ++i) {
result.add(word.substring(0, i) + word.substring(i + 1, i + 2) + word.substring(i, i + 1) + word.substring(i + 2));
}
for (int i = 0; i < word.length(); ++i) {
for (char c = 'a'; c <= 'z'; ++c) {
result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i + 1));
}
}
for (int i = 0; i <= word.length(); ++i) {
for (char c = 'a'; c <= 'z'; ++c) {
result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i));
}
}
return result;
}
public final String correct(String word) {
if (nWords.containsKey(word)) {
return word;
}
ArrayList<String> list = edits(word);
HashMap<Integer, String> candidates = new HashMap<Integer, String>();
for (String s : list) {
if (nWords.containsKey(s)) {
candidates.put(nWords.get(s), s);
}
}
if (candidates.size() > 0) {
return candidates.get(Collections.max(candidates.keySet()));
}
candidates.clear();
for (String s : list) {
for (String w : edits(s)) {
if (nWords.containsKey(w)) {
candidates.put(nWords.get(w), w);
}
}
}
return candidates.size() > 0 ? candidates.get(Collections.max(candidates.keySet())) : word;
}
public static void main(String args[]) throws IOException {
Spelling spel = new Spelling("C:\big.txt");
for (int i = 0; i < args.length; i++) {
System.out.println(spel.correct(args[i]));
}
}
}
Bom, o que eu entendi é, ele cria uma HashMap com todas as palavras encontradas nesse arquivo de base(o arquivo big.txt contém a maioria das palavras em ingles existentes) só que eu nao entendi o que significa aquele inteiro dentro do HashMap.
Depois de carregar todo o arquivo dentro de uma HashMap, ele pega os argumentos passados, que seriam as palavras para se corrigir e cria uma ArrayList com as possibilidades de escrita dentro de cada argumento, tendo um anagrama gigante de cada entrada.
E no método correct ele procura a palavra dentro da ArrayList que tenha um maior score, certo? Porém eu nao sei ao certo como ele faz isso, ou se é isso mesmo que ele está fazendo.
Uma das coisas que eu acabei nao entendo muito bem, foram os if’s ternarios que eles usaram, eu ainda tenho uma dificuldade pra entender o que está sendo feito dentro de um if ternário =/
Quero poder entender direito o que esse programa faz para poder implentar o meu, achei a ideia muito boa e um conceito muito legal de estatistica.
Se alguém ai puder dar uma ajuda, obrigado!