2011-01-11 5 views
1

Comment ça va?lookbehind dans une boucle for

Je suis un peu coincé avec ce problème, j'ai besoin d'utiliser une boucle for pour trouver un mot qui se termine par 'ing' et est précédé d'un tag IN, je viens d'un fond de C et java et là facile à faire, mais je ne sais pas encore comment le faire en python !!

Je cherchai autour et voici ce que je pense que je dois faire:

for word, tag in list: 
    if word.endswith('ing'): 
     //use regular expression here which should look like this '(?<=\bIN\b)ing' 

maintenant ofcourse il y a des problèmes là-bas, d'abord je le je besoin de regarder l'étiquette précédente pas de mot, l'expression régulière est probablement faux et plus important encore cela semble trop compliqué, est-ce que je manque quelque chose ici, est-il un moyen d'utiliser simplement l'index du mot se terminant par 'ing' pour regarder l'étiquette derrière moi comme je l'aurais fait en utilisant java par exemple??

Merci à l'avance et désolé si sa question stupide, son comme ma deuxième fois en essayant d'écrire python et je suis encore rouillé avec elle =)

EDIT: plus d'explications sur ce que je dois fais, et un exemple ici est ce que j'essaie de résoudre, parfois pos_tag bloque un VBG pour un nom, donc j'ai besoin d'écrire une méthode qui donne une liste balisée (par exemple [('Cultiver', 'NNP'), ' peace ',' NN '), (' par ',' IN '), (' observant ',' NN '), (' justice ',' NN ')] corrige ce problème et renvoie [(' Cultiver ',' NNP '), (' peace ',' NN '), (' par ',' IN '), (' observant ',' VBG '), (' justice ',' NN ')]) remarquez comment o bserving a changé

EDIT2: problème résolu maintenant, voici la solution de transformation def (li): pour i dans xrange (len (li)): si li [i] [0] .endswith ('ing') et i> 0 et li [i-1] [1]: li [i] = (li [i], 'VBG')

merci à vous tous pour votre aide = D apprécié il

+2

Quel problème tentez-vous réellement de résoudre? –

+1

Ce n'est pas très clair ce que sont vos entrées/sorties. Pourquoi extrayez-vous 2 valeurs de votre liste? Est-ce une liste de tuples? De même, vous ne devez pas utiliser le nom de variable 'list' car il remplace la liste des fonctions intégrées – Falmarri

+0

Essayez d'afficher un exemple de l'entrée et de la sortie correspondante. –

Répondre

1

sur la base de votre commentaire, sonne comme vous voulez ceci:

def transform(li): 
    new_li = [] 
    prev_tag = None 
    for word, tag in li: 
     if word.endswith('ing') and prev_tag == 'NN': 
      tag = 'VBG' 
     new_li += [(word, tag)] 
     prev_tag = tag 
    return new_li 

Vous pouvez aussi le faire en place:

def transform(li): 
    for i in xrange(len(li)): 
     if li[i][0].endswith('ing') and i > 0 and li[i-1][1]: 
      li[i] = (li[i], 'VBG') 

Notez que je renomme list-li. list est le nom de type pour une liste Python et l'ignorer est une mauvaise idée.

+0

Comment transforme-t-il l'étiquette du mot précédent, si je ne me trompe pas, il vérifie juste si le mot se termine par ing et que son tag (pas celui qui le précède) est ' NN ', je dois regarder l'étiquette précédente pas l'étiquette du mot – r3x

+0

@AnH Désolé, je n'ai pas vu votre tout dernier commentaire (qui l'a éclairci) jusqu'à maintenant. Je pense que je vous ai compris cette fois? – marcog

+0

gr8 =), si vous n'êtes toujours pas sûr de ce que je voulais dire, n'hésitez pas à demander et je ferai de mon mieux pour l'expliquer à nouveau ou donner un autre exemple, merci aussi pour la liste des priorités et de la liste prioritaire = D – r3x

0
previousWord = "" 
previousTag = "" 

for word, tag in list: 
    if word.endswith('ing'): 
     //use regular expression here which should look like this '(?<=\bIN\b)ing' 
     //use previousWord and previousTag here 
    previousWord = word 
    previousTag = tag 
0

Votre solution est quelque peu motivée par la présence de tuples non modifiables en tant que paires de données dans votre liste. Le plus simple est alors de créer la nouvelle liste que vous voulez au total:

li=[('Cultivate', 'NNP'), 
    ('peace', 'NN'), 
    ('by', 'IN'), 
    ('observing', 'NN'), 
    ('justice', 'NN')] 

lnew=[]  

for word, tag in li: 
    if word.endswith('ing') and tag == 'NN': 
     tag='VBG' 
    lnew.append((word,tag)) 

for word, tag in lnew: 
    print word, tag 

Un peu de gaspillage si vous avez des milliers ou des millions ...

Si ce sont vos données et votre format que vous contrôlez, vous souhaitera peut-être envisager d'utiliser un dictionnaire au lieu d'une liste de tuples.Ensuite, vous pouvez boucle le dictionnaire à travers plus naturellement et modifier en place:

ld={'justice': 'NN', 'Cultivate': 'NNP', 'peace': 'NN', 
    'observing': 'NN', 'by': 'IN'} 

for word, tag in ld.items(): 
    if word.endswith('ing') and tag == 'NN': 
     ld[word]='VBG' 

Dans les grands ensembles de données, l'approche du dictionnaire est plus rapide et plus efficace mémoire. Considérez cela.

+0

merci l'homme, mais déjà compris la réponse, merci quand même =) – r3x

1

Cela ne le changement en place

for index,(word, _tag) in enumerate(li): 
    if word.endswith('ing') and i > 0 and li[index-1][1] == 'IN': 
     li[index] = word, 'VBG' 

vous Énumérer vous permet de parcourir une liste d'une manière foreach, mais aussi accès à l'indice actuel. Je l'aime bien, mais je m'inquiète parfois si je l'utilise de manière excessive et que je devrais utiliser quelque chose comme for i in xrange(10): ... à la place.

+0

merci c'est utile =) – r3x