Проект неконтролируемого обучения с использованием НЛП; Анализ настроений и тематическое моделирование

Предупреждение: нецензурная лексика приведена ниже

Этим летом в Metis NYC мы изучаем обработку естественного языка, тематическое моделирование и анализ настроений. Учитывая тревожное количество недавних событий, я решил изучить язык вражды и антисемитские высказывания на Reddit.

Извлечение данных

После некоторого времени поэкспериментировав и изучив API Reddit и оболочку python PRAW, я узнал о pushshift.io. На сайте pushshift.io, основанном пользователем reddit stuck_in_the_matrix, есть миллиарды комментариев, которые исследователи могут запросить. У них также есть собственный API, а также таблицы комментариев и представлений в облаке на Google BigQuery. В конце концов, я остановился на рабочем процессе, в котором я создал запрос в BigQuery, который выводит таблицу, на которую я мог ссылаться из своего экземпляра AWS EC2 для дальнейшего анализа с помощью python.

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

С мая по июнь 2018 года у меня было более 100 тыс. Комментариев, 10 млн слов, охватывающих более 3774 субреддитов. Данные включали ботов, поэтому я исключил всех пользователей, в имени которых есть слово «бот» (также известный как AutoModeratorBot, WikiBot). Это был быстрый и ошибочный метод, но, вероятно, достаточно приличный для этого первого анализа.

Наиболее распространенные субреддиты по количеству комментариев показаны здесь:

Первые три являются очень популярными сабреддитами, поэтому есть смысл увидеть их там. Я не буду ссылаться ни на одну из этих других, но миллион долларов - это сабреддит «сатиры», который, кажется, до абсурдной степени противостоит ПК. CringeAnarchy - это субреддит реддиторов альтернативных правых, которые высмеивают известных людей и проблемы левых либералов. The_Donald является домом для самых яростных сторонников «Дональда».

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

Быстрый отклик - я сделал интересное открытие на канале slack pushshift.io, где я смог выполнить дополнительные запросы по более текущей активности Reddit. Я спросил еврейское оскорбление «жид» и увидел, что сабреддит LA Dodgers был сайтом №1! Как это могло произойти? Я не фанат бейсбола, поэтому для меня стало новостью, что CF Энрике Эрнандес также известен по прозвищу «Кике»!

Предварительная обработка текста

После загрузки данных в фреймворк pandas я выполнил базовую очистку текста:

# set the body (text) of the dataframe to all lowercase
df[‘body’] = df[‘body’].apply(lambda x: x.lower());
# remove common stop words from the same field 
from nltk.corpus import stopwords
stop = stopwords.words('english')
df['body'] = df['body'].apply(lambda x: " ".join(x for x in x.split() if x not in stop));
# remove punctuation from text
df['body'] = df['body'].str.replace('[^\w\s]','');

Это позволило мне выполнить базовый НЛП-анализ комментариев Reddit. Я попытался вырезать и лемматизировать текст, но мои модели не работали очень хорошо после этого шага, поэтому я оставил как есть.

Анализ настроений

Для анализа настроений я обратился к VADER, TextBlob и word2vec. VADER и TextBlob были относительно просты в реализации. Я решил использовать исключительно «полярность» для TextBlob и «составной» для Вейдера. Этот подход игнорирует любую субъективность или относительное использование положительных, отрицательных или нейтральных знаков или фраз. Обе оценки хранятся в виде чисел с плавающей запятой и варьируются от -1 (наиболее отрицательное значение) до +1 (наиболее положительное значение). Почти все комментарии имеют нейтральный рейтинг, но, поскольку мы хотим «разжигания ненависти», мы сосредоточимся на отрицательных комментариях из обеих библиотек.

# TextBlob -- parse text for score and create new column in df
from textblob import TextBlob
def sentiment_finder_partial(comment):
 analysis = TextBlob(comment)
 return analysis.sentiment.polarity
df['SA_p'] = np.array([ sentiment_finder_partial(comment) for comment in df['body']])
# VADER -- same. Use 'compound' instead of 'polarity' though. 
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
analyser = SentimentIntensityAnalyzer()
def sentiment_finder_vader(comment):
    analysis = analyser.polarity_scores(comment)
    return analysis['compound']
df['Vader'] = np.array([ sentiment_finder_vader(comment) for comment in df['body'] ])

Я не использовал word2vec так часто, как мне хотелось бы. Это определенно похоже на мощную интеллектуальную библиотеку. При просмотре «самых похожих слов» с использованием ключевого слова «сионист» word2vec вернуло:

w = 'zionist'
model.wv.most_similar (positive = w)
[('zionists', 0.6999108791351318),
 ('neocon', 0.5981375575065613),
 ('zionism', 0.555126965045929),
 ('zog', 0.5072057247161865),
 ('settler', 0.4846901595592499),
 ('isreali', 0.47860807180404663),
 ('stooge', 0.4716537594795227),
 ('zionistic', 0.4544820487499237),
 ('colonialist', 0.4532729685306549),
 ('antizionist', 0.4468907415866852)]

Я понятия не имел, что означает слово «зог». Я поискал это, и он используется для обозначения «сионистского оккупационного правительства». Другими словами, «еврейские агенты» проникли в западные государства и правят миром, как в широко опровергнутых и часто цитируемых «Протоколах сионских мудрецов». Этот термин не используется причинно в про / антиизраильских дискуссиях, проводимых разумными людьми, которые не согласны с этим, это термин, используемый людьми, которые хотят сеять ненависть и дезинформацию.

Это подводит меня к выводу, что Word2vec - отличный инструмент для поиска новых терминов, кодов и сленга, используемых для уничижения и клеветы на других. Скорее всего, я буду использовать это в будущих запросах, чтобы расширить сеть потенциальных разжиганий ненависти.

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

Затем я рассмотрел тематическое моделирование. Я пробовал здесь несколько методов и параметров. В конце концов, настройки по умолчанию с использованием sklearn CountVectorizer и разложения NMF дали наиболее интересные результаты. Эти три темы, кажется, разбивают наблюдаемые слова на логические концептуальные группы.

hate speech:['people', 'said', 'kike', 'white', 'black', 'like', 'think', 'want', 'racist', 'jewish']
religion:['god', 'jesus', 'christ', 'one', 'believe', 'life', 'lord', 'bible', 'man', 'gods']
israel:['jews', 'israel', 'jewish', 'palestinians', 'land', 'state', 'israeli', 'palestine', 'arab', 'arabs']

Рассматривая эти темы с течением времени, мы видим, что большинство комментариев относится к теме «Израиль», что, скорее всего, и имеет место в действительности. Израиль - невероятно противоречивая тема в целом ряде субреддитов.

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

Scattertext!

Scattertext - невероятно крутая библиотека для визуализации разницы в частоте терминов между двумя документами. На рисунке выше я использую инструмент для сравнения r / worldnews с r / worldpolitics. Вы можете видеть, что в правом нижнем углу графика мы часто видим такие термины мировой политики, как жиды, гои и сионази. r / worldpolitics - это фактически полностью немодерируемая и не прошедшая цензуру версия r / worldnews, так что это не так уж удивительно. Вполне вероятно, что люди, которые публикуют комментарии, которые я пометил как потенциально разжигающие ненависть, И регулярно публикуют сообщения в r / worldpolitics, являются законными антисемитами. По крайней мере, не выходя из своего безопасного цифрового пространства.

Scattertext позволяет проводить дальнейший анализ самих комментариев. Если вы выполните поиск во всех комментариях по запросу «kike», он появится 0 (с округлением в меньшую сторону) раз в 25 000 документов в основном субреддите r / worldnews. Один из постобработанных текстов находится здесь:

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

Немного сложно читать без игнорируемых слов и знаков препинания. Однако создается впечатление, что этот плакат использует слово «жид» как оскорбление. Это разжигание ненависти, и модераторы r / worldnews должны пометить его.

И наоборот, не прошедшая цензуру r / worldpolitics имеет 13 инцидентов на 25 000 [я подверг цензуре f-слово].

w или kike ответьте на вопрос

когда-либо встречал Джорджа Сороса, знаю жида еврея

заткнись, черт возьми, жидик

невежественный шут, что неудивительно, сионисты, евреи марионетки

Я думаю, что сейчас мы можем сосредоточиться на ненавистнических высказываниях. Термин «еврей» используется 50 раз из 25 000 слов в r / worldnews по сравнению с 87 раз против 25 000 слов. в r / worldpolitics. Опять же, это, кажется, указывает на повышенную озабоченность обсуждением евреев в мировой политике. Важно отметить, что у r / worldpolitics гораздо меньше подписчиков и меньше комментариев, чем у r / worldnews.

ГЛАВНЫЙ ВЫВОД

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

Что, если мы классифицируем плакаты, а не сообщения?

Другими словами, вместо охоты за «языком ненависти» давайте найдем «ораторов ненависти».

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

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

Мы должны сузить область анализа до соответствующего сабреддита. r / policy, r / worldnews и r / The_Donald имеют свои собственные уникальные диалекты и внутренние шутки, и их следует рассматривать как их собственный корпус. Можно использовать более длинный диапазон дат, возможно, с учетом последних комментариев. Word2vec можно использовать для увеличения нашего «списка» потенциально антисемитских терминов.

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