spell-checker : code de Peter Norvig [résolu]

spell-checker : code de Peter Norvig [résolu] - Python - Programmation

Marsh Posté le 08-08-2011 à 20:09:43    

Je suis tombé par hasard sur un très beau morceau de code écrit par Peter Norvig, Director of Research chez Google. Le code fonctionne avec Python 2x et est incompatible avec les versions 3.x
 
source : http://norvig.com/spell-correct.html

Code :
  1. import re, collections
  2. def words(text): return re.findall('[a-z]+', text.lower())
  3. def train(features):
  4.     model = collections.defaultdict(lambda: 1)
  5.     for f in features:
  6.         model[f] += 1
  7.     return model
  8. NWORDS = train(words(file('big.txt').read()))
  9. alphabet = 'abcdefghijklmnopqrstuvwxyz'
  10. def edits1(word):
  11.    splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]
  12.    deletes    = [a + b[1:] for a, b in splits if b]
  13.    transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]
  14.    replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]
  15.    inserts    = [a + c + b     for a, b in splits for c in alphabet]
  16.    return set(deletes + transposes + replaces + inserts)
  17. def known_edits2(word):
  18.     return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
  19. def known(words): return set(w for w in words if w in NWORDS)
  20. def correct(word):
  21.     candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
  22.     return max(candidates, key=NWORDS.get)


 
J'ai du mal à comprendre comment fonctionne la ligne suivante :

Code :
  1. return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)


 
Où placer les parenthèses pour hiérarchiser le code ?
 
Merci d'avance !


Message édité par suizokukan le 08-08-2011 à 20:30:26

---------------
rule #1 : trust the python
Reply

Marsh Posté le 08-08-2011 à 20:09:43   

Reply

Marsh Posté le 08-08-2011 à 20:30:08    

Bon, je me réponds moi-même sans ajouter de parenthèses :
 

Code :
  1. return set(e2 for e1 in edits1(word)
  2.                  for e2 in edits1(e1)
  3.            if e2 in NWORDS)


---------------
rule #1 : trust the python
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed