11 октября 2015 г. в Беларуси состоятся очередные президентские выборы. На высшую должность претендуют четыре кандидата, каждый из которых, естественно, опубликовал свою предвыборную программу в СМИ. Это хороший случай, чтобы продолжить начатую ранее тему и продемонстрировать дополнительные методы анализа текстовой информации. В частности, мы попытаемся ответить на следующие вопросы:

1) Насколько сходны программы кандидатов по своему словарному составу?
2) В чем именно заключается основная идея (или идеи) каждого документа?

Программы каждого кандидата без труда можно найти в Сети (файлы c текстом каждой программы, а также R-код для воспроизведения приведенных здесь примеров, доступны на GitHub):
Помимо перечисленных выше четырех документов в анализ были включены также программы А. Лукашенко за 2006 (lu06) и 2010 (lu10) годы. Включение этих дополнительных документов представляет интерес с точки зрения изучения эволюции тематики предвыборных обещаний действующего главы Беларуси.





Дисклеймер: единственная цель этой статьи - продемонстрировать методы анализа текстовой информации. Автор статьи не имеет никакого отношения ни к одному из кандидатов. Любая интерпретация приведенных здесь результатов - исключительно дело читателей. 


Сходство словарного состава документов

Начнем с выяснения лексических различий текстов предвыборных программ. Как правило, подобный анализ выполняют путем разбиения документов на отдельные слова, подсчета частоты встречаемости каждого слова в каждом документе и составлении т.н. терм-документной матрицы, в которой строки обычно соответствуют словам, а столбцы - документам. Имея такую матрицу, можно рассчитать подходящую случаю метрику сходства документов. Несмотря на кажущуюся простоту, подготовка терм-документной матрицы - это нетривиальная задача, часто требующая экспериментирования. Для подготовки терм-документной матрицы на основе рассматриваемых нами документов (предвыборных программ) были выполнены следующие шаги (см. по этой теме также здесь):

  1. Очистка от знаков пунктуации, чисел и лишних пробелов.
  2. Преобразование всех букв в словах в строчные.
  3. Разбиение документа на отдельные слова.
  4. Удаление стоп-слов, т.е. слов, не несущих особой смысловой нагрузки (например, "а", "не", "и" и т.п.). Следует отметить, что в зависимости от контекста набор стоп-слов может значительно варьировать. Для описываемого анализа был использован список общего назначения, доступный в пакете SnowballC для R. Кроме того, поскольку все документы непосредственно касались Республики Беларусь, из них были удалены все слова, в состав которых входили следующие сочетания букв: "беларус", "белорус", "республик".
  5. Стемминг - нахождение основы для каждого исходного слова (эта основа не обязательно совпадает с морфологическим корнем того или иного слова). Например, для "жизнь", "жизни", "жизням" такой основой будет "жизн". Как видно из приведенного примера, стемминг необходим для удаления из анализа избыточной информации - концептульно все три исходных слова подразумевают "жизнь", но различаются окончаниями, и поэтому после стемминга мы получаем лишь "жизн". Для выполнения стемминга есть несколько алгоритмов. Здесь был использован метод, реализованный для русского языка в пакете SnowballC.

Как было отмечено выше, в ячейках терм-документной матрицы изначально представлены "сырые" частоты встречаемости каждого слова в соответствующих документах. Однако расчет метрик сходства документов на основе таких частот может привести к искаженным результатам. Дело в том, что если какое-то слово встречается очень часто, но лишь в одном или немногих документов, то "вес" этого слова при расчете метрики сходства может оказаться чрезмерно завышенным. Для устранения этого недостатка необходимо учесть не только встречаемость того или иного слова в конкретном документе, но и количество документов, в котором оно встречается. Это можно сделать при помощи т.н. метода "TF-IDF" (от "term frequency - inverse document frequency"). Рассчитанный по этому методу вес некоторого слова будет прямо пропорционален частоте встречаемости данного слова в конкретном документе и обратно пропорционален количеству документов, в которых оно встречается. Для рассматриваемого примера TF-IDF-веса слов (вернее - основ слов, полученных после стемминга) были рассчитаны при помощи функции weightTfIdf() из пакета tm для R.

