2011-01-11 4 views
1

Как вы поживаете?lookbehind in a for loop

Мне кажется, что это не проблема, мне нужно использовать цикл for, чтобы найти слово, которое заканчивается «ing», и ему предшествует тег, который является IN, я исхожу из фона C и java и там его легко сделать, но я не могу понять, как это сделать в python!

Я искал вокруг, и вот что я думаю, что нужно сделать:

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

Сейчас конечно есть некоторые проблемы там, первое Я, мне нужно, чтобы посмотреть на предыдущий тег не слова, регулярное выражение вероятно, является неправильным и, что более важно, это просто звучит слишком сложно, я что-то пропустил здесь, есть способ просто использовать индекс слова, заканчивающийся на «ing», чтобы посмотреть на тег позади него, как я бы сделал, используя java например??

Спасибо заранее и извините, если его глупый вопрос, его, как мой второй раз пытаюсь написать питон, и я до сих пор ржавым с ним =)

EDIT: больше объяснений о том, что мне нужно do, и пример здесь - это то, что я пытаюсь решить, иногда pos_tag допускает VBG для существительного, поэтому мне нужно написать метод, который дал помеченный список (например [(«Cultivate», «NNP»), (' мир "," NN '), (' by ',' IN '), («наблюдение», «NN») («правосудие», «NN»)] исправляет эту проблему и возвращает [(«Cultivate», N'N '), (' by ',' IN '), (' наблюдение ',' VBG '), (' правосудие ',' NN ')]) обратите внимание, как o bserving изменил

EDIT2: проблема решается сейчас, здесь решение Защиту преобразования (Li): для г в xrange (Len (Li)): если Ли [я] [0] .endswith ('ing') и i> 0 и li [i-1] [1]: li [i] = (li [i], 'VBG')

спасибо вам, ребята, за вашу помощь = D оценен это

+2

Какая проблема вы * на самом деле * пытаетесь решить? –

+1

Не совсем понятно, что ваш вход/выход. Почему вы извлекаете 2 значения из своего списка? Это список кортежей? Также вы не должны использовать имя переменной 'list', поскольку оно переопределяет список встроенных функций. – Falmarri

+0

Попробуйте показать образец ввода и соответствующий вывод. –

ответ

1

Основываясь на ваш комментарий, звучит, как вы хотите:

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 

Вы также можете сделать это на месте:

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') 

Обратите внимание, что я переименовал list к li. list - это имя типа для списка Python и его переопределение - плохая идея.

+0

Как преобразование смотрит на тег предыдущего слова, если не ошибаюсь, он просто проверяет, заканчивается ли слово заканчивается ing ​​и его тег (а не тот, который был перед ним) равен ' NN ', мне нужно посмотреть предыдущий тег, а не тег слова – r3x

+0

@AnH Извините, я не видел ваш последний комментарий (который прояснил его) до сих пор. Кажется, я понял тебя на этот раз? – marcog

+0

gr8 =), если вы все еще не уверены в том, что я имел в виду, не стесняйтесь спрашивать, и я постараюсь изо всех сил объяснить это снова или дать вам еще один пример, также спасибо за хедз-апы о ли и перевыполнении списка = 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

Ваше решение несколько обусловлено наличием неизменяемых кортежей в качестве пар данных в вашем списке. Самый простой способ, то есть, чтобы создать новый список, который вы хотите в общей сложности:

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 

Несколько расточительный, если у вас есть тысячи или миллионы ...

Если это ваши данные и ваш формат, который вы контролируете, вы возможно, пожелает рассмотреть использование словаря вместо списка кортежей.После этого вы можете петля словарь через более естественно и модифицировать на месте:

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' 

В больших наборах данных, словарь подход быстрее и меньше памяти. Считают, что.

+0

спасибо человеку, но уже понял ответ, спасибо anyways =) – r3x

1

Это делает изменения в месте

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

перечисление позволяет перебирать список в Еогеасп моды, но и получить доступ к текущему индексу. Мне это очень нравится, но я иногда беспокоюсь, если я злоупотребляю им и вместо этого должен использовать что-то вроде for i in xrange(10): ....

+0

спасибо thats helpful =) – r3x