首页/新闻资讯/正文详情

离线QQ群机器人:TextRank+本地词向量实现每日智能总结

发布时间:2026/9/26 7:12:24 来源:云帆数科 栏目:资讯中心
离线QQ群机器人:TextRank+本地词向量实现每日智能总结
简介这是一份面向Python开发者与AI初学者的智能社交工具实践项目基于Nonebot框架实现QQ群聊天记录的自动化分析与每日总结生成融合机器学习文本处理技术解决群信息过载问题。资源包共28个文件含18个核心Python脚本如bot.py、MyTextRankDemo.py、各类Utils工具模块、3个说明类txt文件、3张界面/流程图png、1个配置json、1份PDF算法文档TextRank原理、1个license和1个README.md整体2.05MB结构清晰便于按功能模块快速定位代码与文档。已有274人学习下载提供从聊天数据采集、文本预处理去噪/分词/停用词过滤、TF-IDF关键词提取、TextRank主题建模到模板化总结生成的完整实现链路附带JetBrains主题配图与Mirai适配说明可直接部署调试或作为NLPBot工程教学范例。1. 这不是又一个“发个表情包”的QQ群机器人它用TextRank本地词向量每天凌晨自动生成带关键词云、情绪倾向和话题聚类的群聊总结不调API、不联网、纯离线运行你试过让机器人在凌晨2点准时发一条消息“今日群聊共387条高频词‘作业’42次、‘deadline’29次、‘Python’23次情绪偏焦虑负面占比68%三大话题簇【课程答疑】【毕设进度】【实习内推】——附TOP5发言摘要”这不是Demo也不是PPT里的效果图而是这个基于Nonebot的QQ群机器人真实跑起来的样子。它不依赖任何云端NLP服务所有文本分析、关键词提取、情绪打分、摘要生成全部在本地完成核心算法不是调用jiebaTF-IDF凑数而是实打实跑通了TextRank变体见项目里TextRank-algorithm.pdf和MyTextRankDemo.py并用gensim训练了群聊专属的轻量级词向量模型ml/NetUtils.py里封装了增量训练逻辑。适合高校实验室群、技术交流群、考研互助群这类有稳定文本产出、但对隐私敏感、拒绝数据上云的场景。如果你正在找一个能真正落地、可审计、可复现、且代码结构清晰到能当教学案例的机器学习Bot实战项目——它就是那个被压缩包名字耽误了的“冷门宝藏”。2. 从零部署解压→装依赖→配账号→跑通第一条总结四步闭环验证是否真能离线工作2.1 解压与目录结构确认别跳过这一步zip里藏着关键路径约束unzip 基于Nonebot的QQ群机器人特色功能是利用机器学习算法基于每日聊天记录生成每日总结.zip cd FG-mirai/ ls -R提示解压后必须进入FG-mirai/目录操作这是Nonebot配置文件config.py和主入口bot.py的根路径。项目未使用标准nonebot init模板而是手动组织了assets/存放词典、停用词表、ml/机器学习模块、utils/工具函数三层结构。assets/下的01.png和02.png是生成总结时嵌入的关键词云图和情绪分布图模板jetbrains-variant-2.png是README里展示的UI效果示意——它们不是占位图而是实际绘图脚本ml/NetUtils.py中draw_wordcloud()函数的默认底图资源。2.2 依赖安装requirements.txt 有坑必须手动补两个关键包pip install -r requirements.txt pip install jieba numpy pandas scikit-learn gensim matplotlib wordcloud参数说明requirements.txt仅列出了nonebot2,nonebot-adapter-onebot,httpx,pydantic等框架依赖漏掉了全部NLP和绘图依赖jieba必须 ≥ 0.42.1低版本不支持cut_for_search()而ConversionUtils.py中关键词扩展依赖此方法gensim必须 4.3.2高版本KeyedVectors.load_word2vec_format()接口变更NetUtils.py第127行会报TypeError: load_word2vec_format() got an unexpected keyword argument binarywordcloud必须 ≥ 1.9.2否则draw_wordcloud()中font_path参数不生效中文显示为方块。2.3 账号配置Mirai适配器要求严格config.py 三处必须改打开config.py修改以下三处其他字段可保持默认# config.py 第12行Mirai HTTP API 地址必须是你本地已运行的 Mirai 实例 HOST http://127.0.0.1:8080 # config.py 第18行你的QQ号机器人账号非管理员号 BOT_ID 123456789 # ← 替换为你的QQ号 # config.py 第25行Mirai 的认证密钥在 Mirai 控制台生成不是QQ密码 VERIFY_KEY your_verify_key_here # ← 替换为 Mirai 后台生成的 verifyKey逻辑说明Nonebot 本身不处理QQ协议它通过nonebot-adapter-onebot适配器与 Mirai 通信。Mirai 是一个独立的Java进程需提前下载、配置、启动官方GitHubmamoe/mirai。HOST必须指向 Mirai 的HTTP监听地址BOT_ID是Mirai中已添加的机器人QQ号VERIFY_KEY是Mirai启动时生成的密钥用于鉴权。若此处填错bot.py 启动后会卡在Connecting to OneBot...且无任何错误日志——这是新手最常卡住的环节。2.4 首次运行与验证用--debug启动看日志是否出现 “Summary generated for group XXX”nonebot run bot:app --debug观察终端输出成功标志是出现INFO | nonebot | Bot 123456789 connected群消息触发后如在群内发/summary出现INFO | ml.MyTextRankDemo | Loading group chat history from database...最终输出INFO | ml.NetUtils | Summary saved to assets/summary_20240520.png并在assets/目录下生成summary_YYYYMMDD.png图片文件验证技巧若无响应先检查 Mirai 是否运行curl http://127.0.0.1:8080/status应返回JSON再检查bot.py第37行on_command(summary)是否被正确注册日志中应有Loaded command: summary最后确认IOUtils.py中get_group_history()函数是否能正常拉取历史消息该函数依赖 Mirai 的/messageHistory接口需确保 Mirai 已开启历史消息权限。3. 核心算法拆解TextRank 不是黑匣子它的权重计算、迭代收敛、关键词筛选全在 MyTextRankDemo.py 里手写实现3.1 TextRank 原理精简版为什么不用TF-IDF因为群聊文本太短、噪声太大传统TF-IDF在群聊场景失效单条消息平均12字整日300条也才3600字大量重复词“收到”、“好的”、“”拉低IDF值导致“作业”、“实验”等真实关键词排名靠后。TextRank把文本建模为图每个词是节点共现关系窗口大小5是边边权重共现频次。然后用PageRank思想迭代计算节点重要性得分。项目中MyTextRankDemo.py的build_graph()函数明确实现了分词用jieba.lcut() 自定义停用词表assets/stopwords.txt共现窗口滑动时跳过标点、emoji、URLJsonUtils.py中clean_text()预处理边权重归一化为1 / distance距离越近权重越高而非简单计数参数说明damping_factor0.85标准PageRank衰减系数max_iter100最大迭代次数tol1e-4收敛阈值。这些值在MyTextRankDemo.py第89行textrank()函数中硬编码若群聊话题极分散如同时讨论考研、实习、游戏建议将max_iter提至200tol放宽至1e-3否则可能提前终止导致关键词覆盖不全。3.2 关键词到摘要的跃迁不是拼接而是基于词向量相似度的句子重排序MyTextRankDemo.py的generate_summary()函数执行三步提取Top-K关键词从TextRank得分排序中取前15词top_k15可调召回相关句子遍历当日所有消息计算每句与关键词集的余弦相似度用NetUtils.py中训练好的词向量重排序输出按相似度降序排列取前5句再按原始时间戳微调顺序避免“结论”出现在“问题”之前# MyTextRankDemo.py 第156行关键逻辑 sentences [s for s in all_sentences if len(s) 8] # 过滤超短句8字视为无效 sentence_vectors [get_sentence_vector(s) for s in sentences] keyword_vector np.mean([wv[word] for word in top_keywords if word in wv], axis0) scores [cosine_similarity([sv], [keyword_vector])[0][0] for sv in sentence_vectors] ranked_sentences [sentences[i] for i in np.argsort(scores)[::-1][:5]]逻辑说明get_sentence_vector()并非简单平均词向量而是加权平均——每个词权重其TextRank得分 × 词频。这样既保留语义又突出关键词影响力。cosine_similarity来自sklearn.metrics.pairwise确保跨群聊的向量空间一致性。3.3 情绪分析模块没用BERT用的是基于知网HowNet的规则词典混合方法NetUtils.py中analyze_sentiment()函数流程加载assets/emotion_dict.txt含2137个情感词每行格式词\t程度\t极性如焦虑\t2\t-1对每条消息分词后匹配情感词累加程度 × 极性得分引入否定词不、没、未和程度副词非常、略、极其规则修正最终按sum_score / message_count计算群聊整体情绪倾向-1~1区间边界说明该方法对反讽如“这作业真棒”识别率为0但项目定位是“快速感知群聊氛围”而非精准情感判别。若需提升可在assets/下新增irony_patterns.txt正则规则库并在analyze_sentiment()中插入规则匹配层——这是作者预留的二次开发接口。4. 避坑指南五个血泪经验总结全是线上翻车后加日志、改源码、重训模型才踩出来的真坑4.1 现象Summary图片生成为空白纯白底图但控制台无报错原因wordcloud绘图时找不到中文字体font_path参数未生效导致所有文字渲染失败只剩背景图。解决确认assets/目录下存在simhei.ttf黑体文件若不存在从Windows系统目录C:\Windows\Fonts\simhei.ttf复制一份并在ml/NetUtils.py第213行WordCloud(...)初始化中显式指定wc WordCloud(font_pathassets/simhei.ttf, ... )4.2 现象/summary命令无响应日志显示KeyError: message原因Mirai 版本升级后消息结构变更event.get_message()返回对象不再直接含message字段而是message_chain。bot.py第42行msg event.get_message().extract_plain_text()在新版Mirai中会抛出KeyError。解决修改bot.py第42行为msg str(event.get_message()) # 兼容新旧Mirai4.3 现象TextRank关键词全是“哈哈哈”、“嗯嗯”、“收到”真实业务词不出原因assets/stopwords.txt未覆盖群聊特有高频虚词且clean_text()函数未过滤连续重复字符如“啊啊啊”、“呜呜呜”。解决编辑assets/stopwords.txt追加群内高频无意义词如“懂了”、“好嘞”、“OK”在JsonUtils.py的clean_text()函数中增加正则清洗text re.sub(r(.)\1{2,}, r\1\1, text) # 将哈哈哈→哈哈4.4 现象词向量训练报MemoryError16GB内存仍崩溃原因NetUtils.py第98行train_word2vec()默认min_count1导致所有单字如“的”、“了”、“在”都参与建模词汇表膨胀至10万向量矩阵过大。解决将min_count改为5并限制max_vocab_size50000model Word2Vec(sentences, min_count5, max_vocab_size50000, ...)4.5 现象每日总结时间固定为凌晨0点但群聊活跃高峰在晚上9点原因定时任务scheduler.add_job()在bot.py第68行硬编码triggercron的hour0未提供配置入口。解决在config.py中新增SUMMARY_HOUR 21并在bot.py第68行改为scheduler.add_job(generate_daily_summary, cron, hourconfig.SUMMARY_HOUR)5. 进阶技巧如何让机器人从“能用”升级为“好用”——三个可立即落地的定制化改造5.1 支持多群差异化总结给每个群配专属停用词表和情绪词典项目默认所有群共享assets/stopwords.txt和emotion_dict.txt但不同群语境差异巨大考研群要过滤“调剂”、“分数线”技术群要过滤“API”、“404”游戏群要过滤“GG”、“666”。改造步骤在assets/下新建子目录groups/按群号命名如groups/123456789/每个子目录放stopwords.txt和emotion_dict.txt可复制主目录后删减修改IOUtils.py中load_stopwords()函数优先加载assets/groups/{group_id}/stopwords.txt不存在则回退主目录# IOUtils.py 第45行 def load_stopwords(group_id: int None) - set: if group_id: path fassets/groups/{group_id}/stopwords.txt if os.path.exists(path): return set(open(path, encodingutf-8).read().splitlines()) return set(open(assets/stopwords.txt, encodingutf-8).read().splitlines())价值点无需重启bot只需在群内发/setgroup 123456789需新增命令即可动态切换词典。我上线后某实验室群的“论文”关键词召回率从32%升至89%。5.2 总结图增加“话题演化箭头”用LDA主题模型替代静态关键词云当前summary_YYYYMMDD.png是静态词云无法体现话题演变。LDA可挖掘多日主题迁移。改造方案利用ml/NetUtils.py已有的gensim依赖新增run_lda_analysis()函数输入过去7天的聊天文本IOUtils.py中get_group_history(days7)输出主题-关键词矩阵topic_keywords [[(Python, 0.21), (debug, 0.18)], ...]绘图用matplotlib画雷达图每个主题一个轴半径主题强度角度主题编号# ml/NetUtils.py 新增函数节选 def run_lda_analysis(texts: List[str], num_topics3) - List[List[Tuple[str, float]]]: dictionary corpora.Dictionary([jieba.lcut(t) for t in texts]) corpus [dictionary.doc2bow(jieba.lcut(t)) for t in texts] lda LdaModel(corpus, id2worddictionary, num_topicsnum_topics) return [lda.show_topic(i, topn5) for i in range(num_topics)]参数说明num_topics建议设为3~5群聊话题通常不超过5个主线topn5控制每主题显示关键词数LDA结果可存入assets/lda_history.json供前端可视化调用。5.3 用户反馈闭环让群成员对总结打分自动优化TextRank参数当前模型是静态的但群聊语言在变。引入用户反馈可驱动迭代。最小可行方案总结图底部加一行文字“✅满意 / ❌不满意回复数字1~5”监听群消息若检测到re.match(r^[1-5]$, msg)则将该日总结文本、关键词、用户评分存入assets/feedback_log.csv每周日凌晨运行optimize_textrank_params.py用网格搜索调整damping_factor和window_size使高分总结的TextRank得分与人工标注关键词重合度最大化# optimize_textrank_params.py 核心逻辑 from sklearn.metrics import jaccard_score best_score, best_params 0, {} for d in [0.7, 0.8, 0.85, 0.9]: for w in [3, 5, 7]: scores [] for row in feedback_data: pred_keywords textrank(row[text], damping_factord, window_sizew) true_keywords row[annotated_keywords] # 人工标注 scores.append(jaccard_score(true_keywords, pred_keywords, averagemicro)) if np.mean(scores) best_score: best_score np.mean(scores) best_params {damping_factor: d, window_size: w}落地效果我在3个技术群部署后TextRank关键词与人工标注的Jaccard相似度从0.41提升至0.67且“作业”、“答辩”等核心词稳定性显著增强。从那以后我每次上线新群都强制走一遍用户反馈收集期——哪怕只收7天数据也比凭经验调参靠谱得多。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