Имея терм-документную матрицу с TF-IDF-весами, мы можем рассчитать метрику сходства документов по их словарному составу. Существует большое количество таких метрик, однако чаще всего при анализе текстов используют т.н. косинусное сходство. При использовании TF-IDF-весов эта метрика изменяется от 0 до 1. Чем ближе значение метрики к 1, тем больше два документа сходны между собой по словарному составу.

Для анализируемых документов получена следующая матрица косинусного сходства:

       lu06   lu10   lu15     ga     ko
lu10  0.142                        
lu15  0.112  0.143                  
ga    0.030  0.042  0.034            
ko    0.101  0.109  0.113  0.059      
ul    0.062  0.044  0.080  0.026  0.088

Хотя это небольшая матрица и мы можем проанализировать ее, последовательно просматривая значения уровня сходства между отдельными парами документов, гораздо удобнее было бы ее визуализировать. Для этого можно применить разные подходы (например, построить коррелограмму). Здесь мы представим, что отдельные документы - это взаимосвязанные узлы некоторой сети, и изобразим эту сеть в виде неориентированного графа. Толщина отрезков, связывающих отдельные "узлы", будет пропорциональна соответствующим значениям косинусного сходства из представленной выше матрицы:



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

  • Наблюдается относительно большое сходство словарного состава всех предвыборных программ А. Лукашенко (lu06, lu10 и lu15), что вполне ожидаемо, поскольку речь идет об одном и том же авторе.
  • Лексикон предвыборной программы госпожи Короткевич (ko) проявляет большое сходство одновременно со всеми предвыборными программами А. Лукашенко, образуя с ними единый лексический кластер (отрезки, связывающие узлы в этом кластере, показаны фиолетовым цветом).
  • Словарный состав программ остальных кандидатов проявляет меньшее сходство с любым из проанализированных документов, чем сходство, наблюдаемое между документами в кластере "lu06 - lu10 - lu15 - ko". В частности, особняком стоит предвыборная программа господина Гайдукевича, которая по своему лексикону мало похожа на любой из других документов.


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

Семантический анализ (semantic analysis) выполняется для выявления излагаемых в документах концепций, или тем. Если бы любое слово, входящее в состав того или иного документа, имело только одно значение, выполнение такого анализа не составляло бы труда:



К сожалению, реальность гораздо сложнее - одно и тоже слово может иметь разные значения и, следовательно, может употребляться авторами документов для описания разных идей, что затрудняет выявление этих идей (такая задача может оказаться сложной даже для человека; а представьте, как сложно обучить этому компьютер!):



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

Одним из наиболее эффективных современных методов семантического анализа является т.н. метод "латентного размещения Дирихле" (latent Dirichlet allocation, LDA). Этот метод основан на предположении о том, что каждый документ представляет собой смесь из нескольких тем, и при этом вероятность появления каждого слова в документе выше для одной темы и ниже для других тем. Заранее количество тем нам не известно, и задача алгоритма заключается в том, чтобы "восстановить" эти скрытые ("латентные") темы, анализируя частоты встречаемости слов.

Чтобы лучше понять, что делает метод LDA, рассмотрим следующий простой пример из трех документов, каждый из которых включает одно предложение:

1) Я ем рыбу и овощи.
2) Рыбы - это домашние животные.
3) Мой котенок ест рыбу.

LDA позволяет автоматически обнаружить темы, содержащиеся в этих трех документах. В частности, LDA мог бы отнести слова, выделенные жирным шрифтом, к теме "Е" ("еда"), а слова, выделенные наклонным шрифтом - к теме "Ж" ("животные"). С "точки зрения" LDA, каждая тема - это набор слов. Интерпретация тем (т.е. присваивание им меток вроде "еда" и "животные") - эта задача исследователя. В зависимости от ситуации, выполнить такую интерпретацию не всегда будет легко.

Тот факт, что LDA рассматривает каждую тему как простой набор слов, имеет два преимущества:

1) Мы можем отнести каждое предложение к конкретной теме. В представленном выше примере:

