Упражнение (без проверки)




Работа с естественным текстом

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

В этом модуле мы научимся:

  1. Получать основу и словарную форму слова (процедура стемминга и лемматизации). Это позволит принципиально улучшить любые сравнения и вычисления, связанные с анализом текстов. Например, поиск дубликатов описаний товаров.
  2. Строить статистику уникальных слов в наборе поисковых запросов с учетом падежей и склонений. При этом мы будем исключать из результатов так называемые стоп слова (союзы, предлоги и другие лишние слова).

Основные библиотеки

В этом блоке мы рассмотрим примеры работы трех библиотек для решения так называемых задач обработки естественного языка. А также решим задачу подсчета слов в наборе поисковых запросов с учетов падежей и склонений.

Библиотека Pymystem (https://pypi.python.org/pypi/pymystem3) считается одной из лучших для преобразования слов в словарную форму. Разработана в Яндексе, умеет работать с несуществующими словами. Недостаток - самая медленная из рассматриваемых.

Установка

Библиотека Pymystem по умолчанию не установлена в Anaconda. Для установки воспользуемся следующей командой:

! pip install pymystem3

Восклицательный знак означает, что команда выполняется в командной строке. pip - стандартный установщик пакетов в Python. Также для установки можно использовать Anaconda prompt (вариант командной строки, в которой выставлены необходимые переменные окружения для установки библиотек) или просто командную строку.

Результатом работы команды должна быть установка библиотеки:

После установки импортируем библиотеку в наш код:

from pymystem3 import Mystem

m = Mystem()

Файл keywords.txt

Мы будем работать со статистикой 100 тысяч поисковых запросов, состоящих из двух столбцов: самого поискового запроса и количество его появлений:

вк 1

одноклассники 1

порно 1

ютуб 1

вконтакте 1

одноклассники моя страница 3

Файл взят с сайта https://www.bukvarix.com/top-popular-keywords.html

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

i = 0

with open('keywords.txt', 'r', encoding = 'utf-8') as f:

for line in f:

line = line.strip().split('\t')

print(line)

if i > 10:

break

i += 1

['вк', '1']

['одноклассники', '1']

['порно', '1']

['ютуб', '1']

['вконтакте', '1']

['одноклассники моя страница', '3']

['майл', '1']

['авито', '1']

['переводчик', '1']

['яндекс', '1']

['сбербанк онлайн', '2']

['mail', '1']

Запишем значения из первого столбца в переменную word, второго - в wordCount:

i = 0

with open('keywords.txt', 'r', encoding = 'utf-8') as f:

for line in f:

line = line.strip().split('\t')

word = line[0]

wordCount = line[1]

print(word, wordCount)

if i > 10:

break

i += 1

вк 1

одноклассники 1

порно 1

ютуб 1

вконтакте 1

одноклассники моя страница 3

майл 1

авито 1

переводчик 1

яндекс 1

сбербанк онлайн 2

mail 1

Теперь для каждого слова word мы можем получить его словарную форму (т. е. лемму). Выведем слово и его словарную форму на экран. Это займет некоторое время, т. к. Pymystem работает не очень быстро:

i = 0

with open('keywords.txt', 'r', encoding = 'utf-8') as f:

for line in f:

line = line.strip().split('\t')

word = line[0]

wordCount = line[1]

lemmas = m.lemmatize(word)

print(word, ''.join(lemmas))

if i > 10:

break

i += 1

вк вк

одноклассники одноклассник

порно порно

ютуб ютуб

вконтакте вконтакте

одноклассники моя страница одноклассник мой страница

майл майл

авито авито

переводчик переводчик

яндекс яндекс

сбербанк онлайн сбербанк онлайн

mail mail

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

Упражнение

Часто вам будут попадаться слова, которые не входят в список словарных. Например, жаргонные или принятые в отрасли слова. Для приведения этих слов к единому виду можно использовать библиотеку Pymystem. У Льюиса Кэррола есть стихотворение "Бармаглот", в котором много несуществующих слов. Проверьте справится ли с лемматизацией строчки из этого стихотворения библиотека Pymystem?

Получите лемму строчки 'и хрюкотали зелюки как мюмзики в мове'. При выводе результата используйте конструкцию print(''.join(...))

Получите лемму строчки 'и хрюкотали зелюки как мюмзики в мове' - нет ответа

Библиотека NLTK

Для более быстрой обработки текста рассмотрим библиотеку NLTK (Natural Language Toolkit), которая по умолчанию уже установлена в Anaconda. Библиотека умеет работать со многими языками, а также имеет встроенный список стоп слов, который мы используем в ближайшей задаче. Работает быстрее Pymystem и проводит процедуру стемминга, т. е. процесс нахождения основы слова.

Давайте выведем на экран аналогичные пары слов из нашего файла, но с использованием NLTK:

from nltk.stem import SnowballStemmer

snowball_stemmer = SnowballStemmer("russian")

i = 0

with open('keywords.txt', 'r', encoding = 'utf-8') as f:

for line in f:

line = line.strip().split('\t')

 

word = line[0]

wordCount = line[1]

 

stem = snowball_stemmer.stem(word)

print(word, ''.join(stem))

 

if i > 10:

break

 

i += 1

вк вк

одноклассники одноклассник

порно порн

ютуб ютуб

вконтакте вконтакт

одноклассники моя страница одноклассники моя страниц

майл майл

авито авит

переводчик переводчик

яндекс яндекс

сбербанк онлайн сбербанк онлайн

mail ma

Процесс происходит гораздо быстрее, т. к. стемминг проще лемматизации. Разница между этими методами не всегда очевидна, поэтому часто результаты оказываются одинаковыми.

Мы используем библиотеку NLTK в обработке всего файла в этом блоке.

Библиотека Pymorphy

Наконец, рассмотрим самый "продвинутый" вариант разбора слов - морфологический анализатор pymorphy. Процесс установки аналогичен:

!pip install pymorphy2

Ссылка на официальную документацию

Импортируем библиотеку в наш код:

import pymorphy2

morph = pymorphy2.MorphAnalyzer()

Рассмотрим принцип ее работы на примере морфологического анализа слова 'стали':

morph.parse('стали')

[Parse(word='стали', tag=OpencorporaTag('VERB,perf,intr plur,past,indc'), normal_form='стать', score=0.984662, methods_stack=((<DictionaryAnalyzer>, 'стали', 904, 4),)),

Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn sing,gent'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 1),)),

Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn sing,datv'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 2),)),

Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn sing,loct'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 5),)),

Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn plur,nomn'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 6),)),

Parse(word='стали', tag=OpencorporaTag('NOUN,inan,femn plur,accs'), normal_form='сталь', score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 9),))]