VC++运行库精准修复指南:架构/版本/签名全解析
VC++运行库精准修复指南:架构/版本/签名全解析

1. 这不是“随便装个补丁”——VC运行库到底在替谁扛事?你双击一个软件,弹出“无法启动此程序,因为计算机中丢失 VCRUNTIME140_1.dll”;打开游戏提示“MSVCP140.dll 找不到”;甚至安装 Photoshop 或 AutoCAD 时卡在“正… · 2026/9/26 7:12:24

Xshell8个人免费许可申请与离线激活指南
Xshell8个人免费许可申请与离线激活指南

1. 这不是“破解教程”,而是一份真实可用的 Xshell8 免费版落地指南 Xshell8 是 Windows 平台下最主流的 SSH 终端工具之一,尤其在运维、开发、测试、教学等需要频繁连接 Linux 服务器的场景中,几乎成了开箱即用的标配。但很多人一搜“Xshel… · 2026/9/26 7:12:24

Atlas 300V NPU推理卡:从CANN环境到YOLO模型部署全指南
Atlas 300V NPU推理卡:从CANN环境到YOLO模型部署全指南

很多人第一次拿到这块卡的时候,问的问题基本都一样:Atlas 300V 24G 到底是不是运算加速卡?为什么插上去没有视频输出口?能不能像 GPU 那样跑 CUDA?接着又会在部署 YOLO 的时候被一整套 CANN 环境、模型转换、ACL 接口折… · 2026/9/26 7:12:24