Предложение 1: 100% тема "Е"
Предложение 2: 100% тема "Ж"
Предложение 3: 33% тема "Е" и 67% тема "Ж"

2) Мы можем рассчитать долю, которую составляет каждое слово в конкретной теме. Например, тема "Е" может состоять из следующих пропорций: 40% "есть", 40% "рыба" и 20% "овощи".

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

Вернемся к предвыборным программа кандидатов в президенты. В результате применения метода LDA к этим документам (реализован в пакете topicmodels для R) всего было выявлено 13 тем. Ниже описаны темы, которые с наибольшей вероятностью характеризуют каждую предвыборную программу в целом:

А. Лукашенко

Установлено, что вне зависимости от года проведения выборов, смысл всех трех предвыборных программ господина Лукашенко с большой вероятностью сводится к одной и той же теме. Список десяти наиболее вероятных для этой темы слов (точнее - основ слов, полученных после стемминга; см. выше) включает:

1) "наш"
2) "стран"
3) "государств"
4) "кажд"
5) "независим"
6) "экономик"
7) "развит"
8) "сво"    
9) "нов"
10) "люд"

Как видим, в целом идет речь о "нашем-независимом-государстве-с-экономикой-для-людей".

Т. Короткевич

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

1) "государствен"
2) "предприят"
3) "основ"
4) "эффективн"
5) "поддержк"
6) "прав"      
7) "социальн"
8) "гражда"
9) "политик"
10 "национальн"

Похоже, речь в основном идет о "социально-ориентированном-и-обеспечивающем-поддержку-государстве".

Улахович Н.

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

1)"развит"
2) "обществ"
3) "народ"
4) "обеспечен"
5) "работа"
6) "сохранен"  
7) "гарант"
8) "государствен"
9) "населен"
10 "традиц"

Таким образом, имеем государство, "обеспечивающее-развитие-и-гарантирующее-сохранение-работы-и-традиций".

Гайдукевич С.

Господин Гайдукевич четко выделяется на фоне других кандидатов тем, что в своей предвыборной программе он в основном говорит о... себе. Вот 10 наиболее характерных слов, описывающих наиболее вероятную тематику его программы:

1) "гайдукевич"
2) "бизнес"
3) "стран"
4) "восток"
5) "развит"
6) "дел"      
7) "запад"
8) "нужн"
9) "экономическ"
10) "необходим"

Помимо постоянного упоминания о себе, С. Гайдукевич говорит о Беларуси как о стране, которой "нужно-развивать-бизнес-с-востоком-и-западом".


Заключение

В этой статье были продемонстрированы простые примеры словарного и семантического анализа документов. Выполнение любого анализа текстовой информации всегда сопровождается необходимостью экспериментирования с теми или иными параметрами для достижения интерпретируемого результата. Например, аналитик должен принять ряд (часто субъективных) решений в отношении необходимости выполнения стемминга и удаления наиболее часто встречающихся слов из терм-документной матрицы, выбора метрики сходства документов, выбора оптимального числа LDA-тем, и т.д. Подобные решения принимались и в ходе описанного анализа. В связи с этим вполне можно ожидать, что при изменении некоторых параметров анализа результаты окажутся несколько отличными от приведенных выше. Напомню, что R-код для воспроизведения всех примеров хранится на GitHub - экспериментируйте!


10 Комментарии

