Найти первое совпадение в обратном порядке в списке списков

#python #regex #list #nlp

#python #регулярное выражение #Список #nlp

Вопрос:

У меня есть следующий список:

 [
['the', 'the  Det'],
['dog', 'dog  N  A-right'],
['ran', 'run  V  past'],
['at', 'at  P'], 
['me', 'I  N  G-left'],
['and', 'and  Cnj'],
['the', 'the  Det'],
['ball', 'ball  N  G-right'],
['was', 'was  C'],
['kicked', 'kick  V  past']
['by', 'by  P']
['me', 'I  N  A-left']

]
  

По сути, то, что я хочу сделать, это:

  1. выполните итерацию по списку списков
  2. найти все экземпляры G-left , A-left , G-right , и A-right
  3. если G-left отображается or A-left , посмотрите назад на первый экземпляр списка с элементом V add первый индекс списка, содержащего G-left or A-left , до конца списка, содержащего V с G-left A-left тегом or, затем двигайтесь дальше и повторяйте
  4. если G-right A-right отображается or, ожидайте появления первого экземпляра списка с элементом V add первый индекс списка, содержащего G-right or A-right , до конца списка, содержащего V с G-right A-right тегом or, затем двигайтесь дальше и повторяйте

Итак, в случае моего приведенного выше примера желаемые состояния будут:

 [
['the', 'the  Det'],
['dog', 'dog  N  A-right'],
['ran', 'run  V  past', 'dog A-right', 'me G-left'],
['at', 'at  P'], 
['me', 'I  N  G-left'],
['and', 'and  Cnj'],
['the', 'the  Det'],
['ball', 'ball  N  G-right'],
['was', 'was  C'],
['kicked', 'kick  V  past', 'ball G-right', 'me A-left']
['by', 'by  P']
['me', 'I  N  A-left']
]
  

Я думаю, что правильный способ подойти к этому с re помощью, так:

 gleft = re.compile(r"G-left")
gright = re.compile(r"G-right")
aleft = re.compile(r"A-left")
aright = re.compile(r"A-right")
  

затем что-то вроде

 for item in list:
    if aleft.match(item[1]):
        somehow work backwards to find the  V tag
            whatever.insert(-1, item[0]) #can you concatenate a string here to add  A-left

    if aright.match(item[1]):
        somehow work forwards to find the  V tag
            whatever.insert(-1, item[0]) #can you concatenate a string here to add  A-right

  

И то же самое, но с G-тегами.

Надеюсь, кто-нибудь может помочь мне указать правильное направление. Я считаю, что я правильно разбил шаги, я просто недостаточно знаком с Python, чтобы еще не знать синтаксис для этого с головы.

Комментарии:

1. Я думаю, что у меня действительно кружится голова от всех этих символов. Разве не было бы легко, если бы вы могли просто объяснить на более легком примере?

2. find all instances of регулярными выражениями являются : <@GR , <@AR , @GR> , и @AR> , но поскольку все они являются постоянными литералами, вам не нужны регулярные выражения, используйте substr или тому подобное.

3. @Austin, я считаю, что я сделал это существенно проще. По сути, я хочу взять субъект и объект глагола и поместить их в анализ глагола. Для языков, над которыми я работаю, нет пакетов, поэтому я не могу использовать готовые банки деревьев.

Ответ №1:

Вероятно, это можно несколько упростить, используя вспомогательную функцию, но помимо этого, попробуйте это, которое не требует регулярных выражений:

 wls = [your list of lists, above, fixed (some commas are missing)]
for wl in wls:
    for w in wl:
        if '-right' in w:                        
            targ = wls.index(wl)            
            counter = 0
            for wt in (wls[targ 1:]):                               
                for t in wt:
                    if ' V' in t:
                        if counter<1:                            
                            wt.insert(len(wt),wl[0] w.split(' ')[-1])
                        counter =1

        if '-left' in w:            
            targ = wls.index(wl)            
            counter = 0
            revd = [item for item in reversed(wls[:targ])]
            for wt in revd:           
                for t in wt:
                    if ' V' in t:
                        if counter<1:
                            wt.insert(len(wt),wl[0] w.split(' ')[-1])
                        counter =1
           
wls
  

Результат должен быть тем, что вы ищете.