new-space / app.py
boompack's picture
Update app.py
cbff93c verified
raw
history blame
9.02 kB
import gradio as gr
import re
from collections import Counter
from datetime import datetime
import emoji
def clean_text(text):
"""Очищает текст от лишних пробелов и переносов строк"""
return ' '.join(text.split())
def count_emojis(text):
"""Подсчитывает количество эмодзи в тексте"""
return len([c for c in text if c in emoji.EMOJI_DATA])
def extract_mentions(text):
"""Извлекает упоминания пользователей из текста"""
return re.findall(r'@[\w\.]+', text)
def analyze_sentiment(text):
"""Простой анализ тональности по эмодзи и ключевым словам"""
positive_indicators = ['🔥', '❤️', '👍', 'круто', 'супер', 'класс', 'огонь', 'пушка']
negative_indicators = ['👎', '😢', 'плохо', 'ужас']
text_lower = text.lower()
positive_count = sum(1 for ind in positive_indicators if ind in text_lower)
negative_count = sum(1 for ind in negative_indicators if ind in text_lower)
if positive_count > negative_count:
return 'positive'
elif negative_count > positive_count:
return 'negative'
return 'neutral'
def extract_comment_data(comment_text):
"""
Извлекает данные из отдельного комментария
Возвращает (username, comment_text, likes_count, week_number)
"""
# Извлекаем имя пользователя
username_match = re.search(r"Фото профиля ([^\n]+)", comment_text)
if not username_match:
return None, None, 0, 0
username = username_match.group(1).strip()
# Извлекаем текст комментария (теперь без имени пользователя)
comment_pattern = fr"{username}\n(.*?)(?:\d+ нед\.)"
comment_match = re.search(comment_pattern, comment_text, re.DOTALL)
if comment_match:
# Очищаем текст комментария от упоминаний пользователя в начале
comment = clean_text(comment_match.group(1))
comment = re.sub(fr'^{username}\s*', '', comment)
comment = re.sub(r'^@[\w\.]+ ', '', comment) # Удаляем упоминания в начале
else:
comment = ""
# Извлекаем количество недель
week_match = re.search(r'(\d+) нед\.', comment_text)
weeks = int(week_match.group(1)) if week_match else 0
# Ищем количество лайков
likes = 0
likes_patterns = [
r"(\d+) отметк[аи] \"Нравится\"",
r"Нравится: (\d+)",
]
for pattern in likes_patterns:
likes_match = re.search(pattern, comment_text)
if likes_match:
likes = int(likes_match.group(1))
break
return username, comment.strip(), likes, weeks
def analyze_post(content_type, link_to_post, post_likes, post_date, description, comment_count, all_comments):
try:
# Разделяем комментарии по "Фото профиля"
comments_blocks = re.split(r'(?=Фото профиля)', all_comments)
comments_blocks = [block for block in comments_blocks if block.strip()]
# Основные списки для данных
usernames = []
comments = []
likes = []
weeks = []
# Дополнительные метрики
total_emojis = 0
mentions = []
sentiments = []
comment_lengths = []
# Обработка каждого комментария
for block in comments_blocks:
username, comment, like_count, week_number = extract_comment_data(block)
if username and comment:
usernames.append(username)
comments.append(comment)
likes.append(str(like_count))
weeks.append(week_number)
# Сбор дополнительных метрик
total_emojis += count_emojis(comment)
mentions.extend(extract_mentions(comment))
sentiments.append(analyze_sentiment(comment))
comment_lengths.append(len(comment))
# Аналитика
total_comments = len(comments)
avg_comment_length = sum(comment_lengths) / total_comments if comment_lengths else 0
sentiment_distribution = Counter(sentiments)
most_active_users = Counter(usernames).most_common(5)
most_mentioned = Counter(mentions).most_common(5)
avg_likes = sum(map(int, likes)) / len(likes) if likes else 0
earliest_week = max(weeks) if weeks else 0
latest_week = min(weeks) if weeks else 0
# Формируем выходные данные
usernames_output = "\n".join(usernames)
comments_output = "\n".join(comments)
likes_chronology_output = "\n".join(likes)
total_likes_sum = sum(map(int, likes))
# Подробная аналитика
analytics_summary = (
f"Content Type: {content_type}\n"
f"Link to Post: {link_to_post}\n\n"
f"ОСНОВНАЯ СТАТИСТИКА:\n"
f"- Всего комментариев: {total_comments}\n"
f"- Всего лайков на комментариях: {total_likes_sum}\n"
f"- Среднее количество лайков: {avg_likes:.1f}\n"
f"- Период активности: {earliest_week}-{latest_week} недель\n\n"
f"АНАЛИЗ КОНТЕНТА:\n"
f"- Средняя длина комментария: {avg_comment_length:.1f} символов\n"
f"- Всего эмодзи использовано: {total_emojis}\n"
f"- Тональность комментариев:\n"
f" * Позитивных: {sentiment_distribution['positive']}\n"
f" * Нейтральных: {sentiment_distribution['neutral']}\n"
f" * Негативных: {sentiment_distribution['negative']}\n\n"
f"АКТИВНОСТЬ ПОЛЬЗОВАТЕЛЕЙ:\n"
f"Самые активные комментаторы:\n"
+ "\n".join([f"- {user}: {count} комментариев" for user, count in most_active_users]) + "\n\n"
f"Самые упоминаемые пользователи:\n"
+ "\n".join([f"- {user}: {count} упоминаний" for user, count in most_mentioned if user]) + "\n\n"
f"ВОВЛЕЧЕННОСТЬ:\n"
f"- Процент комментариев с лайками: {(sum(1 for l in likes if int(l) > 0) / total_comments * 100):.1f}%\n"
f"- Процент комментариев с эмодзи: {(sum(1 for c in comments if count_emojis(c) > 0) / total_comments * 100):.1f}%\n"
)
return analytics_summary, usernames_output, comments_output, likes_chronology_output, str(total_likes_sum)
except Exception as e:
error_message = f"Произошла ошибка при обработке: {str(e)}\n{str(type(e))}"
return error_message, error_message, error_message, error_message, "0"
# Создаем интерфейс Gradio
iface = gr.Interface(
fn=analyze_post,
inputs=[
gr.Radio(
choices=["Photo", "Video"],
label="Content Type",
value="Photo"
),
gr.Textbox(
label="Link to Post",
placeholder="Введите ссылку на пост"
),
gr.Number(
label="Likes",
value=0
),
gr.Textbox(
label="Post Date",
placeholder="Введите дату публикации"
),
gr.Textbox(
label="Description",
placeholder="Введите описание поста",
lines=3
),
gr.Number(
label="Total Comment Count",
value=0
),
gr.Textbox(
label="All Comments",
placeholder="Вставьте комментарии",
lines=10
)
],
outputs=[
gr.Textbox(label="Analytics Summary", lines=20),
gr.Textbox(label="Usernames (Output 1)", lines=5),
gr.Textbox(label="Comments (Output 2)", lines=5),
gr.Textbox(label="Likes Chronology (Output 3)", lines=5),
gr.Textbox(label="Total Likes on Comments (Output 4)")
],
title="Instagram Comment Analyzer Pro",
description="Расширенный анализатор комментариев Instagram с детальной аналитикой"
)
if __name__ == "__main__":
iface.launch()