20250805问答课题-实现TextRank + 问题分类

  1. textRank的工具包实现
  2. 其他可能的实现方法,对比结果
  3. 查找分类的相关算法

目录

1. 关键词提取TF-IDF + TextRank

1.1. TF-IDF算法

1.2. TextRank算法

1.3. 双算法提取关键词

2. 问题分类

2.1. 预处理

2.2. 获取BERT向量

2.3. 一级标签预测

2.4. 二级标签预测

3. 测试

3.1. 关键词匹配度未发挥作用

3.2. 预测结果对比表


1. 关键词提取TF-IDF + TextRank

1.1. TF-IDF算法

是一种统计方法,评估一个词语在文档中的重要程度。

TF-IDF 值

  • TFIDF(t,d,D)=TF(t,d)×IDF(t,D)
  • TF(词频)
    • 词语在当前文档中出现的频率,高频词重要
    • TF(t,d)=词语 t 在文档 d 中出现的次数 / 文档d的总词数
  • IDF(逆文档频率)
    • 词语在整个语料库中的稀有程度,全局重要性,语料库中出现越少的词权重越高,稀有词区分度高
    • IDF(t,D)=log⁡(语料库中文档总数 N / (包含词语 t 的文档数+1))
    • 加1避免分母为零

缺点

  • 忽略语义:无法捕捉词语间的语义关系(如"深度学习"和"神经网络"的关联)、同义词
  • 稀疏性问题:长尾词可能被过度加权
  • 依赖语料库:受限于训练语料的覆盖范围,专业领域新词可能权重异常

1.2. TextRank算法

特点:

  • 图模型:将文本转化为图结构,词语为节点,关系为边
  • 迭代计算:基于PageRank思想,通过投票机制计算节点重要性
  • 上下文感知:考虑词语的局部窗口共现关系

优点:

  • 语义感知:能捕捉词语间的关联性,如"机器学习"和"算法"
  • 无需训练:直接处理单文档,适合动态文本
  • 短语提取:可识别复合词,如"自然语言处理"

1.3. 双算法提取关键词

特殊字符过滤

text = re.sub(r"[^\w\u4e00-\u9fa5??!!]", "", text)

TF-IDF 提取:

jieba.analyse.extract_tags(text,topK=10,          # 提取前10个关键词withWeight=False, # 不返回权重allowPOS=('n', 'v', 'a', 'nr', 'ns', 'nz')  # 仅保留名词、动词、形容词等
)
  • 原理:基于词频 - 逆文档频率,强调在当前文本中出现频繁但在语料库中不常见的词
  • 词性筛选:保留名词(n)、动词(v)、形容词(a)、人名(nr)、地名(ns)、其他专有名词(nz),过滤虚词、副词等无实际意义的词

TextRank 提取

jieba.analyse.textrank(text,topK=10,withWeight=False,allowPOS=('n', 'v', 'a', 'nr', 'ns', 'nz')
)
  • 原理:基于图模型,通过词与词的共现关系计算重要性
  • 优势:能捕捉文本内部语义关联

关键词合并与筛选

combined = []seen = set()for kw in tfidf_kws + textrank_kws:if kw not in seen:seen.add(kw)combined.append(kw)# 保留前5-7个关键词return " ".join(combined[:7]) if combined else ""
  • 去重逻辑:通过 seen 集合合并两种算法的结果,优先保留先出现的关键词,去重
  • 长度控制:保留前 5-7 个关键词,用空格拼接为字符串
  • 边界处理:若未提取到关键词,返回空字符串

2. 问题分类

实现问答数据的自动分类(自动标注一级、二级标签)

2.1. 预处理

调用clean_text()函数

  • 移除非文本字符,保留中文字符、基本标点和重要词汇结合
  • TF-IDF 和 TextRank 算法提取关键词
  • 合并去重后保留前 7 个关键词作为核心特征

2.2. 获取BERT向量

调用_get_embedding()函数

  • 加载预训练 BERT 模型和分词器
  • 取模型最后 4 层的隐藏状态
  • 按预设权重([0.15, 0.25, 0.35, 0.25])融合各层 CLS 向量
  • 对融合向量进行归一化处理

