Серия руководств по статистике Python

Учебное пособие по Python: создание класса анализатора социальных сетей для правительства

Улучшите свою программу для работы с любым списком политиков

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

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

Наша цель — создать программу, которая может анализировать Twitter-аккаунты политиков любой страны, не только Швейцарии.

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

Файл конфигурации Yaml

Наша первая программа на Python lesson1.py жестко кодировала учетную запись Twitter и ее имя в списке непосредственно в самой программе.

Теперь нам нужно прочитать эту информацию из конфигурационного файла, аналогично тому, что мы сделали для передачи секретов Twitter API в первом уроке (обратитесь к руководству)

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

Как вы можете видеть на снимке экрана ниже, мы называем файл config-CH.yaml.

Так зачем использовать пост-фикс CH? Итак, постфикс CH — это код Alpha-2 международного стандарта ISO-Country Code для Швейцарии. Кодовые значения (или эталонные значения) являются составной частью любой программы для кодирования информации. Лучшей практикой является использование стандартного, если это возможно (не изобретайте велосипед здесь). То есть для стран мы решили использовать код Alpha-2 стандарта ISO 3166–1. Как вы увидите позже, для языков кодирования мы используем аналогичный подход. ИСО, кстати, означает Международная организация по стандартизации.

Рефакторинг и улучшение

Класс правительстваSocialMediaAnalyzer

Для нашей обобщенной программы мы делаем первый шаг рефакторинга. Рефакторинг кода — это процесс реструктуризации существующего компьютерного кода без изменения его внешнего поведения. Поэтому мы переименовываем наш класс в файле sample1.py в GovernmentSocialMediaAnalyzer и улучшаем метод его конструктора класса __init__ с помощью параметра country_code. Мы приняли первое проектное решение:

Проектное решение 1: Экземпляр нашего класса GovernmentSocialMediaAnalyzer будет инкапсулировать данные и поведение выделенной страны.

Усовершенствования кода показаны ниже:

  • Параметр country_code (например, CH), переданный во время создания класса.
  • будет храниться как частная переменная экземпляра __country_code и использоваться
  • чтобы создать конфигурацию yamlимя_файла,
  • откуда мы будем загружать данные конфигурации и хранить данные в приватной переменной __cfg

Итак, теперь мы готовы обобщить наш метод get_government_members, считывая учетную запись Twitter и имя списка из данных конфигурации, которые хранятся в переменной экземпляра self.__cfg.

Но давайте сначала завершим рефакторинг и улучшение нашего класса __init__. Принимаем другое дизайнерское решение

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

Это означает, что когда мы создаем экземпляр GovernmentAnalyzer для отдельной страны, этап инициализации кейса будет включать все необходимые шаги для получения данных из Twitter во внутренние структуры данных (представленные в виде столбцов).

Мы выполним этот шаг в специальном вспомогательном методе, который будет называться __extract_columns. Мы определили его как частный метод (префикс __), потому что он не должен использоваться кем-либо за пределами этого класса.

Рефакторинг класса из первого урока теперь выглядит так.

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

Итак, мы доработали и отрефакторили класс создания экземпляра класса.

  • 5–12: блок кода для загрузки файла конфигурации для конкретной страны.
  • 16–21: блок кода для чтения токена безопасности и ключей Twitter из секретного файла конфигурации, а затем подключения к API Twitter.
  • 39: вызов метода _extract_columns для извлечения данных и преобразования их в столбцы.

Наш алгоритм check_for_party из первого урока заключался в жестком кодировании сокращений партий в самом коде.

Что ж, давайте проведем рефакторинг кода и переместим информацию о party в наш конфигурационный файл. Благодаря гибкости файла YAML это можно сделать довольно легко.

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

Таким образом, для нашей конфигурации config-CH.yaml потребуется информация о конфигурации для каждой стороны. Список партий и их сокращения можно найти на parlament.ch на четырех языках для Швейцарии.

В YAML вы можете быстро создать список элементов конфигурации (например, элемент конфигурации группы). Элементы списка обозначаются начальным дефисом (-) с одним элементом на одну или несколько строк или заключаются в квадратные скобки ([]) и разделяются запятой (,).

  • член партийного списка обозначается дефисом. Член партийного списка имеет атрибут twitter и abbrs. Атрибут abbrs (аббревиатуры) сам по себе представляет собой список строк, обозначенных квадратными скобками.

