#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']
]
По сути, то, что я хочу сделать, это:
- выполните итерацию по списку списков
- найти все экземпляры
G-left
,A-left
,G-right
, иA-right
- если
G-left
отображается orA-left
, посмотрите назад на первый экземпляр списка с элементомV
add первый индекс списка, содержащегоG-left
orA-left
, до конца списка, содержащегоV
сG-left
A-left
тегом or, затем двигайтесь дальше и повторяйте - если
G-right
A-right
отображается or, ожидайте появления первого экземпляра списка с элементомV
add первый индекс списка, содержащегоG-right
orA-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
Результат должен быть тем, что вы ищете.