Семантический анализ в Python

Рассчитываем контекстную близость слов с помощью библиотеки Word2vec

Дата
7 дек. 2021
Семантический анализ в Python

В одном из недавних материалов вместе с дата-отделом «Новой газеты» мы разбирались, как разные Telegram-каналы пишут о мигрантах, то есть, какой образ мигранта они создают в своих публикациях. Для этого мы выгрузили все посты из отобранных каналов и изучили их с помощью библиотеки для Python — Word2vec. О работе с ней и пойдет речь.

Съемка и монтаж: Глеб Лиманский

Word2vec была разработана в 2013 году исследователями из Google. Она основана на методе дистрибутивной семантики, ее задача — вычислять семантическую близость между лексическими единицами (словами или словосочетаниями), чтобы помочь понять, какой образ создается у конкретного явления.

Чтобы использовать Word2vec, понадобится Python версии 3.5. Создадим виртуальное окружение, где будем использовать именно эту версию. Открываем Anaconda, заходим во вкладку «Enviroments», нажимаем на кнопку «Create». Ставим галочку у «Python», выбираем в выпадающем меню нужную версию. В поле «Name» введите имя виртуального окружения и нажмите «Create».

Anaconda → «Enviroments» → «Create»
Если версии 3.5 здесь не окажется, зайдите на официальный сайт Python и загрузите ее оттуда: https://www.python.org/downloads/

Когда окружение будет создано, заходите в Visual Studio Code. Создадим папку для нового проекта и перейдем внутрь нее.

Откроем папку и создадим в ней новый файл, в котором начнем работать. Но сперва активируем виртуальное окружение. Для этого в терминале выбираем «bash» в выпадающем меню и пишем conda activate <название виртуального окружения>.

«+» → «bash»
Активируем виртуальное окружение

Проверим, какой интерпретатор используется. Заходим в него и выбираем нашу версию Python.

Установим нужные библиотеки: Word2vec, Gensim, pymystem3 и Pandas. Команда в терминале — pip install <название библиотеки>. Далее импортируем библиотеки в проект.

Для примера возьмем посты из Telegram-канала «Караульный». Скачать уже собранные посты можно на нашей странице в GitHub. В первой колонке у нас дата поста, во второй — сам пост. Перенесем csv-файл в папку проекта.

Прочитаем файл с помощью команды pd.read_csv. Укажем точку с запятой как разделитель и удалим лишние строчки (на случай, когда в постах не было текста, а были только картинки).

Из файла мы будем доставать все посты. Создадим для очищенных новый файл (Karaulny.txt), введем команду, приводящую все слова к единому регистру. Импортируем библиотеку re, чтобы оставить в файле только слова и убирать численные значения.

Положим re.findall в переменную res, каждое найденное значение в списке запишем в файл. Каждое слово будем отделять пробелом, а каждый файл — точкой. В конце закроем файл.

Когда этот код отработает, у нас появится нужный txt-файл.

Закомментируем выполненный код с помощью """" — он нам больше не понадобится. Откроем новый файл на чтение и создаем список постов, разделяя их с помощью точки. 

Теперь нужно привести каждое слово к его начальной форме. Например, из «ходил» сделаем «ходить». Здесь пригодится библиотека pymystem3 — положим ее в переменную m, откроем на запись новый файл (Karaulny_lemma.txt) и применим метод lemmatize для каждого поста. 

Снова закомментируем предыдущую часть кода. Следующий этап — научить библиотеку отделять слова от фраз, например, чтобы она воспринимала слова «Российская Федерация» как единое словосочетание.

Для этого используем метод word2phrase, который получает на вход наш последний файл со словами в начальной форме (Karaulny_lemma.txt), а на выход отдает файл с распознанными выражениями (Karaulny_lemma.txt-phrases) — они будут написаны через нижнее подчеркивание.

После этого необходимо превратить файл в бинарный (метод word2vec), чтобы передать его библиотеке, которая с помощью нейросети рассчитает расстояние между словами и словосочетаниями.

У нас появился бинарный файл (Karaulny_lemma.txt.bin). Закомментируем предыдущий код, передадим бинарный файл нашей модели (переменная model) и, используя метод KeyedVectors, загрузим этот файл в модель.

Теперь мы можем применить метод most_similar, который будет высчитывать контекстную близость к слову «мигрант». Попросим метод найти 200 самых близких по контексту слов. Итог запишем в новый txt-файл (Karaulny_migrant.txt).

В новом файле мы увидим, какие слова чаще всего встречались в Telegram-канале «Караульный» рядом со словом «мигрант». Например, у словосочетания «массовый_драка» коэффициент близости к слову «мигрант» довольно высокий — больше 0,97. Cудя по нашим данным, канал часто пишет именно о преступлениях мигрантов.

Если у вас остались вопросы по уроку — не стесняйтесь задавать их в нашем чате.