2.3. 一级标签预测

search_results = self.search(text) # 统计一级标签出现频率和平均相似度
l1_stats = defaultdict(lambda: {'count': 0, 'total_sim': 0.0})
for result in search_results:l1 = result['tags']['level1']l1_stats[l1]['count'] += 1l1_stats[l1]['total_sim'] += result['similarity']# 计算每个一级标签的平均相似度l1_scores = {l1: stat['total_sim']/stat['count'] for l1, stat in l1_stats.items()}if not l1_scores:return {'level1': '其他', 'level2': '无'}# 取相似度最高的前3个候选
top_l1 = sorted(l1_scores.items(), key=lambda x: x[1], reverse=True)[:3]
  • 通过search方法获取与输入文本相关的问答结果,包含问题、答案、相似度、标签
  • defaultdict构建一级标签的统计容器,对检索结果中的每个一级标签进行统计
    • 出现频次(count):该标签在检索结果中出现的次数
    • 相似度总和(total_sim):该标签对应问答对的相似度分数之和
  • 总相似度 / 出现次数=标签平均相似度
  • 选取相似度最高的前 3 个一级标签

2.4. 二级标签预测

keywords = set(cleaned.split())
best_score = -1
best_tags = {'level1': top_l1[0][0], 'level2': '无'}for l1, l1_score in top_l1:if l1 not in self.tag_config.LEVEL2:continuefor l2 in self.tag_config.LEVEL2[l1]:# 关键词匹配l2_cleaned = clean_text(l2) l2_keywords = set(jieba.lcut(l2_cleaned)) kw_score = len(keywords & l2_keywords) / max(len(l2_keywords), 1)# 向量相似度l2_vec = self._get_embedding(l2_cleaned)  vec_score = np.dot(query_vec, l2_vec)  # 综合评分total_score = 0.6 * vec_score + 0.4 * kw_scoreif total_score > best_score:best_score = total_scorebest_tags = {'level1': l1, 'level2': l2}
  • 按空格分割预处理后的cleaned,得到关键词集合,初始化最佳评分、标签结果
  • 循环处理一级标签预测的 3 名候选top_l1,过滤掉没有二级标签的一级标签
  • 评分由两部分组成:
    • 关键词匹配度kw_score(40% ):问题关键词与二级标签关键词结果的交集比例
    • 向量相似度vec_score(60% ):输入问题与该二级标签下所有问题的平均相似度
      • 调用函数生成二级标签的BERT向量
      • 计算问题与标签的向量余弦相似度
  • 选取综合评分最高的标签组合作为最终预测结果

3. 测试

3.1. 关键词匹配度未发挥作用

根据调试结果,关键词部分的匹配度始终为0,未发挥作用

处理问题: 什么是佛教中的四圣谛?

预处理完成: 圣谛 佛教

向量维度: (768,)

候选一级标签: [('道理', 0.6594605436445109), ('修行', 0.6436407618586859), ('生活', 0.6339292906486615)]

二级标签'道理/人生'评分: 0.58 (向量:0.96, 关键词:0.00)

二级标签'道理/天道'评分: 0.58 (向量:0.97, 关键词:0.00)

最终预测: {'level1': '道理', 'level2': '天道'}

二级标签'修行/佛家'评分: 0.59 (向量:0.99, 关键词:0.00)

二级标签'修行/儒家'评分: 0.58 (向量:0.96, 关键词:0.00)

二级标签'修行/道家'评分: 0.58 (向量:0.97, 关键词:0.00)

最终预测: {'level1': '修行', 'level2': '佛家'}

二级标签'生活/健康'评分: 0.57 (向量:0.96, 关键词:0.00)

二级标签'生活/教育'评分: 0.58 (向量:0.96, 关键词:0.00)

二级标签'生活/食品'评分: 0.57 (向量:0.96, 关键词:0.00)

最终预测: {'level1': '修行', 'level2': '佛家'}

预测结果: {'level1': '修行', 'level2': '佛家'}

3.2. 预测结果对比表

测试问题

实际预测

理想预测

什么是佛教中的四圣谛?

修行,佛家

修行,佛家

孔子说的'己所不欲勿施于人'如何实践?

修行,儒家

修行,儒家

庄子讲的'逍遥游'是什么境界?

修行,道家

修行,道家

每天快走30分钟有什么健康益处?

生活,健康

生活,健康

如何培养孩子的阅读习惯?

道理,人生

生活,教育

隔夜菜到底能不能吃?

生活,教育

生活,食品

如何面对生活中的重大挫折?

生活,教育

道理,人生

为什么说'善恶终有报'?

道理,天道

道理,天道

准确率统计

指标

数量

比例

完全正确

5

62.5%

一级标签正确

1

12.5%

完全错误

2

25%

对于修行一级标签预测较好,另外两个一级标签较差;初步分析可能与数据源的样本数量有关,心法问答.csv的标签分布如下:

一级标签

二级标签

数量

修行33

儒家

24

道家

8

佛家

1

生活25

教育

22

健康

2

食品

1

道理18

人生

10

天道

8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91828.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Memcached缓存与Redis缓存的区别、优缺点和适用场景

一、核心差异概述特性MemcachedRedis​数据结构​简单键值存储丰富数据结构(String/Hash/List/Set等)​持久化​不支持支持RDB和AOF两种方式​线程模型​多线程单线程(6.0支持多线程I/O)​内存管理​Slab分配LRU淘汰多种淘汰策略&…

Git简易教程

Git教程 VCS Version Control System版本控制系统 配置用户名邮箱 配置用户名和邮箱 git config --global user.name mihu git config --global user.email aaabbb.com初始化仓库 从项目仓库拉 git clone [项目地址]新建文件夹之后 git init提交操作 提交到仓库 git add . #把…

关于Web前端安全之XSS攻击防御增强方法