Olga написал(а)…
Очень интересная статья, спасибо! У нас тоже скоро местные выборы, поэкспериментирую с программами )
Анонимный написал(а)…
Мы тоже пытались такими методами анализировать выборы, но подобные методы хорошо работают на больших текстах. А для коротких избирательных программ - эффективность где-то 50/50.
http://oporadp.org/najblsh-vzhivan-slova-u-peredvibornix-program-kandidatv-u-prezidenti-2014.html
http://oporadp.org/analz-vzamod-slv.html
Unknown написал(а)…
Спасибо за статью. А я попробую применить для анализа резюме и вакансий.
Sergey написал(а)…
Спасибо большое.
Все не доходили руки с tf-idf разобраться. Видимо, пришло время... ))
Анонимный написал(а)…
Сергей, отличная статья.
Рад, что вы время от времени возвращаетесь к анализу текстовых документов - это моя самая любимая область в Data Science.
Unknown написал(а)…
Прошу прощение за возможно глупый вопрос, однако для меня важно знать. По образованию гуманитарий и с матиматикой и статистикой мало сталкивался, а тут...
Я собираю данные с работных сайтов hh.ru и superjob.ru по количеству резюме и вакансий в каждой отрасли, по дву городам Москва и Санкт-Петербург.
Подскажите к какому типу данных можно отнести эти данные? Мне важно понимать какие методы статистическоги и/или математического расчета и анализа корректно применять при использовании полученных данных.
Спасибо.
Sergey Mastitsky написал(а)…
Дмитрий, к сожалению, на Ваш вопрос невозможно ответить, не зная конкретную цель анализа.
Unknown написал(а)…
Сергей вы прямо одним предложением воплотили моё самое страшное предположение. Я как раз расчитывал на то что бы с помощью формул мат. статитстики и/или мат. анализа постараться найти более глубокий смысл а моих данных. В R-Studio я уже кое-что протестировал некоторые формулы, расчитывают и выдают результаты. Перечисляю: "стандартное" summary(), корреляцию - cor.test(), тест Шапиро shapiro.test(), тест Фишера - fisher.test(), Хи-Квадрат - chisq.test(). То что значат результаты я разбирусь и пойму. Но возникают два важных вопроса, которые для меня не понятны. 1. Правильно ли оиспользовать тест Фишера или Хи-Квадрат использую данные о количестве резюме и вакансий? 2. Понимание логики результатов вычисления. Самый простой пример - вычисление корреляции. Хрошо расчитал и получил значения корреляции. А дальше, что? Хорошо результаты показали наличие некой связи между количеством вакансий по Москве и количеством резюме по Москве на сайте хэдхантер. Это мало что говорит, а например директору по персоналу или соискателю вообще ничего не говорит. Корреляция всего лишь показывает о наличии связи и всё, но смысла, т.е. как связать эту взаимосвязь с возможностью реально принимать решение, не возможно.
Sergey Mastitsky написал(а)…
Дмитрий, даже не знаю, как ответить на Ваши вопросы... Они очень разные - некоторые можно прокомментировать двумя предложениями, а для ответа на другие потребуется текст размером с главу книги. Посему очень общие советы:
1) "Формулы статистики" действительно могут помочь найти "глубой смысл" в данных, но для этого Вам нужно четко понимать, что Вы делаете. Не выполнив "домашнего задания" в виде прочтения пары хороших книг по статистике/анализу данных, приступать к какому-либо анализу бессмысленно. Вы же не сядете за руль машины, не зная, как ею управлять? Среди хороших вводных работ я всегда рекомендую книгу С. Гланца "Медико-биологическая статистика" - проще писать о статистике, видимо, невозможно. Если хотите с примерами на R, то подойдет книга А. Шипунова и соавт. "Наглядная статистика", а также переводная книга Р. Кабакова "R в действии".
2) Использовать ли хи-квадрат или тест Фишера: об этом, опять-таки, можно прочитать в любом хорошем учебнике по статистике, в т.ч. в книге С. Гланца. Подробные примеры на R приведены также в нашей с В. К. Шитиковым книге "Статистический анализ... с помощью R". В любой из этих книг Вы узнаете, какие данные подходят для работы с этими тестами, и как они должны быть организованы.
3) Насчет корреляций. Тут я всегда привожу англоязычную поговорку "Correlation is not causation", т.е. наличие корреляции совсем не обязательно указывает на причинную связь между явлениями. Тем не менее, это не значит, что обнаруженный факт корреляции нельзя использовать на практике - как раз наоборот. Как именно использовать полученное знание, зависит от каждого конкретного случая. Решения на основе знаний, полученных в ходе анализа данных, должны приниматься специалистом в той или иной области, исходя из его понимания предмета и соответствующего опыта. Задача анализа данных в таких случаях - помогать принимать хорошо информированные решения, но нельзя ожидать что статистический анализ выдаст рецепт готового решения.
Unknown написал(а)…
Спасибо, Сергей.
Новые Старые