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

TL;DR: смотрите репо здесь!

Фон

Лично я являюсь давним пользователем популярной «Главной страницы Интернета», также известной как Reddit.com. Что мне больше всего нравится на этом веб-сайте, так это огромный объем мыслей и мнений по любому вообразимому вопросу. Когда я изучал философию в бакалавриате, я проводил немало времени в субреддите r/AskPhilosophy, где люди могут задавать вопросы о теории и практике философия сквозь время и школы мысли. Я часто задавался вопросом, есть ли что-то уникальное в типе дискурса, происходящего здесь, в сабреддите r/askphilosophy, учитывая природу предмета. Дают ли теории надлежащее обоснование? Какие установки представлены в заданных здесь вопросах? Самое главное, можно ли отличить этот дискурс от простого умозрения?

Отвечая на эти вопросы, я решил проверить, могут ли алгоритмы машинного обучения, ориентированные на анализ текста, определить, принадлежит ли сообщение r/AskPhilosophy или r/Conspiracy, используя последний сабреддит в качестве замены для таких «простых предположений». Конечно, такое предположение будет упрощением, поэтому результаты следует воспринимать с долей скептицизма.

Обзор проекта

Этот проект по науке о данных был направлен на классификацию новых сообщений на Reddit как принадлежащих либо r/Conspiracy, либо r/AskPhilosophy путем анализа 3 и 4-грамм (последовательности из 3–4 слов) частоты в основном тексте сообщений, а также частоты отдельных слов в заголовках сообщений в каждом сабреддите.

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

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

Для проекта я создал и сравнил множество алгоритмов машинного обучения: машину опорных векторов, AdaBoost и деревья с градиентным усилением, случайный лес и алгоритм полиномиального наивного Байеса, чтобы разработать наилучшую доступную модель классификации. Модели оценивались с использованием точности, F1, полноты и точности.

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

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

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

Последняя используемая модель — это машина опорных векторов, использующая реализацию ядра сигмовидной формы, значение C (обратная регуляризация), равное 11,22, и параметр гаммы по умолчанию (1/n_features), что в нашем случае эквивалентно 1/4012.

Общая точность этой модели составила примерно 90 % с чувствительностью 93 % к классу Conspiracy, метрика, которая подтолкнула меня к выбору этой модели, а не столь же сильной полиномиальной наивной байесовской модели. SVM также добился звездной оценки AUC 0,93 и оценки F1 89%.

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

Сбор данных

Данные были собраны с помощью Pushshift, бесплатного API Python с открытым исходным кодом для Reddit. Текстовые материалы были собраны из сообщений, размещенных в сабреддитах r/Conspiracy и r/AskPhilosophy в прошлом году.

Хотя Pushshift предоставляет пользователям до 100 функций для каждого сообщения, я исключил все функции, кроме основного текста сообщения (называемого selftext) и текста заголовка. Я решил сделать это, потому что узкая область исследования касается только языка, используемого в каждом сабреддите, а не обязательно всего остального, что идет с конкретным постом.

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

Обработка естественного языка

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

Текстовый шум бывает разных форм, но *стоп-слова* (распространенные слова, такие как «и» или «the», которые несут небольшую информационную ценность) и нечастые слова пришлось удалить. Кроме того, я удалил такие слова, как «Википедия» и «https», «www», «com», так как хотел, чтобы модель больше фокусировалась на «значении» текста или, скорее, на структуре, понимаемой через общие частоты слов. Таким образом, артефакты сети, такие как эти внешние ссылки, необходимо очистить.

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

Например, «бег», «бег» и «ран» будут образованы от «бег», что упростит для модели выявление шаблонов в использовании языка.

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

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

Полная функция предварительной обработки показана ниже:

def preprocess(df):
    
    # Tokenize, remove stopwords, lemmatize, and stem
    text_cols = ['selftext', 'title']
    df[text_cols] = (df[text_cols]
                        .applymap(tokenize)
                        .applymap(remove_stopwords)
                        .applymap(lem)
                        .applymap(stem)
                        .applymap(remove_target_stems)  # 
                    )

    # Vectorize selftext for 3-4 grams
    stvec = CountVectorizer(stop_words='english',max_features=2000, ngram_range=(3,4))
    stvec_df = pd.DataFrame(
                    stvec.fit_transform(df['selftext']).todense(),
                    columns=stvec.get_feature_names_out()
                )
    
    # Vectorize title for 1-grams
    tivec = CountVectorizer(stop_words='english',max_features=2000, ngram_range=(1,1))
    tivec_df = pd.DataFrame(
                    tivec.fit_transform(df['title']).todense(),
                    columns=tivec.get_feature_names_out()
                )
    
    # Concatenate vectorized dataframes
    df = pd.concat([df, stvec_df, tivec_df], axis=1)
    
    # Add sentiment scores
    for col in text_cols:
        df = add_sentiment(df, col)
    
    return df

