2010-03-01 9 views
1

Je vais vous expliquer en détails ce que je veux réaliser.
J'ai 2 programmes sur les dictionnaires.
Le code pour le programme 1 est ici:Problèmes avec les boucles imbriquées ...

import re 
words = {'i':'jeg','am':'er','happy':'glad'} 

text = "I am happy.".split() 
translation = [] 

for word in text: 
    word_mod = re.sub('[^a-z0-9]', '', word.lower()) 
    punctuation = word[-1] if word[-1].lower() != word_mod[-1] else '' 
    if word_mod in words: 
     translation.append(words[word_mod] + punctuation) 
    else: 
     translation.append(word) 
translation = ' '.join(translation).split('. ') 
print('. '.join(s.capitalize() for s in translation)) 

Ce programme présente des avantages suivants: « »

  • Vous pouvez écrire plus d'une phrase
  • Vous obtenez la première lettre en majuscule après
  • Le programme "ajoute" le mot non traduit à la sortie ("translation = []")

Voici le code de programme 2:

words = {('i',): 'jeg', ('read',): 'leste', ('the', 'book'): 'boka'} 
max_group = len(max(words)) 

text = "I read the book".lower().split() 
translation = [] 

position = 0 
while text: 
    for m in range(max_group - 1, -1, -1): 
     word_mod = tuple(text[:position + m]) 
     if word_mod in words: 
      translation.append(words[word_mod]) 
      text = text[position + m:] 
    position += 1 

translation = ' '.join(translation).split('. ') 
print('. '.join(s.capitalize() for s in translation)) 

Avec ce code, vous pouvez traduire des expressions idiomatiques ou
« le livre » à « Boka ».
Voici comment le programme exécute les codes.
C'est la sortie:

 
1 
('i',) 
['jeg'] 
['read', 'the', 'book'] 
0 
() 
1 
('read', 'the') 
0 
('read',) 
['jeg', 'leste'] 
['the', 'book'] 
1 
('the', 'book') 
['jeg', 'leste', 'boka'] 
[] 
0 
() 
Jeg leste boka 

Ce que je veux est de mettre en œuvre certains des codes du programme 1 dans le programme 2.
J'ai essayé plusieurs fois sans succès ...
Voici mon rêve ...:
Si je change le texte qui suit ...:

text = "I read the book. I read the book! I read the book? I read the book.".lower().split() 

Je veux que la sortie soit:

Jeg leste boka. Jeg leste boka! Jeg leste boka? Jeg leste boka. 

Alors s'il vous plaît, peaufinez votre cerveau et aidez-moi avec une solution ...
J'apprécie toute réponse beaucoup!
Merci beaucoup d'avance!

Répondre

0

Mon flux de solution serait quelque chose comme ceci:

dict = ... 
max_group = len(max(dict)) 
input = ... 
textWPunc = input.lower().split() 
textOnly = [re.sub('[^a-z0-9]', '', x) for x in input.lower().split()] 
translation = [] 

while textOnly: 
    for m in [max_group..0]: 
     if textOnly[:m] in words: 
      check for punctuation here using textWPunc[:m] 
      if punctuation present in textOnly[:m]: 
       Append translated words + punctuation 
      else: 
       Append only translated words 
      textOnly = textOnly[m:] 
      textWPunc = textWPunc[m:] 

join translation to finish 

La partie clé étant de conserver deux lignes parallèles de texte, qui vous détectez les mots à traduire et l'autre vous vérifiez la ponctuation si votre traduction la recherche arrive avec un coup. Pour vérifier la ponctuation, j'ai alimenté le groupe de mots que j'examinais en re() comme ça: re.sub('[a-z0-9]', '', wordGroup) qui va supprimer tous les caractères mais pas de ponctuation.

Dernière chose était que votre indexation me semble un peu bizarre avec cette position variable. Puisque vous tronquez la chaîne source au fur et à mesure, je ne suis pas sûr que ce soit vraiment nécessaire. Vérifiez simplement les mots x les plus à gauche au lieu d'utiliser cette variable de position.

Questions connexes