Telegram机器人实现词云统计的完整教程:群聊热词一目了然

本文详细介绍如何为Telegram机器人添加词云统计功能,从创建机器人、收集群聊消息到生成词云并发送,附完整Python代码与扩展建议,帮助你轻松掌握群聊热词分析。

阅读提示建议先浏览文章结构,再按需深入阅读具体段落。

在群组管理中,了解成员最常讨论的话题能有效提升社群运营质量。词云统计通过可视化高频词汇,让群聊热点一目了然。本文将为你的Telegram机器人添加词云统计功能,实现自动收集消息、生成词云并回复图片的完整流程。

一、准备工作:创建Telegram机器人与获取Token

在Telegram中与官方机器“@BotFather”对话,发送/newbot指令,按提示设置机器人昵称和用户名。创建成功后,你会获得一个API Token,格式如123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11,请妥善保存。

二、安装Python依赖库

本教程使用Python编写,需要安装以下库:

  1. python-telegram-bot:与Telegram API交互的官方异步库。
  2. jieba:中文分词库,用于中文词云统计。
  3. wordcloud:生成词云图片。
  4. Pillow:图像处理依赖。

执行命令安装:

pip install python-telegram-bot jieba wordcloud Pillow

三、编写词云统计机器人代码

下面是一个完整的示例机器人,它监听群聊消息并保存文本,当收到/wordcloud指令时生成词云图片发送给群聊。

import re
import io
from collections import Counter
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, MessageHandler, filters
import jieba
from wordcloud import WordCloud

# 按群组ID存储消息
messages_dict = {}

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    chat_id = update.effective_chat.id
    text = update.message.text
    if not text or text.startswith('/'):
        return
    messages_dict.setdefault(chat_id, []).append(text)

async def wordcloud(update: Update, context: ContextTypes.DEFAULT_TYPE):
    chat_id = update.effective_chat.id
    if chat_id not in messages_dict or not messages_dict[chat_id]:
        await update.message.reply_text("还没有足够的消息,先去聊聊天吧~")
        return
    text = ' '.join(messages_dict[chat_id])
    # 中文分词
    words = jieba.cut(text)
    # 简单停用词表,可自定义扩充
    stopwords = {'的', '了', '是', '我', '你', '他', '这', '那', '就', '都', '也', '很', '在', '有', '和', '啊', '吧', '吗', '呢'}
    filtered = [w for w in words if w.strip() and w not in stopwords and len(w) > 1]
    freq = Counter(filtered)
    if not freq:
        await update.message.reply_text("没有统计到有效词语。")
        return
    # 生成词云图片
    wc = WordCloud(font_path='simhei.ttf', width=800, height=600, background_color='white')
    wc.generate_from_frequencies(freq)
    img = wc.to_image()
    buf = io.BytesIO()
    img.save(buf, format='PNG')
    buf.seek(0)
    await update.message.reply_photo(photo=buf, caption="群聊词云统计")
    messages_dict[chat_id].clear()

if __name__ == '__main__':
    app = ApplicationBuilder().token("YOUR_TOKEN").build()
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
    app.add_handler(CommandHandler('wordcloud', wordcloud))
    print("Bot running...")
    app.run_polling()

注意:请将YOUR_TOKEN替换为你的机器人Token。代码中的simhei.ttf是黑体字体文件,用于词云显示中文,需提前下载并放置在脚本同目录下(或指定系统字体路径)。

四、运行机器人并测试

保存代码为wordcloud_bot.py,在终端执行python wordcloud_bot.py启动机器人。将机器人加入群聊并设置为管理员(建议),然后让群成员发送一些消息。当消息积累到一定数量后,在群里输入/wordcloud,机器人就会生成词云图片并发送。

五、扩展与优化建议

  • 定时生成:使用JobQueue实现每日固定时间自动生成词云,无需手动触发。
  • 停用词优化:针对行业或群聊主题定制停用词表,提高统计准确性。
  • 多群组支持:上述代码已按chat_id区分,可同时服务于多个群组。
  • 隐私保护:建议在统计后自动清除消息记录,避免存储过多个人数据。
  • 性能提升:若群聊消息量极大,可改用数据库存储消息,并异步处理分词与图片生成。

总结

通过以上步骤,你已成功为Telegram机器人添加词云统计功能。这不仅让群聊热点可视化,还能为内容策划和用户运营提供数据支持。你可以在此基础上继续扩展,比如生成词频趋势、导出分析报告等。现在就动手打造你的专属群聊分析助手吧!

FAQ

Telegram官方客户端选择

常见问题

词云统计支持中文吗?

支持。本教程使用了jieba分词库进行中文分词,并指定中文字体(如simhei.ttf)生成词云,确保中文显示正常。

如何让机器人只统计特定聊天的消息?

代码中已按chat_id区分存储,每个群组独立统计。你可以在handle_message中增加判断,只处理指定的chat_id列表。

生成的词云中出现了无意义的词语怎么办?

你可以在代码中扩充stopwords停用词表,过滤更多无意义的虚词、语气词或特定专有词。也可以使用wordcloud的max_words参数限制显示词数。

机器人重启后消息记录会丢失吗?

是的,当前消息存储在内存中,重启即清空。如需持久化,可将消息保存到SQLite或Redis等数据库,并在启动时加载。