Аккаунт члена палаты представителей Александрии Окасио-Кортес в Twitter «@AOC» - это горячая точка для политических дискуссий. Опытный интернет-серфер предупреждает: «не читайте комментарии», но я провел там много времени, читал, сбит с толку, к счастью, только однажды заставил ответить (кто-то сказал, что она могла получить голоса только в Бруклине).

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

Возможность для машинного обучения

Я подумал, что было бы интересно проанализировать и сгруппировать большую выборку ответов на AOC. Рассматривайте учетную запись как приманку. Может быть, получившаяся модель научится отфильтровывать плохие твиты повсюду?

Идеальная система (на мой взгляд) автоматически сортирует твиты по 5–10 архетипам, которые пользователь может выбрать, видеть или нет.
У меня нет ресурсов, чтобы пометить каждый твит вручную, как я ожидал для контролируемого обучения.
«Анализ настроений» по ключевым словам в твитах был преувеличен, и он не помогает с контекстом - кто-то сердито отвечает на новостную статью или кричит на кота в винном погребе?

Парсинг Twitter

Официальный API Twitter предлагает ограниченный набор параметров для их данных. К сожалению, никто не получает ответы на конкретный твит ... На GitHub и StackOverflow циркулируют скрипты, которые ищут последние твиты и выбирают ответы, но со скоростью Twitter я бы никогда не смог зафиксировать неделю или месяц обсуждений. Альтернатива - немного взломать.

(не подходит для Условий обслуживания, продолжайте на свой страх и риск)
Я написал сценарий TamperMonkey для своего браузера, чтобы загружать текст и метаданные каждого твита по мере прокрутки ответов. Я вышел из своей учетной записи, чтобы получить менее предвзятый взгляд без пользовательских блоков (обратите внимание, что Twitter скрыл некоторых пользователей в старых потоках). Я открывал все твиты и ретвиты, сделанные учетной записью @AOC в марте 2019 года. В результате было получено около 110 000 ответов (27,1 МБ CSV). Я готов поделиться кодом и данными с исследователями.

Сопутствующие работы

Методология

Я придумал варианты анализа твитов:

  • A: Контролируемое изучение текста подозрительных пользователей - выберите набор «вероятных недобросовестных» твитов на основе имени пользователя и экранного имени (заканчивающихся цифрами, имена - MAGA, QAnon , или Трамп). Это НЕ запрещение пользователей за политику, а разработка модели, основанной на учетных записях сжигателей и троллей. Обучите модель тексту ответов и оцените твит на основе их оценки.
  • B: контролируемое обучение по тексту непристойных и подстрекательских пользователей - аналогично предыдущему - поиск ответов по ключевым словам в тексте твита (ненормативная лексика, подстрекательские темы в несвязанных темах, личные оскорбления, хэштеги). Поместите эти твиты вместе с любыми другими твитами этих пользователей в группу «недобросовестность» и ставьте другие твиты по их оценке.
  • C: Обучение без учителя с помощью word2vec - запустите word2vec для текста твита, а затем используйте кластеризацию k-средних для разделения на группы.
  • D: Обучение без учителя с помощью scikit-learn - выполните иерархическую кластеризацию с использованием scikit-learn и ключевых слов (поскольку полный текст не так легко применить к этой программе).

Анализ и результаты

Результаты контролируемого обучения

Сначала я не хотел маркировать твиты из-за ручного процесса, но с опцией имени пользователя потребовалось бы всего несколько операторов SQL. Во-первых, статистика:

  • из 110 тыс. ответов, 17 тыс. пришло от "числа пользователей", оканчивающихся на 3+ цифры, и около 2 тыс. пришло от пользователей с именами Trump / MAGA / Anon / националистами.
  • нет явных лидеров: только 12 из них отправили более 30 ответов в месяц
  • из 3300 пользователей, которые написали несколько ответов, они по-прежнему появлялись в среднем менее одного раза в неделю

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

У меня есть опыт настройки контролируемой модели НЛП с помощью Google AutoML, но, учитывая все исходные твиты и ответы, изначально не удалось отнести любые к плохим твитам. Когда ваши данные настолько несбалансированы (6: 1 или хуже), AutoML может игнорировать второстепенную категорию и заявлять о точности в среднем 80-процентном диапазоне.

Для своего второго запуска я решил собрать нецензурные твиты (и дополнительные твиты их авторов), всего 15 тысяч. Я сбалансировал эти твиты с 15k случайно выбранными обычными твитами, а не с полным набором данных.

Матрицу путаницы здесь сложно прочитать, но предсказание «Истина» означает, что модель считала ее нечестивой. Полезность этой модели, что довольно необычно, зависит от того, какие твиты попадают в категорию «Прогнозно-истинные / оскорбительные», но были помечены как «Ложные» в моем первоначальном процессе выбора. Я проверил эту категорию:

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

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

