- PVSM.RU - https://www.pvsm.ru -

Совершеннолетняя журналистика: от России до Кремля

Анализ публикаций Lenta.ru за 18 лет (с сентября 1999 по декабрь 2017 гг.) средствами python, sklearn, scipy, XGBoost, pymorphy2, nltk, gensim, MongoDB, Keras и TensorFlow.

Совершеннолетняя журналистика: от России до Кремля - 1

В исследовании использованы данные из поста «Анализируй это — Lenta.ru [1]» пользователя ildarchegg [2]. Автор любезно предоставил 3 гигабайта статей в удобном формате, и я решил, что это прекрасная возможность протестировать некоторые методы текстовой обработки. Заодно, если повезёт, узнать что-то новое о российской журналистике, обществе и вообще.

Содержание:

MongoDB для импорта json в python

К сожалению, json с текстами оказался немного битый, для меня некритично, но python отказался работать с файлом. Поэтому сначала импортнул в MongoDB, а уж потом через MongoClient из библиотеки pymongo загрузил массив и пересохранил в csv по кускам.

Из замечаний: 1. запускать базу пришлось командой sudo service mongod start – есть и другие варианты, но они не сработали; 2. mongoimport – отдельное приложение, из монго-консоли не запускается, только из терминала.

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

Совершеннолетняя журналистика: от России до Кремля - 2

Очистка и нормализация текста

Перед непосредственным анализом массив нужно привести к стандартному виду: удалить специальные символы, перевести текст в нижний регистр (строковые методы pandas прекрасно справились), удалить стоп-слова (stopwords.words('russian') из nltk.corpus), вернуть словам нормальную форму с помощью лемматизации (pymorphy2.MorphAnalyzer).

Без огрехов не обошлось, например Дмитрий Песков превратился в «дмитрий» и «песок», но в целом результатом я остался доволен.

Облако тегов

В качестве затравки посмотрим, что из себя представляют публикации в самом общем виде. Выведем 50 наиболее частотных слов, которые употребляли журналисты Ленты с 1999 по 2017 год, в виде облака тегов.

Совершеннолетняя журналистика: от России до Кремля - 3

«Риа новость» (самый популярный источник), «миллиард доллар» и «миллион доллар» (финансовая тематика), «настоящее время» (речевой оборот, свойственный всем новостным сайтам), «правоохранительный орган» и «уголовный дело» (криминальные новости), «премьер министр» и «владимир путин» (политика) – вполне ожидаемая стилистика и тематика для новостного портала.

Тематическое моделирование на основе LDA

Вычислим самые популярные темы для каждого года с помощью LDA из gensim. LDA (тематическое моделирование методом латентного размещения Дирихле) автоматически выявляет скрытые темы (набор слов, которые встречаются совместно и наиболее часто) по наблюдаемым частотам слов в статьях.

Краеугольным камнем отечественной журналистики оказались Россия, Путин, США.

В отдельные годы эта тематика разбавлялась Чеченской войной (с 1999 по 2000 гг.), 11-м сентября – в 2001 г., Ираком (с 2002 по 2004 гг.). С 2008 по 2009 года на первое место вышла экономика: процент, компания, доллар, рубль, миллиард, миллион. В 2011 г. часто писали о Каддафи.

С 2014 по 2017 гг. в России начались и продолжаются годы Украины. Пик пришёлся на 2015 г., потом тренд пошёл на спад, но всё ещё продолжает держаться на высоком уровне.

Совершеннолетняя журналистика: от России до Кремля - 4

Интересно, конечно, но ничего такого, о чем бы я не знал или не догадывался.

Сменим немного подход – выделим топовые темы за всё время и посмотрим, как менялось их соотношение из года в год, то есть изучим эволюцию тем.

Самым интерпретируемым вариантом оказался Топ-5:

  1. Криминал (мужчина, полиция, произойти, задержать, полицейский);
  2. Политика (Россия, Украина, президент, США, глава);
  3. Культура (спиннер, гнойный, instagram, рамбнуть – да, вот такая у нас культура, хотя конкретно эта тема получилась довольно смешенной);
  4. Спорт (матч, команда, игра, клуб, спортсмен, чемпионат);
  5. Наука (учёный, космический, спутник, планета, клетка).

Далее возьмём каждую статью и посмотрим, с какой вероятностью она относится к той или иной теме, в результате все материалы будут поделены на пять групп.

Политика получилась самой популярной – под 80% всех публикаций. Однако пик популярности политических материалов пройден в 2014 г., сейчас их доля снижается, растёт вклад в информационную повестку Криминала и Спорта.

Совершеннолетняя журналистика: от России до Кремля - 5

Проверим адекватность тематических моделей, используя подрубрики, которые указали редакторы. Топовые подрубрики удалось более-менее корректно выделить с 2013 года.

Совершеннолетняя журналистика: от России до Кремля - 6

Особых противоречий не замечено: Политика стагнирует в 2017 г., Футбол и Происшествия растут, Украина по-прежнему в тренде, с пиком в 2015 г.

Предсказание популярности: XGBClassifier, LogisticRegression, Embedding & LSTM

