Семантический анализ в Python
Рассчитываем контекстную близость слов с помощью библиотеки Word2vec
![Семантический анализ в Python](https://storage.googleapis.com/static.istories.media/uploaded/images/3dc6777a234d40eb97dc7697bfc4f177-1920x960px_1x.png)
В одном из недавних материалов вместе с дата-отделом «Новой газеты» мы разбирались, как разные Telegram-каналы пишут о мигрантах, то есть, какой образ мигранта они создают в своих публикациях. Для этого мы выгрузили все посты из отобранных каналов и изучили их с помощью библиотеки для Python — Word2vec. О работе с ней и пойдет речь.
Word2vec была разработана в 2013 году исследователями из Google. Она основана на методе дистрибутивной семантики, ее задача — вычислять семантическую близость между лексическими единицами (словами или словосочетаниями), чтобы помочь понять, какой образ создается у конкретного явления.
Чтобы использовать Word2vec, понадобится Python версии 3.5. Создадим виртуальное окружение, где будем использовать именно эту версию. Открываем Anaconda, заходим во вкладку «Enviroments», нажимаем на кнопку «Create». Ставим галочку у «Python», выбираем в выпадающем меню нужную версию. В поле «Name» введите имя виртуального окружения и нажмите «Create».
![](https://storage.googleapis.com/static.istories.media/uploaded/images/f5d217a155e2470cada01ae1cb3bb01d-1200xautopx_1x.png)
![](https://storage.googleapis.com/static.istories.media/uploaded/images/4215ec98f7364b0bb6ee048a97fba141-1200xautopx_1x.png)
Когда окружение будет создано, заходите в Visual Studio Code. Создадим папку для нового проекта и перейдем внутрь нее.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/e1cb021e74f144e68cb95c3fd61c187f-1200xautopx_1x.png)
Откроем папку и создадим в ней новый файл, в котором начнем работать. Но сперва активируем виртуальное окружение. Для этого в терминале выбираем «bash» в выпадающем меню и пишем conda activate <название виртуального окружения>.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/b8897e3c438b42dda47d2c22ea926d6b-1200xautopx_1x.png)
![](https://storage.googleapis.com/static.istories.media/uploaded/images/1b79f7cea8774b319fe9a2c4013f7105-1200xautopx_1x.png)
Проверим, какой интерпретатор используется. Заходим в него и выбираем нашу версию Python.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/91a03cb3b92b438795a16a3c7596be2d-1200xautopx_1x.png)
Установим нужные библиотеки: Word2vec, Gensim, pymystem3 и Pandas. Команда в терминале — pip install <название библиотеки>. Далее импортируем библиотеки в проект.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/9ebd96615dd740a780f5cf4519776e12-1200xautopx_1x.png)
Для примера возьмем посты из Telegram-канала «Караульный». Скачать уже собранные посты можно на нашей странице в GitHub. В первой колонке у нас дата поста, во второй — сам пост. Перенесем csv-файл в папку проекта.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/9643a9fe6cfe48238a4cf548188d0f21-1200xautopx_1x.png)
Прочитаем файл с помощью команды pd.read_csv. Укажем точку с запятой как разделитель и удалим лишние строчки (на случай, когда в постах не было текста, а были только картинки).
![](https://storage.googleapis.com/static.istories.media/uploaded/images/d1c6c395a2384505a3245468d1eeebb2-1200xautopx_1x.png)
Из файла мы будем доставать все посты. Создадим для очищенных новый файл (Karaulny.txt), введем команду, приводящую все слова к единому регистру. Импортируем библиотеку re, чтобы оставить в файле только слова и убирать численные значения.
Положим re.findall в переменную res, каждое найденное значение в списке запишем в файл. Каждое слово будем отделять пробелом, а каждый файл — точкой. В конце закроем файл.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/1101d22cb5494897b9b8a0febc3f56bc-1200xautopx_1x.png)
Когда этот код отработает, у нас появится нужный txt-файл.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/ce8971ca0a4749f98ef3501ca72b6848-1200xautopx_1x.png)
Закомментируем выполненный код с помощью """" — он нам больше не понадобится. Откроем новый файл на чтение и создаем список постов, разделяя их с помощью точки.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/bc7026c939454f06a99bd3b80e6e20c5-1200xautopx_1x.png)
Теперь нужно привести каждое слово к его начальной форме. Например, из «ходил» сделаем «ходить». Здесь пригодится библиотека pymystem3 — положим ее в переменную m, откроем на запись новый файл (Karaulny_lemma.txt) и применим метод lemmatize для каждого поста.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/c41da6499adf4db5be48bfd4034ea3c5-1200xautopx_1x.png)
Снова закомментируем предыдущую часть кода. Следующий этап — научить библиотеку отделять слова от фраз, например, чтобы она воспринимала слова «Российская Федерация» как единое словосочетание.
Для этого используем метод word2phrase, который получает на вход наш последний файл со словами в начальной форме (Karaulny_lemma.txt), а на выход отдает файл с распознанными выражениями (Karaulny_lemma.txt-phrases) — они будут написаны через нижнее подчеркивание.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/635caed9282d46698d36be0d32fe0188-1200xautopx_1x.png)
После этого необходимо превратить файл в бинарный (метод word2vec), чтобы передать его библиотеке, которая с помощью нейросети рассчитает расстояние между словами и словосочетаниями.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/b400850b5ec240f78676924ea0813eee-1200xautopx_1x.png)
У нас появился бинарный файл (Karaulny_lemma.txt.bin). Закомментируем предыдущий код, передадим бинарный файл нашей модели (переменная model) и, используя метод KeyedVectors, загрузим этот файл в модель.
Теперь мы можем применить метод most_similar, который будет высчитывать контекстную близость к слову «мигрант». Попросим метод найти 200 самых близких по контексту слов. Итог запишем в новый txt-файл (Karaulny_migrant.txt).
![](https://storage.googleapis.com/static.istories.media/uploaded/images/031509d512eb4c4ca1a702d379af8fce-1200xautopx_1x.png)
В новом файле мы увидим, какие слова чаще всего встречались в Telegram-канале «Караульный» рядом со словом «мигрант». Например, у словосочетания «массовый_драка» коэффициент близости к слову «мигрант» довольно высокий — больше 0,97. Cудя по нашим данным, канал часто пишет именно о преступлениях мигрантов.
![](https://storage.googleapis.com/static.istories.media/uploaded/images/2b235e864d8b447a9ac4743a8477751b-1200xautopx_1x.png)
Если у вас остались вопросы по уроку — не стесняйтесь задавать их в нашем чате.