Библиотека производит анализ слова и выдает его возможные атрибуты (обратите внимание, что на выходе получился лист из нескольких элементов Parse). Например, первый элемент с параметром score=0.984662 указывается на то, что слово 'стали' скорее всего является глаголом (от слова 'стать'). Тэги в элементе tag указывают на так называемые граммемы, характеризующие данное слово - множественное или единственное число, настоящее или прошедшее время итд. Остальные элементы результата указывают, что слово 'стали' может быть существительным (от слова 'сталь').

Применим аналогичный разбор к первым 5 словам нашего файла:

i = 0

with open('keywords.txt', 'r', encoding = 'utf-8') as f:

for line in f:

line = line.strip().split('\t')

 

word = line[0]

wordCount = line[1]

 

morph_analyze = morph.parse(word)

print(morph_analyze)

 

if i > 5:

break

 

i += 1

[Parse(word='вк', tag=OpencorporaTag('UNKN'), normal_form='вк', score=1.0, methods_stack=((<UnknAnalyzer>, 'вк'),))]

[Parse(word='одноклассники', tag=OpencorporaTag('NOUN,anim,masc plur,nomn'), normal_form='одноклассник', score=1.0, methods_stack=((<DictionaryAnalyzer>, 'одноклассники', 2, 6),))]

...

Давайте возьмем из всего анализа нормальную форму слова:

i = 0

with open('keywords.txt', 'r', encoding = 'utf-8') as f:

for line in f:

line = line.strip().split('\t')

 

word = line[0]

wordCount = line[1]

 

morph_analyze = morph.parse(word)

print(word, morph_analyze[0].normal_form)

 

if i > 5:

break

 

i += 1

вк вк

одноклассники одноклассник

порно порно

ютуб ютуба

вконтакте вконтакте

одноклассники моя страница одноклассники моя страница

майл майла

Итак, мы изучили еще один способ приведения слов к единой форме.

Упражнение (без проверки)

Дан текст:

words = 'Крымский отель Mriya Resort & Spa признали лучшим в мире курортным комплексом для отдыха по версии престижной международной премии World Travel Awards'

Необходимо вывести на экран существительные в этом тексте.

Подсказка. После получения разбора слова (можно сделать по аналогии с кодом в занятии в переменной morph_analyze) проверить результат на "признак" существительного можно с помощью кода:

if 'NOUN' in morph_analyze[0].tag:



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-01-14 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: