新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/26 7:12:27来源:尧图网络
离线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天数据也比凭经验调参靠谱得多。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从源码包到能跑:核酸检测报告查询系统部署与改造全攻略 2026/9/26 7:51:19

从源码包到能跑:核酸检测报告查询系统部署与改造全攻略

简介:一份面向Web开发学习者及医疗信息化从业者的核酸检测报告查询系统ASP源码包,完整包含前台查询、后台管理、数据库存储等功能模块。压缩包共733个文件,大小仅3.42MB,主要文件类型包括373个gif动效与png图标素材、137个js交互脚…

阅读更多 →
从筛选到机制:非靶标代谢组学如何构建完整研究链条 2026/9/26 7:51:19

从筛选到机制:非靶标代谢组学如何构建完整研究链条

"表型–代谢–机制"这个链条,是我最近两年看文献和审稿时体会最深的一条主线。很多朋友做非靶标代谢组学,数据跑完、差异代谢物一筛、画个热图和气泡图,就以为大功告成,结果投稿反馈往往是"分析浅了""缺…

阅读更多 →
CityEngine功能分区规则库实战:CGA参数化建模与规划应用解析 2026/9/26 7:51:19

CityEngine功能分区规则库实战:CGA参数化建模与规划应用解析

简介:这是一套Cityengine城市规划功能分区规则库,面向城乡规划、城市设计及三维建模学习者,用于快速生成符合用地性质的街区模型。资源包将住宅、商业、工业、绿地、交通网络等常用功能区的规则进行模块化封装,支持在Cityengine中…

阅读更多 →
Java后端接入大语言模型:从API调用到SSE流式与Nginx部署 2026/9/26 7:51:19

Java后端接入大语言模型:从API调用到SSE流式与Nginx部署

最近好几个朋友问我同一个问题:Java后端到底怎么接入大语言模型?有人以为用RestTemplate调一下接口就算完事,结果流式输出一到生产就卡住,JSON解析连着报错,重试机制还导致账单翻倍。也有人直接在前端把模型API的Key填…

阅读更多 →
SonarQube插件开发实战:兼容5.5到7.x的PDF报告生成源码解析 2026/9/26 7:51:19

SonarQube插件开发实战:兼容5.5到7.x的PDF报告生成源码解析

简介:基于SonarQube的PDF报告生成插件源码,覆盖5.5至7.x版本,面向需要定制代码质量报告的项目团队与插件开发者,重点解决跨版本兼容、分析结果可视化及报告共享等问题。资源包共121个文件,约14.86MB,以98个…

阅读更多 →
16项AI新进展:机器人推理、Agent框架与视频生成全解析 2026/9/26 7:51:13

16项AI新进展:机器人推理、Agent框架与视频生成全解析

这周又把各大技术榜单、开源仓库和几个AI社群刷了一遍,值得摊开聊一聊的东西不少。这一轮新进展覆盖面很广,从机器人推理层的思路转变,到Agent框架的底层拆分,再到视频生成工具链的爆发,最后还有一堆和本地部署、微调、…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