A little late, I would like to add the functionality to search for ready expressions like 'good morning'->'good Morning' differentiating 'Good trip'->'good trip', ie to go beyond word-for-word translation.
Basically we have this dictionary:
dicionario = {
'bom':'good',
'boa':'good',
'dia':'day',
'bom dia':'good morning',
'acordou':'wake up',
'viagem':'trip',
'filme':'movie',
'apertem os cintos... o piloto sumiu':'Airplane',
'assisti':'watched',
'eu':'I',
'nunca':'never',
'o':'the'
}
Notice it’s even named after a movie.
First we make a function that checks whether a sequence or word is in the dictionary:
def existe_traducao(dicionario, lista):
sequencia = ' '.join(x.lower() for x in lista)
if sequencia in dicionario:
return dicionario[sequencia]
return ''
>>> print(existe_traducao(dicionario, ['Boa']))
good
>>> print(existe_traducao(dicionario, ['boa', 'viagem']))
>>> print(existe_traducao(dicionario, ['bom', 'dia']))
good morning
Now we just need to translate the phrase by looking for expressions. For this, we go from the current word to the end, after the current word to the end -1 and so on looking for a key in the dictionary:
def traduz(dicionario, frase):
palavras = frase.split()
lista_traduzida = []
i = 0
while i < len(palavras):
for j in range(len(palavras), i, -1):
traducao = existe_traducao(dicionario, palavras[i:j])
if traducao != '': #Se achei tradução
lista_traduzida.append(traducao)
i = j
break
else:
lista_traduzida.append(palavras[i].lower())
i+=1
return ' '.join(lista_traduzida)
>>> frase = 'Bom dia AlexCiuffa' #AlexCiuffa não está no dicionário
>>> print(traduz(dicionario, frase))
good morning AlexCiuffa
>>> frase = 'Boa viagem amigo' #amigo não está no dicionário
>>> print(traduz(dicionario, frase))
good trip amigo
>>> frase = 'Eu nunca assisti o filme Apertem os cintos... O piloto sumiu'
>>> print(traduz(dicionario, frase)) #perceba que a frase possui um titulo de filme
I never watched the movie Airplane
I won’t be able to sleep, someone please help
– Amador.py