Olá!
Fiz a minha versão do corretor com o gerador turbinado alterando a função original ao invés de criar uma função separada.
Funções para o gerador de palavras:
def insere_letras(palavra):
letras = 'abcdefghijklmnopqrstuvwxyzáâàãéêèíÇîìóôõòúûùç'
fatias = [(palavra[:i], palavra[i:]) for i in range(len(palavra)+1)]
return [e+letra+d for e, d in fatias for letra in letras]
def deleta_letras(palavra):
fatias = [(palavra[:i], palavra[i+1:]) for i in range(len(palavra)+1)]
return [e+d for e, d in fatias]
def troca_letras(palavra):
letras = 'abcdefghijklmnopqrstuvwxyzáâàãéêèíÇîìóôõòúûùç'
fatias = [(palavra[:i], palavra[i+1:]) for i in range(len(palavra)+1)]
return [e+letra+d for e, d in fatias for letra in letras]
def inverte_letras(palavra):
fatias = [(palavra[:i], palavra[i:]) for i in range(len(palavra)+1)]
return [e + d[1:2] + d[0:1] + d[2:] for e, d in fatias if len(d)>1]
Gerador de palavras:
def gerador_de_palavras(palavra):
return insere_letras(palavra)+deleta_letras(palavra)+troca_letras(palavra)+inverte_letras(palavra)
Corretor:
def corretor(palavra):
palavras_geradas = gerador_de_palavras(palavra)
novas_palavras = []
for palavra_gerada in palavras_geradas:
novas_palavras += gerador_de_palavras(palavra_gerada)
novas_palavras = set(novas_palavras)
return max(novas_palavras, key=probabilidade)
Avaliador:
def avaliador(testes, vocabulario):
acertos = 0
palavras_desconhecidas = 0
for correta, incorreta in testes:
if corretor(incorreta) == correta: acertos += 1
else: palavras_desconhecidas += (correta not in vocabulario)
taxa_de_acerto = acertos/len(testes)
taxa_de_desconhecimento = palavras_desconhecidas/len(testes)
return (taxa_de_acerto, taxa_de_desconhecimento)
O problema é que a taxa de acerto cai para 54,84%. Não entendi por que isso ocorre, uma vez que são geradas mais combinações de palavras agora.