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
英文地址,請注明出處:http://en.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 系列大模型。這一舉動引發了行業對"友好基準測試"與商業競爭邊界的熱…