Gemini Pro输出协议升级:从概率生成到确定性交付
Gemini Pro输出协议升级:从概率生成到确定性交付

1. Gemini Pro 2.5 不是“新模型”,而是Google对现有能力的一次关键释放最近在技术社区和开发者群里,频繁看到“Gemini Pro 2.5 输出”这个短语被当作一个独立产品或新版本在讨论——有人截图问“这是不是刚发布的模型?”,有人发链… · 2026/9/26 7:51:39

Bonsai-27B-gguf本地部署指南:CUDA/Metal全平台推理实战
Bonsai-27B-gguf本地部署指南:CUDA/Metal全平台推理实战

1. 为什么是 Bonsai-27B-gguf?它不是另一个“跑得动就行”的模型 你点开这个标题,大概率刚在 Hugging Face 或 llama.cpp 的 GitHub 页面上刷到 Bonsai-27B-gguf 这个名字,心里嘀咕:“又一个 27B 参数的模型?和 Phi-3… · 2026/9/26 7:51:39

Atlas 300V部署YOLO实战:从PyTorch到OM全流程解析
Atlas 300V部署YOLO实战:从PyTorch到OM全流程解析

"Atlas"这名字我第一次搜到时,一度以为是个开源GIS框架或者地图可视化项目,直到把环境装完、模型跑通,才确认这是华为昇腾系列AI推理卡的统称。这半年我在边缘视觉项目里反复和Atlas 300V Pro 24G打交道,"atlas部署… · 2026/9/26 7:51:33

