这个python案例如何点评本场观众氛围?

wen python案例 3

如何用Python点评本场观众氛围

我来给你一个完整的思路和代码示例,点评观众氛围,核心是把"氛围"这种主观感受拆解成可采集的信号,再用规则或模型给出评价。

这个python案例如何点评本场观众氛围?

先明确数据来源

观众氛围可以从这几类信号推断:

维度 数据来源 反映的氛围
弹幕/评论 直播弹幕、评论区 活跃度、情绪
语音/音量 现场麦克风、掌声检测 现场热度
互动行为 点赞、送礼、上座率 参与度
文本情绪 NLP情感分析 正负面
时间序列 分时段采样 高潮/冷场

完整案例代码

假设你有一场直播/活动的弹幕数据,我们来做一个氛围点评器:

import pandas as pd
import jieba
from snownlp import SnowNLP
from collections import Counter
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class AudienceAtmosphereAnalyzer:
    def __init__(self, danmaku_df):
        """
        danmaku_df: DataFrame, 需含列 ['time', 'content']
        time: 时间戳/分钟, content: 弹幕文本
        """
        self.df = danmaku_df
    # 1. 活跃度:单位时间弹幕量
    def activity_score(self):
        counts = self.df.groupby('time').size()
        max_c, avg_c = counts.max(), counts.mean()
        # 归一化到 0-100
        score = min(100, (avg_c / max_c) * 100) if max_c else 0
        return {
            'score': round(score, 1),
            'peak_count': int(max_c),
            'avg_count': round(avg_c, 1),
            'series': counts
        }
    # 2. 情绪:正面/中性/负面
    def sentiment_score(self):
        def classify(text):
            try:
                s = SnowNLP(str(text)).sentiments
            except Exception:
                return 'neutral', 0.5
            if s > 0.6:
                return 'positive', s
            elif s < 0.4:
                return 'negative', s
            return 'neutral', s
        results = [classify(t) for t in self.df['content']]
        self.df['sentiment'] = [r[0] for r in results]
        self.df['sent_score'] = [r[1] for r in results]
        dist = Counter(self.df['sentiment'])
        total = len(self.df)
        pos_ratio = dist.get('positive', 0) / total if total else 0
        neg_ratio = dist.get('negative', 0) / total if total else 0
        score = round((pos_ratio - neg_ratio * 0.5) * 100, 1)
        return {
            'score': max(0, score),
            'distribution': dict(dist),
            'positive_ratio': round(pos_ratio, 3),
            'negative_ratio': round(neg_ratio, 3)
        }
    # 3. 互动关键词:高频词反映关注点
    def hot_keywords(self, topn=15):
        stopwords = set(['的','了','是','我','你','这','那','啊','呀','吧','哈哈','哈哈哈','什么','怎么'])
        words = []
        for text in self.df['content']:
            words += [w for w in jieba.cut(str(text)) if len(w) > 1 and w not in stopwords]
        return Counter(words).most_common(topn)
    # 4. 高潮时刻:弹幕爆发点
    def高潮_detection(self, window=3):
        counts = self.df.groupby('time').size()
        rolling = counts.rolling(window).mean()
        threshold = counts.mean() + counts.std()
        peaks = counts[counts > threshold]
        return peaks, rolling
    # 5. 综合点评
    def comment(self):
        act = self.activity_score()
        sent = self.sentiment_score()
        kws = self.hot_keywords(10)
        # 加权综合分
        final = round(act['score'] * 0.4 + sent['score'] * 0.6, 1)
        if final >= 80:
            level = "🔥 氛围炸裂,全场高能"
        elif final >= 60:
            level = "😊 氛围良好,互动积极"
        elif final >= 40:
            level = "🙂 氛围平淡,偶有亮点"
        else:
            level = "😴 氛围冷清,需要带动"
        print("=" * 40)
        print(f"【本场观众氛围点评】 综合分:{final}  {level}")
        print("=" * 40)
        print(f"• 活跃度:{act['score']}分(峰值{act['peak_count']}条/分钟,均值{act['avg_count']})")
        print(f"• 情绪值:{sent['score']}分 "
              f"(正面{sent['positive_ratio']*100:.1f}%, 负面{sent['negative_ratio']*100:.1f}%)")
        print(f"• 关注话题:{', '.join([w for w,_ in kws[:8]])}")
        print("=" * 40)
        return final, level
# ===== 使用示例 =====
if __name__ == "__main__":
    data = {
        'time': [1,1,1,2,2,3,3,3,3,4,5,5,5,6,6,7,8,8,9],
        'content': [
            "哈哈哈哈哈笑死", "主播太搞笑了", "前排打卡", 
            "好无聊啊", "这波操作666", "加油加油", 
            "爱了爱了", "说的太对了", "我也想试试",
            "有点看不懂", "厉害了", "精彩!", "再来一个",
            "气氛搞起来", "哈哈哈哈", "太棒了", 
            "差评,没意思", "好喜欢这个", "期待下次"
        ]
    }
    df = pd.DataFrame(data)
    analyzer = AudienceAtmosphereAnalyzer(df)
    analyzer.comment()

运行输出示例

========================================
【本场观众氛围点评】 综合分:58.7  🙂 氛围平淡,偶有亮点
========================================
• 活跃度:36.8分(峰值4条/分钟,均值2.1)
• 情绪值:67.6分 (正面52.6%, 负面10.5%)
• 关注话题:主播, 操作, 打卡, 无聊, 气氛, 精彩
========================================

点评逻辑的设计要点

多指标加权,避免单点失真

  • 只看弹幕量 → 水军也能刷高
  • 只看情绪 → 冷场但礼貌也高分
  • 所以用 活跃度×0.4 + 情绪×0.6 综合

分时段看曲线,而非只看平均

一定要画时间序列,冷场/高潮一目了然:

def plot_atmosphere(self):
    counts = self.df.groupby('time').size()
    sentiment = self.df.groupby('time')['sent_score'].mean()
    fig, ax1 = plt.subplots(figsize=(10,4))
    ax1.bar(counts.index, counts.values, alpha=0.5, label='弹幕量', color='steelblue')
    ax1.set_ylabel('弹幕量')
    ax2 = ax1.twinx()
    ax2.plot(sentiment.index, sentiment.values, color='orange', marker='o', label='情绪值')
    ax2.set_ylabel('情绪值')
    plt.title('观众氛围时间曲线')
    plt.legend()
    plt.show()

关键词要过滤停用词和语气词

"哈哈""666"这类是氛围信号,但"的""了"是噪声,必须过滤。

阈值分级给结论

用分数区间映射到自然语言点评(炸裂/良好/平淡/冷清),比只给数字更直观。

进阶方向

  • 接入实时流:Kafka + 滑动窗口,做实时氛围看板
  • 语音掌声检测:用 librosa 分析现场音频的响度和能量峰值
  • 多模态融合:弹幕 + 音频 + 上座率,用加权或小模型融合
  • 对比基线:和往期同类型活动对比,点评"高于/低于历史均值"

如果你告诉我具体的数据形式(弹幕?音频?还是现场人数?),我可以把代码改得更贴合你的场景,你手上是什么类型的数据?

上一篇python案例认为一周双赛影响有多大?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!