Emil25 commited on
Commit
947e9d7
·
1 Parent(s): 57c9990

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +107 -0
app.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import re
3
+
4
+ import torch
5
+ import streamlit as st
6
+ import googleapiclient.discovery
7
+ import pandas as pd
8
+ from transformers import pipeline
9
+ import matplotlib.pyplot as plt
10
+ import seaborn as sns
11
+
12
+
13
+ st.title('Анализатор комментариев :red[YouTube] :sunglasses:')
14
+
15
+ # Получаем YouTube API KEY из secrets
16
+ DEVELOPER_KEY = os.getenv("api_key_youtube")
17
+
18
+ #if not DEVELOPER_KEY:
19
+ # raise RuntimeError('Key is not set. Check your environment variables.')
20
+
21
+
22
+ # Инициализируем модель Hugging Face для анализа тональности текста
23
+ cls_sent = pipeline("sentiment-analysis",
24
+ "blanchefort/rubert-base-cased-sentiment")
25
+
26
+ st.markdown('***')
27
+ st.sidebar.markdown('# Меню')
28
+ st.sidebar.markdown('***')
29
+
30
+ # Получаем id видеоролика из URL для отправки запроса
31
+ pattern = r"(?<=v=)[\w-]+(?=&|\b)"
32
+ url = st.sidebar.text_input('URL YouTube')
33
+ match = re.search(pattern, url)
34
+ if match:
35
+ vidID = match.group()
36
+ st.success('URL', icon="✅")
37
+ else:
38
+ st.warning('URL', icon="⚠️")
39
+ vidID = 'iA6TZESpg3o'
40
+
41
+ st.sidebar.markdown('***')
42
+
43
+ btn_start = st.sidebar.button('Загрузить')
44
+ if btn_start:
45
+ # Запрос к YouTube API для получения комментариев к видео
46
+ api_service_name = "youtube"
47
+ api_version = "v3"
48
+ youtube = googleapiclient.discovery.build(
49
+ api_service_name, api_version, developerKey=DEVELOPER_KEY)
50
+ request = youtube.commentThreads().list(
51
+ part="snippet",
52
+ videoId=vidID,
53
+ maxResults=100
54
+ )
55
+ response = request.execute()
56
+ comments = []
57
+ # Преобразуем полученные комментарии в DataFrame
58
+ for item in response['items']:
59
+ comment = item['snippet']['topLevelComment']['snippet']
60
+ comments.append([
61
+ comment['authorDisplayName'],
62
+ comment['publishedAt'],
63
+ comment['updatedAt'],
64
+ comment['likeCount'],
65
+ comment['textDisplay']
66
+ ])
67
+ comments_df = pd.DataFrame(comments, columns=['author', 'published_at', 'updated_at', 'like_count', 'text'])
68
+
69
+ # Получаем таблицу с комментариями на странице
70
+ st.header('Комментарии из YouTube')
71
+ selected_columns = ['text', 'author', 'published_at']
72
+ comments_df = comments_df[selected_columns]
73
+
74
+ res_list = []
75
+ # Анализируем тональность комментария с помощью модели Hugging Face
76
+ with st.spinner('Идет процесс обработки данных...'):
77
+ res_list = cls_sent(comments_df['text'].to_list())
78
+ s_label = f'Готово! Обработано {len(res_list)} комментариев.'
79
+ st.success(s_label)
80
+
81
+ # Выводим таблицу с результатами на странице
82
+ full_df = pd.concat([pd.DataFrame(res_list), comments_df], axis=1)
83
+ st.write(full_df)
84
+ st.markdown('***')
85
+
86
+ # Выводим heatmap комментариев по часам и датам
87
+ st.header('Комментарии по часам и датам')
88
+ full_df['published_at'] = pd.to_datetime(full_df['published_at'])
89
+ full_df['Date'] = full_df['published_at'].dt.date
90
+ full_df['Hour'] = full_df['published_at'].dt.hour
91
+ pivot_table = full_df.pivot_table(index='Hour', columns='Date', values='text', aggfunc='count')
92
+ plt.figure(figsize=(10, 6))
93
+ sns.heatmap(pivot_table, cmap='YlGnBu')
94
+ plt.title('Количество комментариев по часам и датам')
95
+ plt.xlabel('Дата')
96
+ plt.ylabel('Час')
97
+ st.pyplot(plt)
98
+ st.markdown('***')
99
+
100
+ # Создаем круговую диаграмму
101
+ st.header('Эмоциональная окраска комментариев на YouTube')
102
+ data = full_df['label'].value_counts()
103
+ fig, ax = plt.subplots()
104
+ plt.title("Эмоциональная окраска комментариев на YouTube")
105
+ label = full_df['label'].unique()
106
+ ax.pie(data, labels=label, autopct='%1.1f%%')
107
+ st.pyplot(fig)