Попытаемся понять, можно ли по тексту предсказать популярность статьи на Ленте, и от чего эта популярность вообще зависит. В качестве целевой переменной я взял количество репостов на Фейсбук за 2017 год.

3 тыс. статей за 2017 г. репостов на Fb не имели – им присвоен класс «непопулярные», 3 тыс. материалов с самым большим количеством репостов получили метку «самые популярные».

Текст (6 тыс. публикаций за 2017 г.) был разбит на унограммы и биграммы (слова-токены, как одиночные, так и словосочетания из двух слов) и построена матрица, где колонками являются токены, рядами – статьи, а на пересечении – относительная частота вхождения слов в статьи. Использованы функции из sklearn – CountVectorizer и TfidfTransformer.

Подготовленные данные были поданы на вход XGBClassifier (классификатор на основе градиентного бустинга из библиотеки xgboost), который через 13 минут перебора гиперпараметров (GridSearchCV при cv=3) выдал точность на тесте 76%.

Совершеннолетняя журналистика: от России до Кремля - 7

Потом я использовал обычную логистическую регрессию (sklearn.linear_model.LogisticRegression) и через 17 секунд получил точность в 81%.

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

Как дань моде немного потестил нейронные сети. Перевёл слова в числа с помощью one_hot из keras, привёл все статьи к одинаковой длине (функция pad_sequences из keras) и подал на вход LSTM (свёрточная нейронная сеть, using TensorFlow backend) через слой Embedding (чтобы сократить размерность и ускорить время обработки).

Сеть отработала за 2 минуту и показала точность на тесте 70%. Совсем не предел, но сильно заморачиваться в данном случае нет смысла.

Вообще, все методы выдали сравнительно небольшую точность. Как показывает опыт, алгоритмы классификации хорошо работают при разнообразии стилистики, – на авторских материалах, другими словами. На Lenta.ru такие материалы есть, но их очень мало – менее 2%.

Совершеннолетняя журналистика: от России до Кремля - 8

Основной массив написан с использованием нейтральной новостной лексики. И популярность новостей определяет не сам текст и даже не тема как таковая, а их принадлежность к восходящему информационному тренду.

Например, довольно много популярных статей освещают события на Украине, наименее популярные данной темы почти не касаются.

Совершеннолетняя журналистика: от России до Кремля - 9

Изучение объектов с помощью Word2Vec

В качестве завершения хотел провести сентимент-анализ – понять, как журналисты относятся к наиболее популярным объектам, которые они упоминают в своих статьях, меняется ли отношение со временем.

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

В качестве теста взял Украину (2015 vs 2017) и Путина (2000 vs 2017). Выбрал статьи, в которых они упомянуты, перевёл текст в многомерное векторное пространство (Word2Vec из gensim.models) и спроецировал на двумерное с помощью метода Главных компонент.

После визуализации картинки получились эпические, размером не меньше гобелена из Байё. Вырезал нужные кластеры для упрощения восприятия, как смог, извините за «шакалы».

Совершеннолетняя журналистика: от России до Кремля - 10
Совершеннолетняя журналистика: от России до Кремля - 11

Что заметил.

Путин образца 2000 г. всегда появлялся в контексте с Россией и выступал с обращениями лично. В 2017 г. президент РФ превратился в лидера (чтобы это ни значило) и дистанцировался от страны, теперь он, если судить по контексту, – представитель Кремля, который общается с миром через своего пресс-секретаря.

Украина-2015 в российских СМИ – война, бои, взрывы; упоминается обезличено (Киев заявил, Киев начал). Украина-2017 фигурирует преимущественно в контексте переговоров между официальными лицами, и у этих лиц появились конкретные имена.

...

Заниматься интерпретацией полученной информации можно довольно долго, но, как мне думается, на данном ресурсе это оффтоп. Желающие могут посмотреть самостоятельно. Код и данные прилагаю.

Ссылка на скрипт [9]

Ссылка на данные [10]

Автор: Артём

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/298671

Ссылки в тексте:

[1] Анализируй это — Lenta.ru: https://habr.com/post/343838/

[2] ildarchegg: https://habr.com/users/ildarchegg/

[3] MongoDB для импорта json в python: #MongoDB

[4] Очистка и нормализация текста: #%D0%9E%D1%87%D0%B8%D1%81%D1%82%D0%BA%D0%B0

[5] Облако тегов: #%D0%9E%D0%B1%D0%BB%D0%B0%D0%BA%D0%BE

[6] Тематическое моделирование на основе LDA: #%D0%A2%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5

[7] Предсказание популярности: XGBClassifier, LogisticRegression, Embedding & LSTM: #%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%B8%D0%B5

[8] Изучение объектов с помощью Word2Vec: #Word2Vec

[9] Ссылка на скрипт: https://github.com/Myonin/silentio.su/blob/master/topic_model_texts_lenta_ru.ipynb

[10] Ссылка на данные: https://drive.google.com/file/d/1NlFuOjOt0oQ9Mx70Z7ZvfOsB3-1fCALp/view

[11] Источник: https://habr.com/post/429270/?utm_source=habrahabr&utm_medium=rss&utm_campaign=429270