Я бы предпочел классификатор, который рассматривает текст исходных твитов и ответов как отдельные столбцы, а также использует другие атрибуты твитов. К счастью для меня, Microsoft только что добавила платформу автоматизированных экспериментов в Azure, и это руководство по началу работы появилось в мае 2019 года. Azure использует различные алгоритмы и отчеты, которые имеют наилучшую точность, в данном случае MaxAbsScaler, SGD (масштабирование каждого столбца от 0 до 1 с использованием стохастического градиентного спуска).

Сообщается о высокой точности, но я не могу просмотреть версию нежелательных твитов для Azure. Я могу загрузить модель как файл pickle размером 145 МБ, но неясно, как продолжить работу с ней в среде Azure или на моем локальном компьютере. Если появится лучшая документация и пошаговые инструкции, посмотрите это место.

Результаты обучения без учителя

Учебник Reddit NLP был настолько удобен в использовании, что я быстро кластеризовал слова из своего собственного набора данных. Я запросил 10 кластеров и распечатал главные слова из каждого:

Сначала я был обескуражен. Кластер № 1 выбрал некоторые условия инфраструктуры и политики, но выбрал много из них. Кластер № 9 выглядит просто «глаголами». В другом кластере были «быстрее», «дешевле», «умнее», «больше», «меньше»… слова, связанные грамматически, но не по значению.

После расширения моего скрипта, чтобы показать 50 кластеров, они включали такие темы, как:

  • окружающая среда ('температура', 'похолодание', 'вымирание', 'наводнение', 'наводнение', 'бедствия', 'парник', 'природный', 'эпидемия', 'снег', ' промышленный ')
  • обзывание («хакер», «диктатор», «активист», «мошенник», «актер», «фальшивый», «мошенник», «неудачник»)
  • этика («направляемые», «вклады», «нарушения», «пакеты», «помощник», «учетные записи», «скрытые», «этика»)
  • группы меньшинств

Полезность кластерного анализа неоднозначна, поскольку он выявляет ключевые слова, принадлежащие тематическим группам, но я не вижу, чтобы это помогло выявить хорошие и плохие твиты. Обновление: я смотрю Стэнфордский курс НЛП и объясняю Gensim syn0 - исходные данные для размещения слов в векторном пространстве были созданы до выборов 2016 года, поэтому ассоциация Трампа, Клинтона и другие слова с тех пор изменились.
Я решил пойти по пути этого учебника по анализу Twitter и сгенерировать несколько гистограмм D3, чтобы показать, что ответы, связанные с окружающей средой, были мотивированы средой, созданной AOC, и твитами Green New Deal.

Ответы, связанные с окружающей средой, на ежедневный пик AOC, который резко вырос после мэрии с Крисом Хейсом на MSNBC.
Давайте установим новые оси для нашего следующего графика. Начиная с новой среды Твитнуть в нулевой час, когда обычно приходят соответствующие ответы?

Как это соотносится с обзывающими ответами?

В конце концов я решил построить модель иерархической кластеризации с упором на классификацию суммы ответов пользователя. Я создал несколько столбцов, в которых подсчитываются вхождения терминов в расширенном списке ненормативной лексики, слов окружения, обзывающих слов и т. Д., О которых сообщают кластеры в предыдущем примере.
Я просмотрел твиты от нескольких выборочных пользователей в 10 кластерах -division и 30 cluster-разбиение, но не видите значимой общности в их твитах? Определенно оскорбительные высказывания были во всех пробах, которые я просмотрел, кроме одного. Мне интересно, были ли они сгруппированы по количеству вхождений, которое больше зависит от количества сообщений, чем от фактического содержания.

Тестируем это

Какие твиты будут отмечены в новом твите AOC? Вернемся к модели контролируемого обучения, которую я создал в AutoML. Я открыл вкладку «Прогноз» и прогнал несколько твитов (они были помечены как «недобросовестные»).

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

Выводы

Я не собираюсь говорить об этом с платформой для отслеживания сложных троллей. Когда я начинал блокировать, я проверял, «стоит ли того» учетная запись, проверяя их фото, профиль и количество подписчиков, чтобы убедиться, что эта учетная запись была просто учетной записью для сжигателей / политиков. Я нашел аккаунты с «туристическими предложениями», которые в один прекрасный день переключились на ВСЕ ЗАГЛАВНЫЕ политические дискуссии, фотографии профилей с фотографиями и все числовые имена пользователей. У Twitter есть все эти данные, а также социальный график, местоположение / IP-адрес, поведение при входе в систему, межпользовательская блокировка, отключение звука и история отчетов, с которыми можно работать. Для них было бы тривиально предсказать, кого я, скорее всего, заблокирую.

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

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

Я ожидаю увидеть другие алгоритмы, которые блокируют социалистические взгляды или другие повороты по этому поводу. Как мы можем использовать пузыри фильтров в Твиттере и при этом получать стабильный запас хорошо написанных историй, которые бросают нам вызов?
Звучит как работа для другого алгоритма 🤔