仅依赖前端验证是无法完全防止 XSS的,还需要增强后端验证,使用DOMPurify净化 HTML 时,还需要平衡安全性与业务需求。一、仅依赖前端验证无法完全防止 XSS 的原因及后端验证的重要性1. 前端验证的局限性前端验证(如 JavaScript 输入…

消息系统技术文档

消息系统技术文档 概述 本文档详细说明了如何在现有的LHD通信系统中添加自己的消息类型,包括消息的发送、接收、解析和处理的完整流程。 系统架构 消息流程架构图 #mermaid-svg-My7ThVxSl6aftvWK {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情数据可视化分析-热词情感趋势树形图

大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解微博舆情数据可视化分析-热词情感趋势树形图…

8月4日 强对流天气蓝色预警持续:多地需警惕雷暴大风与短时强降水

中央气象台8月4日10时继续发布强对流天气蓝色预警,提醒广大民众注意防范即将到来的恶劣天气。 预警详情: 时间范围: 8月4日14时至5日14时 影响区域: 雷暴大风或冰雹: 西北地区中东部、华北中北部、华南南部等地,风力可达8级以上。 短时强降水: 西北地区中东部、华北、…

C语言数据结构(4)单链表专题2.单链表的应用

1. 链表经典算法——OJ题目 1.1 单链表相关经典算法OJ题1:移除链表元素 1.2 单链表相关经典算法OJ题2:反转链表 1.3 单链表相关经典算法OJ题3:合并两个有序链表 1.4 单链表相关经典算法OJ题4:链表的中间结点 1.5 循环链表…

Shell 脚本发送信号给 C 应用程序,让 C 应用程序回收线程资源后自行退出。

下面分别给出一个 Shell 脚本和 C 程序的例子,实现通过 Shell 脚本发送信号给 C 应用程序,让 C 应用程序回收线程资源后自行退出。原理在 Linux 系统中,我们可以使用信号机制来实现进程间的通信。Shell 脚本可以使用 kill 命令向指定的进程发…

C++入门自学Day6-- STL简介(初识)

往期内容回顾 C模版 C/C内存管理(初识) C/C内存管理(续) STL简介: STL 是 C 标准库的重要组成部分,是一个通用程序设计的模板库,用于数据结构和算法的复用。它极大地提升了代码效率、可靠性…

从零开始搞定类与对象(中)

运算符重载1.当运算符被用于类类型的对象时,C语言允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。2. 运算符重载是具有特殊名字的函…

SpringMVC实战指南:从环境搭建到功能实现全解析

第一章&#xff1a;SpringMVC环境搭建与基础配置1.1 Maven依赖配置在Maven项目中&#xff0c;SpringMVC的依赖配置是开发的第一步。根据Spring官方推荐&#xff0c;以下是SpringMVC 5.3.x版本的Maven依赖配置&#xff1a;<dependencies><!-- Spring MVC核心依赖 -->…

Repo 与 manifest

Manifest&#xff1a;它本身就是一个 git 仓库&#xff0c;其中存放的都是包含仓库和子仓库信息的XML文件。这些文件全部由开发者或者维护者手动配置并自己上传到 git 仓库。另外&#xff1a;Manifest 中的仓库之间的依赖关系 repo 也并不关心。所以它们可以是同级的也可以是包…

深入浅出 RabbitMQ:简单队列实战指南

大家好&#xff0c;我是工藤学编程 &#x1f989;一个正在努力学习的小博主&#xff0c;期待你的关注实战代码系列最新文章&#x1f609;C实现图书管理系统&#xff08;Qt C GUI界面版&#xff09;SpringBoot实战系列&#x1f437;【SpringBoot实战系列】SpringBoot3.X 整合 Mi…

Ubuntu22-Qt Creator-fcitx-中文输入

fcitx在ubuntu系统中路径 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ /usr/lib/x86_64-linux-gnu/qt6/plugins/platforminputcontexts/ fcitx-qt5-1.2.7 编译 下载链接:https://github.com/fcitx/fcitx-qt5/archive/refs/tags/1.2.7.zip Qt版本:Qt C…

【Java基础|第十三篇】面向对象基础(三)——继承(一)继承的理解,实现,特点……

&#xff08;四&#xff09;面向对象&#xff1a; 5、继承&#xff1a; &#xff08;1&#xff09;理解&#xff1a; 概念&#xff1a; 继承是面向对象的三大特征之一 继承是类与类之间关系的一种&#xff08;是父类与子类的关系&#xff09; 使用场景&#xff1a; 一个类与另…

QGIS绿色版吉林一号切片体验版插件(Jilin1Tiles)更新

吉林一号更新2024年图源了但吉林一号切片体验版插件&#xff08;Jilin1Tiles&#xff09;还没有更新&#xff0c;我修改了一下代码&#xff0c;直接集成到QGIS绿色版中。如下&#xff1a;注意&#xff1a;第一次使用的时候需要选中启用一下插件&#xff1a;需要使用的可以直接下…

git操作命令和golang编译脚本

git子模块信息处理命令git init submodule git submodule updategit取消合并 git merge --abort git reset --hard HEAD{1}bat文件生成二进制set GOOSlinux set GOARCHamd64 go env -w GOFLAGS-modvendor go build -ldflags "-w -s" -ohallapiset GOOSlinux set GOAR…

通往L4之路:构建自我进化的智能驾驶决策大脑

摘要&#xff1a; 本文旨在提出一个超越当前主流“感知-预测-规划”分离式架构的下一代自动驾驶决策系统方案。面对自动驾驶领域最核心的“长尾场景”难题&#xff0c;本文借鉴并升华了一套源于复杂策略制定的决策智能框架&#xff0c;通过构建动态驾驶世界模型&#xff08;Dyn…

AI编程助手:终结996的新希望

引言程序员工作现状与“996”现象的普遍性AI技术快速发展对编程效率的潜在影响核心问题&#xff1a;AI IDE与AI辅助编程能否改变传统开发模式AI IDE与AI辅助编程的核心技术AI IDE的定义与功能&#xff08;代码补全、错误检测、自动重构等&#xff09;AI辅助编程工具&#xff08…

Anthropic 禁止 OpenAI 访问 Claude API:商业竞争与行业规范的冲突

Anthropic 禁止 OpenAI 访问 Claude API&#xff1a;商业竞争与行业规范的冲突 文章来源&#xff1a;Poixe AI 本周&#xff0c;美国 AI 公司 Anthropic 宣布禁止 OpenAI 通过 API 访问其 Claude 系列大模型。这一举动引发了行业对"友好基准测试"与商业竞争边界的热…