Как поместить все слова и фразы в списке в поисковое выражение (Python) - PullRequest
1 голос
/ 30 апреля 2020

У меня есть этот список списков:

groups = [['|FOOD|','shrimps','chicken wok','bowl of rice'],['|DRINK|','water','cranberry juice','tea']]

Я пытаюсь получить вывод:

[['|FOOD|',
  '[lemma="shrimps"]',
  '[lemma="chicken"][lemma="wok"]',
  '[lemma="bowl"][lemma="of"][lemma="rice"]'],
 ['|DRINK|',
  '[lemma="water"]',
  '[lemma="cranberry"][lemma="juice"]',
  '[lemma="tea"]']]

Так что, в принципе, мне нужно каждое слово, лемматизированное для корпуса поиск. Однако некоторые слова - это не слова, а фразы . Я только что выяснил код для отдельных слов , вот он:

import re
groups = [[f'[lemma="{word}"]' if not ' ' in word and not re.search(r'\|.*\|', word) else word for word in group] for group in groups]

Это возвращает группы как:

[['|FOOD|', 
  '[lemma="shrimps"]', 
  'chicken wok', 
  'bowl of rice'],
 ['|DRINK|', 
  '[lemma="water"]', 
  'cranberry juice', 
  '[lemma="tea"]']]

Так что я сделал так, чтобы в него не входили слова, содержащие пробел ( фразы ), а также слова topi c. Каков тогда код для работы с этими фразами и чтобы они выглядели так, как я напечатал выше?

Я новичок, поэтому, если вы знаете лучший способ упорядочить все эти данные, дайте мне знать.

1 Ответ

1 голос
/ 30 апреля 2020

Здесь вам на самом деле не нужно регулярное выражение, вы можете использовать if not word.startswith("|") and not word.endswith("|"), чтобы проверить, нет ли записи на обоих концах:

groups = [[''.join([r"""[lemma="{}"]""".format(w) for w in word.split()]) if not word.startswith("|") and not word.endswith("|") else word for word in group] for group in groups]

См. Python демонстрацию онлайн . Выход:

[['|FOOD|', 
 '[lemma="shrimps"]', 
 '[lemma="chicken"][lemma="wok"]', 
 '[lemma="bowl"][lemma="of"][lemma="rice"]'], 
['|DRINK|', 
 '[lemma="water"]', 
 '[lemma="cranberry"][lemma="juice"]', 
 '[lemma="tea"]']
 ]
...