Update app.py
Browse files
app.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
from dataclasses import dataclass, field
|
2 |
from typing import List, Optional, Dict, Any
|
3 |
import re
|
@@ -17,7 +18,6 @@ logger = logging.getLogger(__name__)
|
|
17 |
class Comment:
|
18 |
"""
|
19 |
Представляет комментарий Instagram со всеми метаданными и вложенной структурой.
|
20 |
-
|
21 |
Attributes:
|
22 |
id: Уникальный идентификатор комментария
|
23 |
username: Имя пользователя
|
@@ -69,7 +69,6 @@ class InstagramCommentAnalyzer:
|
|
69 |
def __init__(self, max_depth: int = 10, max_comment_length: int = 2200):
|
70 |
"""
|
71 |
Инициализация анализатора с настраиваемыми параметрами.
|
72 |
-
|
73 |
Args:
|
74 |
max_depth: Максимальная глубина вложенности комментариев
|
75 |
max_comment_length: Максимальная длина комментария
|
@@ -88,13 +87,25 @@ class InstagramCommentAnalyzer:
|
|
88 |
'processed_hashtags': 0
|
89 |
}
|
90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
def normalize_text(self, text: str) -> str:
|
92 |
"""
|
93 |
Нормализация входного текста.
|
94 |
-
|
95 |
Args:
|
96 |
text: Исходный текст
|
97 |
-
|
98 |
Returns:
|
99 |
Нормализованный текст
|
100 |
"""
|
@@ -109,7 +120,6 @@ class InstagramCommentAnalyzer:
|
|
109 |
def extract_metadata(self, comment: Comment) -> None:
|
110 |
"""
|
111 |
Извлечение метаданных из комментария.
|
112 |
-
|
113 |
Args:
|
114 |
comment: Объект комментария
|
115 |
"""
|
@@ -127,12 +137,10 @@ class InstagramCommentAnalyzer:
|
|
127 |
def process_comment(self, text: str, parent_id: Optional[str] = None, level: int = 0) -> Optional[Comment]:
|
128 |
"""
|
129 |
Обработка отдельного комментария.
|
130 |
-
|
131 |
Args:
|
132 |
text: Текст комментария
|
133 |
parent_id: ID родительского комментария
|
134 |
level: Уровень вложенности
|
135 |
-
|
136 |
Returns:
|
137 |
Обработанный объект Comment или None
|
138 |
"""
|
@@ -164,6 +172,9 @@ class InstagramCommentAnalyzer:
|
|
164 |
self.stats['truncated_comments'] += 1
|
165 |
comment.content = comment.content[:self.max_comment_length] + "..."
|
166 |
|
|
|
|
|
|
|
167 |
self.extract_metadata(comment)
|
168 |
self.stats['total_comments'] += 1
|
169 |
return comment
|
@@ -182,11 +193,9 @@ class InstagramCommentAnalyzer:
|
|
182 |
def format_comment(self, comment: Comment, index: int) -> str:
|
183 |
"""
|
184 |
Форматирование комментария для вывода.
|
185 |
-
|
186 |
Args:
|
187 |
comment: Объект комментария
|
188 |
index: Номер комментария
|
189 |
-
|
190 |
Returns:
|
191 |
Отформатированная строка комментария
|
192 |
"""
|
@@ -195,16 +204,14 @@ class InstagramCommentAnalyzer:
|
|
195 |
|
196 |
return (
|
197 |
f'{index}. "{comment.username}" "{comment.time}" '
|
198 |
-
f'"{comment.content}" "Нравится {comment.likes}"'
|
199 |
)
|
200 |
|
201 |
def process_comments(self, text: str) -> List[str]:
|
202 |
"""
|
203 |
Обработка всех комментариев в тексте.
|
204 |
-
|
205 |
Args:
|
206 |
text: Исходный текст с комментариями
|
207 |
-
|
208 |
Returns:
|
209 |
Список отформатированных комментариев
|
210 |
"""
|
@@ -234,28 +241,15 @@ def main():
|
|
234 |
Пример использования анализатора.
|
235 |
"""
|
236 |
# Пример входного текста
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
"""
|
241 |
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
results = analyzer.process_comments(input_text)
|
247 |
-
|
248 |
-
# Вывод результатов
|
249 |
-
print("\nОбработанные комментарии:")
|
250 |
-
print("-" * 50)
|
251 |
-
for result in results:
|
252 |
-
print(result)
|
253 |
-
|
254 |
-
# Вывод статистики
|
255 |
-
print("\nСтатистика обработки:")
|
256 |
-
print("-" * 50)
|
257 |
-
for key, value in analyzer.stats.items():
|
258 |
-
print(f"{key}: {value}")
|
259 |
|
260 |
if __name__ == "__main__":
|
261 |
main()
|
|
|
1 |
+
from transformers import pipeline
|
2 |
from dataclasses import dataclass, field
|
3 |
from typing import List, Optional, Dict, Any
|
4 |
import re
|
|
|
18 |
class Comment:
|
19 |
"""
|
20 |
Представляет комментарий Instagram со всеми метаданными и вложенной структурой.
|
|
|
21 |
Attributes:
|
22 |
id: Уникальный идентификатор комментария
|
23 |
username: Имя пользователя
|
|
|
69 |
def __init__(self, max_depth: int = 10, max_comment_length: int = 2200):
|
70 |
"""
|
71 |
Инициализация анализатора с настраиваемыми параметрами.
|
|
|
72 |
Args:
|
73 |
max_depth: Максимальная глубина вложенности комментариев
|
74 |
max_comment_length: Максимальная длина комментария
|
|
|
87 |
'processed_hashtags': 0
|
88 |
}
|
89 |
|
90 |
+
# Инициализация модели Hugging Face для анализа настроений
|
91 |
+
self.sentiment_analyzer = pipeline("sentiment-analysis")
|
92 |
+
|
93 |
+
def analyze_sentiment(self, text: str) -> str:
|
94 |
+
"""
|
95 |
+
Анализ настроений в комментарии с использованием модели Hugging Face.
|
96 |
+
Args:
|
97 |
+
text: Текст комментария
|
98 |
+
Returns:
|
99 |
+
Строка с меткой настроения ('POSITIVE' или 'NEGATIVE')
|
100 |
+
"""
|
101 |
+
result = self.sentiment_analyzer(text)
|
102 |
+
return result[0]['label']
|
103 |
+
|
104 |
def normalize_text(self, text: str) -> str:
|
105 |
"""
|
106 |
Нормализация входного текста.
|
|
|
107 |
Args:
|
108 |
text: Исходный текст
|
|
|
109 |
Returns:
|
110 |
Нормализованный текст
|
111 |
"""
|
|
|
120 |
def extract_metadata(self, comment: Comment) -> None:
|
121 |
"""
|
122 |
Извлечение метаданных из комментария.
|
|
|
123 |
Args:
|
124 |
comment: Объект комментария
|
125 |
"""
|
|
|
137 |
def process_comment(self, text: str, parent_id: Optional[str] = None, level: int = 0) -> Optional[Comment]:
|
138 |
"""
|
139 |
Обработка отдельного комментария.
|
|
|
140 |
Args:
|
141 |
text: Текст комментария
|
142 |
parent_id: ID родительского комментария
|
143 |
level: Уровень вложенности
|
|
|
144 |
Returns:
|
145 |
Обработанный объект Comment или None
|
146 |
"""
|
|
|
172 |
self.stats['truncated_comments'] += 1
|
173 |
comment.content = comment.content[:self.max_comment_length] + "..."
|
174 |
|
175 |
+
# Добавление анализа настроений
|
176 |
+
comment.sentiment = self.analyze_sentiment(comment.content)
|
177 |
+
|
178 |
self.extract_metadata(comment)
|
179 |
self.stats['total_comments'] += 1
|
180 |
return comment
|
|
|
193 |
def format_comment(self, comment: Comment, index: int) -> str:
|
194 |
"""
|
195 |
Форматирование комментария для вывода.
|
|
|
196 |
Args:
|
197 |
comment: Объект комментария
|
198 |
index: Номер комментария
|
|
|
199 |
Returns:
|
200 |
Отформатированная строка комментария
|
201 |
"""
|
|
|
204 |
|
205 |
return (
|
206 |
f'{index}. "{comment.username}" "{comment.time}" '
|
207 |
+
f'"{comment.content}" "Нравится {comment.likes}" "Настроение {comment.sentiment}"'
|
208 |
)
|
209 |
|
210 |
def process_comments(self, text: str) -> List[str]:
|
211 |
"""
|
212 |
Обработка всех комментариев в тексте.
|
|
|
213 |
Args:
|
214 |
text: Исходный текст с комментариями
|
|
|
215 |
Returns:
|
216 |
Список отформатированных комментариев
|
217 |
"""
|
|
|
241 |
Пример использования анализатора.
|
242 |
"""
|
243 |
# Пример входного текста
|
244 |
+
example_text = """
|
245 |
+
user1 2 нед. This is a positive comment! Отметки "Нравится": 25
|
246 |
+
user2 3 нед. This is a negative comment! Отметки "Нравится": 5
|
247 |
"""
|
248 |
|
249 |
+
analyzer = InstagramCommentAnalyzer()
|
250 |
+
formatted_comments = analyzer.process_comments(example_text)
|
251 |
+
for formatted_comment in formatted_comments:
|
252 |
+
print(formatted_comment)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
253 |
|
254 |
if __name__ == "__main__":
|
255 |
main()
|