Если мы проверим загруженный файл конфигурации (хранящийся в переменной self._cfg) в отладчике Python, должно быть ясно, как выглядит структура данных с использованием списков и словарей Python.

Дополнительное замечание к атрибуту abbrs: мы представили им список сокращений сторон, т. е. наличие нескольких национальных языков также означает, что у партии есть различные сокращения (например, для немецкого и французского языков). В нашем случае выше «FDP» и «PLR». И мы хотим проверить их всех. В других странах потенциально может быть только одна аббревиатура, но с решением мы готовы к будущему.

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

  • В строках 6, 10 и 19 мы получаем данные из нашей структуры конфигурации.
  • В зависимости от типа атрибута мы должны перебирать список значений (6, 10) или напрямую извлекать данные (19).
  • Если у нас есть совпадение, будет возвращено первое сокращение в качестве значения кода для идентификации сторон: res = party[‘abbrs’][0]

Тонкая настройка алгоритма

Представляем вторую графическую таблицу: группировка счетов по сторонам

Чтобы отладить наш алгоритм, мы должны проверить его эффективность при поиске участника твиттер-аккаунта. Для этого мы должны ввести вторую таблицу, которая будет группировать наши учетные записи Twitter в соответствии с их принадлежностью к группе.

Мощный пакет panda предоставит нам необходимые инструменты. Вы можете обратиться к следующему описанию API панды со всеми подробностями о том, как группировать данные.

Некоторые комментарии к фрагменту кода:

  • 4–8: Здесь мы создаем запись panda_data, состоящую из 4 столбцов. __col_party, __col_followers_count, __col_friends_count. __col_party используется дважды, первый столбец используется для маркировки каждой строки (как вы видите в строке 11, мы группируем по партиям), а во втором столбце мы суммируем строки, которые имеют та же вечеринка,
  • 9: Мы создаем первый фрейм данных панды этой таблицы с четырьмя столбцами.
  • 11: Здесь мы преобразуем созданный фрейм данных с помощью функции groupby. Мы также определяем операции агрегирования agg для 2-й, 3-й и 4-й строк.
  • 15–19: основные элементы для создания красивой таблицы сюжетов.

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

Улучшите наш файл конфигурации с помощью атрибута ключевого слова

Наш первый запуск показывает, что большинство политиков (65 человек) не упоминают аббревиатуры своей партии или партийное твиттер-имя_экрана в описании своей учетной записи/имя_экрана.

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

Мы нашли следующие ключевые слова:

  • социалист (СП)
  • глп (GLP),
  • Зеленый (GLP)
  • лига

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

И мы добавляем дополнительную проверку в наш метод check_for_party (23–28)

И вуаля, мы смогли определить 13 других аккаунтов в Твиттере с более чем 20 000 подписчиков. Тем не менее, 52 учетных записи не могут быть сопоставлены с группой, но для этого нам нужно подключить другой источник данных, что будет сделано в следующем руководстве.

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

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

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

Как визуализируется диаграмма последовательности UML, поток взаимодействия нашего класса может быть представлен следующим образом:

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

В качестве примера: строка сообщения пакету panda для создания фрейма данных изображена красным ( createDataFrame ), его строка сообщения возврата объекта dataFrame - синим.

Упражнение

Воспользуйтесь одним из списков, предлагаемых через аккаунт правительства в Твиттере (https://twitter.com/TwitterGov), например, список членов парламента Великобритании (https://twitter.com/TwitterGov/lists/uk -мпс).

  • Разработайте соответствующий конфигурационный файл yaml
  • Проверьте, какая информация может быть использована для идентификации партии политика.
  • Улучшите ключевые слова своими выводами
  • Дополните основную программу вводным вопросом пользователя, например, «Какое правительство вы хотите проанализировать». Предоставьте список доступных конфигураций, а затем запустите программу с выбором пользователя.
  • Подумайте об изменениях, необходимых для анализа нескольких списков политиков в каждой стране. То есть мы хотим различать различные государственные органы в каждой стране и обобщать это в файлах конфигурации.

Исходный код можно найти здесь: https://github.com/talfco/clb-sentiment

Первоначально опубликовано на dev.cloudburo.net 3 февраля 2019 г.