Анализ дебатов с использованием Data Science: использование комментариев YouTube для определения истинных намерений избирателей

Введение

Я считаю, что Data Science позволяет мне выражать любопытство способами, о которых я даже не догадывался. Самым крутым в Data Science является то, что я рассматриваю данные не как числа, а как возможность (бизнес-проблема), идеи (прогнозное моделирование, статистика и обработка данных) и улучшение (показатели). Помня об этом, я решил проанализировать комментарии вице-президента и президента в ходе дебатов на YouTube.

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

Как и почему

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

Как: для анализа комментариев YouTube мы используем Python и другие различные библиотеки NLP, за которыми следуют некоторые инструменты визуализации данных. Мы будем использовать чудеса потрясающей библиотеки обработки данных, известной как Pandas, и надеемся найти некоторые интересные идеи.

Требования

Для этого проекта нам потребуется:

  • Python 3.8
  • Панды
  • Scikit-Learn
  • Numpy
  • Сиборн
  • НЛТК
  • Wordcloud
  • TextBlob

Создание набора данных

Набор данных содержит комментарии YouTube к наиболее популярным / просматриваемым дебатам вице-президента и президента. Мы используем API данных YouTube для получения всех комментариев (из-за ограничения размера мы получаем только 100 комментариев на видео). Видео были отобраны автором путем тщательного изучения, чтобы быть точным, мы сосредоточились на наибольшем количестве просмотров и наибольшем количестве комментариев на YouTube.

def clean_text(string):
    string = re.sub(r'[^\w\s]', '', string) 
    return ''.join(i for i in string if ord(i) < 128)
def remove_stopwords(string):
    stop_words = set(stopwords.words('english')) 
    word_tokens = word_tokenize(string) 
    filtered_sentence = [w for w in word_tokens if not w in stop_words] 
    filtered_sentence = [] 
  
    for w in word_tokens: 
        if w not in stop_words: 
            filtered_sentence.append(w)
return ' '.join(filtered_sentence)

Эти функции определяют очистку текста и удаление игнорируемых слов.

Извлечение комментариев YouTube

Следующая функция определяет video_ids, которые мы отбрасываем, и некоторый базовый код извлечения. Мы получаем наши данные в форме JSON, затем выполняем предварительную обработку и в конечном итоге объединяем все комментарии, за которыми следует оценка настроения (с использованием TextBlob), в DataFrame.

video_ids = {"vp_debate":['65twkjiwD90','t_G0ia3JOVs','xXE6I3gWiMc'], "prez_debate":[
                                                                         'yW8nIA33-zY','wW1lY5jFNcQ','K8Z9Kqhrh5c']}
video_id = "&videoId="
content = None
def extract_comments(resp):
    """
        Get comments from the resp (json) yt comment
    """
    com = []
    for i in resp['items']:
        com.append(i['snippet']['topLevelComment']['snippet']['textOriginal'].lower())
    return com
def get_videos_comments():
    """
        Extract video comments and store in the arrays
    """
    vp_debate_data = []
    prez_debate_data = []
    for i,j in video_ids.items():
        print("Getting for: ",i)
        for id in j:
            video_id = "&videoId=" + id
            resp = requests.get(URL+video_id)
            
            print("Length: ",len(resp.content))
            content = resp.json()
            comments = extract_comments(content)
            if i == "vp_debate":
                vp_debate_data.extend(comments)
            else:
                prez_debate_data.extend(comments)
    return vp_debate_data, prez_debate_data
class Comment:
    def __init__(self, text):
        self.text = remove_stopwords(clean_text(text))
        # set threshold as 0.5
        self.sentiment = 0 if TextBlob(self.text).sentiment.subjectivity <= 0.5 else 1
    def return_comment(self):
        return self
class DataGenerator:
    def __init__(self, vp_debate_data, prez_debate_data):
        self.vp_data = {"comments":[], "sentiment":[]}
        self.prez_data = {"comments":[], "sentiment":[]}
        for i in vp_debate_data:
            c = Comment(i)
            self.vp_data['comments'].append(c.text)
            self.vp_data['sentiment'].append(c.sentiment)
        for i in prez_debate_data:
            c = Comment(i)
            self.prez_data['comments'].append(c.text)
            self.prez_data['sentiment'].append(c.sentiment)
        self.df_vp = pd.DataFrame(self.vp_data)
        self.df_prez = pd.DataFrame(self.prez_data)
    def return_df(self):
        print("Loaded dataframe.")
        return self.df_vp, self.df_prez
    
    # return corpus given the debate key
    # to be used for getting the commonkeywords and plotting
    def get_corpus(self, key="vp_debate"):
        corpus = []
        if key == "vp_debate":
            corpus = [i for i in self.vp_data['comments']]
        else:
            corpus = [i for i in self.prez_data['comments']]  
        
        return corpus

Анализ

Изучив данные, мы сначала записываем слова в нижний регистр, затем удаляем все знаки препинания, а затем удаляем все игнорируемые слова. Мы используем популярный TextBlob (https://textblob.readthedocs.io/en/dev/) для быстрого анализа настроений.

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

Самые распространенные слова

Мы находим наиболее употребительные слова в каждом из дебатов (например, df_vp и df_prez). Мы используем популярный пакет, известный как NLTK, чтобы получить наиболее распространенные слова (после предварительной обработки)

def most_common(corpus):
    fd = nltk.FreqDist(corpus)
    print(fd)
    fd_t10=fd.most_common(10)
    counter = dict(fd_t10)
    # pd.Dataframe from dict to show bar plot
    df = pd.DataFrame.from_dict(counter, orient='index')
    names, values = zip(*fd_t10)
    # plot method 1
    fd.plot(10)
    # plot method two
    print("Bar Plot")
    df.plot(kind='bar')

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

WordCloud

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

def plot_wordcloud(kind="vp_debate"):
    words = get_word_list(kind)
    wordcloud = WordCloud(width = 800, height = 800, 
                background_color ='white', 
                min_font_size = 10).generate(' '.join(words))
    plt.imshow(wordcloud) 
    plt.axis("off") 
    plt.tight_layout(pad = 0) 
    plt.show()

Поиск ключевых слов: уникальный способ поиска определенных слов.

Эта функция находит указанное ключевое слово (наиболее вероятные 10 первых слов). Он действует на каждое предложение.

def find_keywords(word, df):
    """
        Find the specified keyword (most prob top 10 words)
        Acts on each sentence
        Add to the corresponding dataframe
        Returns: DataFrame
        
        
        Used inconjunction with get_most_common_words()
        
    """
    for i in df.comments:
        if word in i.split():
            c = Counter(i.split())
            if c[word] >= 2:
                print(f'Word is {word} that occured {c[word]} times where sentence is {i}\n')
@interact(keyword="biden", debates=['vp_debate','prez_debate'])
def run(keyword, debates):
    df = None
    if debates == "vp_debate":
        df = df_vp
    else:
        df = df_prez
    find_keywords(keyword,df)

Вывод

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

Попробуйте здесь: https://gesis.mybinder.org/binder/v2/gh/aaditkapoor/DebateAnalysis/mainDataset здесь: http://www.kaggle.com/dataset/43532333d82042a1287e00672b86a2c76e76ffbc4d145569715302