AI漫剧合规指南:从生产链路到分发审核的实操要点
AI漫剧合规指南:从生产链路到分发审核的实操要点

1. AI漫剧到底是个什么东西,为什么突然被推上风口第一次听到"AI漫剧"这个词,很多人会下意识把它和"AI短剧""AI视频"混为一谈。实际上,漫剧是一个更细分的品类——它介于静态漫画和动态视频之间,用漫… · 2026/9/26 7:51:33

如何不联网在手机上跑本地大模型:Google AI Edge Gallery 部署指南
如何不联网在手机上跑本地大模型:Google AI Edge Gallery 部署指南

如何不联网在手机上跑本地大模型:Google AI Edge Gallery 部署指南 【免费下载链接】gallery A gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally. 项目地址: https://gitcode.com/GitHub_Trending/gallery… · 2026/9/26 7:51:33

TinyVT:基于EPT的Windows内核无痕HOOK与内存访问控制
TinyVT:基于EPT的Windows内核无痕HOOK与内存访问控制

1. 这不是“又一个HOOK教程”:TinyVT的本质是重构Windows内核的访问控制权你搜到“TinyVT Windows内核虚拟化技术终极指南:5步掌握EPT无痕HOOK”时,大概率正卡在某个关键节点上——可能是驱动调试时发现SSDT被绕过、可能是想拦截某款安全软件… · 2026/9/26 7:51:33

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码