Отфильтровать существительные из текста при помощи mystem2

Я обрабатываю текст, мне нужно оставить в нем только существительные в нейтральной форме. В pymystem3 существует функция грамматического разбора, вызываемая командой analyze:

mystem.analyze("однажды в студеную зимнюю пору я из лесу вышел, был сильный мороз")

Выдает:

[{'analysis': [{'lex': 'однажды', 'wt': 1, 'gr': 'ADV='}], 'text': 'однажды'},
 {'text': ' '},
 {'analysis': [{'lex': 'в', 'wt': 0.9999917878, 'gr': 'PR='}], 'text': 'в'},
 {'text': ' '},
 {'analysis': [{'lex': 'студеный', 'wt': 1, 'gr': 'A=вин,ед,полн,жен'}],
  'text': 'студеную'},
 {'text': ' '},
 {'analysis': [{'lex': 'зимний', 'wt': 1, 'gr': 'A=вин,ед,полн,жен'}],
  'text': 'зимнюю'},
 {'text': ' '},
 {'analysis': [{'lex': 'пора', 'wt': 1, 'gr': 'S,жен,неод=вин,ед'}],
  'text': 'пору'},
 {'text': ' '},
 {'analysis': [{'lex': 'я', 'wt': 0.9999716281, 'gr': 'SPRO,ед,1-л=им'}],
  'text': 'я'},
 {'text': ' '},
 {'analysis': [{'lex': 'из', 'wt': 0.9999999775, 'gr': 'PR='}], 'text': 'из'},
 {'text': ' '},
 {'analysis': [{'lex': 'лес',
    'wt': 0.995766539,
    'gr': 'S,муж,неод=(дат,ед|парт,ед|местн,ед)'}],
  'text': 'лесу'},
 {'text': ' '},
 {'analysis': [{'lex': 'выходить',
    'wt': 0.9509142232,
    'gr': 'V,нп=прош,ед,изъяв,муж,сов'}],
  'text': 'вышел'},
 {'text': ', '},
 {'analysis': [{'lex': 'быть', 'wt': 1, 'gr': 'V,нп=прош,ед,изъяв,муж,несов'}],
  'text': 'был'},
 {'text': ' '},
 {'analysis': [{'lex': 'сильный',
    'wt': 1,
    'gr': 'A=(вин,ед,полн,муж,неод|им,ед,полн,муж)'}],
  'text': 'сильный'},
 {'text': ' '},
 {'analysis': [{'lex': 'мороз',
    'wt': 0.9922846271,
    'gr': 'S,муж,неод=(вин,ед|им,ед)'}],
  'text': 'мороз'},
 {'text': '\n'}]

Мне нужно отфильтровать этот результат, чтобы программа выдавала только текст значения "lex", если "gr" начинается с "S", то есть если слово является существительным.


Ответы (1 шт):

Автор решения: Владислав

Отфильтровать значения проще всего генератором. Должна сработать вот такая конструкция:

just_nouns = [x['text'] for x in analyse if 'analysis' in x and x['analysis'][0]['gr'].startswith('S')]
print (just_nouns)

Где analyse это ваша структура. Но не исключено, что если покопаться в документации библиотеки, то там найдутся готовые функции для подобных задач.

→ Ссылка