Примечание. Здесь используется несколько функций, которые можно найти в исходном коде.

Исследовательский анализ

Мое исследование собранного набора данных показало, что оценки тональности, длина поста/заголовка и количество слов были примерно одинаковыми для всех классов. Сообщения r/Conspiracy, как правило, имели более негативный подтекст, а сообщения r/Philosophy, как правило, получали более высокие баллы по составному (сочетанию положительных, нейтральных и отрицательных оценок), но это были незначительные различия.

Кроме того, вышеупомянутые функции очень мало коррелировали с целевым классом.

Наиболее интересным в исследовательском анализе было количество слов и n-грамм (n = 3, 4) для каждого субреддита.

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

1. Распределение длины постов и количества слов очень похоже по классам, но мы видим, что конспирология является нашим классом большинства с большим отрывом.

2. Одним из примечательных результатов является то, что конспирология имеет более высокую концентрацию постов с очень небольшим количеством (от 0 до ~ 25) слов.

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

4. Средние баллы настроений также очень похожи между классами, но мы видим, что конспирология имеет более высокую концентрацию нейтральных баллов настроений. r/Philosophy имел более высокий средний балл по сложному составу.

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

Моделирование

Базовый уровень

Прогнозирование класса большинства, r/Conspiracy, для всех постов дало точность примерно 64%. Повышение точности измеряется от этого базового уровня.

Руководство по оценке

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

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

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

Мы также будем использовать кривую ROC, чтобы визуализировать компромисс между истинной положительной скоростью и ложноположительной скоростью.

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

Модель 1: метод опорных векторов

Лучшим SVM, найденным после настройки гиперпараметров, была реализация сигмовидного ядра со значением C (обратная регуляризация) 11,22 и параметром gamma = 1/n_features (gamma = ‘auto), что эквивалентно 1/4012 в нашем случае.

Модель SVM достигла общей точности 89%, что означает, что она правильно классифицировала 89% сообщений в тестовом наборе данных.

Глядя на показатели точности, мы видим, что модель правильно предсказала публикации r/AskPhilosophy в 87% случаев, а r/Conspiracy — в 89% случаев.

Напомним, что модель правильно идентифицировала 80% постов r/AskPhilosophy, указывая на то, что она была верна только тогда, когда предсказывала пост как относящийся к «Ask Philosophy» 4/5 раз. С другой стороны, модель имеет 20% ложноотрицательных результатов при прогнозировании класса r/AskPhilosophy.

С другой стороны, модель добилась впечатляющих 93% отзывов на постах r/Conspiracy. Исходя из этого, мы бы сказали, что модель более чувствительна к сообщениям r/Conspiracy, чем к сообщениям r/AskPhilosophy.

Наконец, баллы F1 составляют 83% для r/AskPhilosophy и 91% для r/Conspiracy.

Таким образом, модель, похоже, работает хорошо, с высокой точностью и оценкой отзыва для обоих субреддитов, а также с общей точностью 89%. Средневзвешенное значение точности и полноты (оценка F1) также высокое для обоих классов, что указывает на то, что модель хорошо работает как с точки зрения точности, так и полноты.

Модель 2: мультиномиальный наивный байесовский алгоритм

Эта модель имеет общую точность 89%, что соответствует модели SVM. Оценка отзыва выше для AskPhilosophy, но ниже для Conspiracy. Оценки F1 аналогичны, с небольшим преимуществом по сравнению с моделью NB.

Производственная модель

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

Выводы и заключительные замечания

После анализа онлайн-дискурса в двух разных сабреддитах, r/AskPhilosophy и r/Conspiracy, с помощью обработки естественного языка и алгоритмов машинного обучения, стало ясно, что в языке, используемом этими сообществами, есть существенные различия. Проект успешно продемонстрировал потенциал использования методов науки о данных для классификации сообщений в Reddit на основе их языка, и результаты могут быть полезны модераторам и исследователям в этих сабреддитах. Определяя тенденции использования языка, модераторы могут легче выявлять сообщения, не относящиеся к теме или нарушающие правила, в то время как исследователи могут получить представление о типах аргументационных структур, используемых для защиты идей в Интернете.

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

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