NLP---IF-IDF案例分析

一·案例 - 紅樓夢

1首先準備語料庫

http://www.dxsxs.com

這個網址去下載

2 任務一:拆分提取

import os
import redef split_hongloumeng():# ========== 1. 配置路徑(關鍵:根據實際文件位置修改) ==========# 腳本所在文件夾(自動獲取,不用改)script_dir = os.path.dirname(os.path.abspath(__file__))# 紅樓夢原文路徑(和腳本同文件夾就不用改,否則寫完整路徑,如 D:/xxx/紅樓夢.txt)input_path = os.path.join(script_dir, "紅樓夢.txt")# 切割后保存的文件夾(自動在腳本目錄創建“分卷”文件夾)output_dir = os.path.join(script_dir, "分卷")os.makedirs(output_dir, exist_ok=True)  # 確保輸出文件夾存在# ========== 2. 正則規則(精準匹配要過濾/切割的內容) ==========# 過濾開頭無關信息(手機電子書...本章字數:xxx)header_pattern = re.compile(r'手機電子書·大學生小說網.*?本章字數:\d+', re.DOTALL)# 匹配回目(第一回、第二回...),優先匹配“第X回”,適配不同寫法chapter_pattern = re.compile(r'第([一二三四五六七八九十百千萬]+回|[\d]+回)', re.UNICODE)# 過濾結尾無關內容(且聽下回分解及之后空行)end_pattern = re.compile(r'且聽下回分解.*?$', re.DOTALL)with open(input_path, 'r', encoding='utf-8') as f:# 讀取全文 → 過濾開頭無關內容 → 按行處理content = f.read()# 先砍頭:去掉開頭無關信息content = header_pattern.sub('', content).strip()# 按換行拆分,方便逐行處理lines = content.split('\n')current_chapter = None  # 當前回目名稱(如“第一回”)current_lines = []      # 當前回的內容chapter_order = []      # 記錄回目順序,保證輸出按1、2、3回排序# ========== 3. 逐行處理原文 ==========for line in lines:line = line.strip()  # 去掉每行首尾空格、換行符if not line:         # 空行直接跳過continue# 匹配回目(如“第一回”“第2回”,兼容中文數字和阿拉伯數字)chapter_match = chapter_pattern.search(line)if chapter_match:# ---- 遇到新回目,先保存上一回內容 ----if current_chapter:# 去結尾無關內容(且聽下回分解...)clean_content = end_pattern.sub('', '\n'.join(current_lines)).strip()# 保存文件(用回目編號排序,如“001_第一回.txt”)output_path = os.path.join(output_dir,f"{str(len(chapter_order)+1).zfill(3)}_{current_chapter}.txt")with open(output_path, 'w', encoding='utf-8') as f_out:f_out.write(clean_content)chapter_order.append(current_chapter)  # 記錄順序# ---- 開始處理新回目 ----current_chapter = chapter_match.group(0)  # 提取回目名稱(如“第一回”)current_lines = [current_chapter]  # 回目名稱作為第一行else:# 非回目行,加入當前回內容(已過濾空行,直接存)current_lines.append(line)# ========== 4. 處理最后一回(循環外收尾) ==========if current_chapter:clean_content = end_pattern.sub('', '\n'.join(current_lines)).strip()output_path = os.path.join(output_dir,f"{str(len(chapter_order)+1).zfill(3)}_{current_chapter}.txt")with open(output_path, 'w', encoding='utf-8') as f_out:f_out.write(clean_content)# ========== 5. 完成提示 ==========print(f"? 切割完成!共 {len(chapter_order) + (1 if current_chapter else 0)} 回")print(f"📁 保存位置:{output_dir}")print("🔍 文件名按【001_第一回、002_第二回...】排序,可直接用")if __name__ == "__main__":split_hongloumeng()

任務二·把分好后的卷,轉移成IF-IDF能識別的卷

#
import pandas as pd  # 數據預處理庫
import os  # 用于文件和目錄操作
import jieba  # 用于中文分詞# 獲取當前腳本所在的目錄路徑
current_dir = os.path.dirname(os.path.abspath(__file__))# 初始化列表,用于存儲文件路徑和文件內容
filePaths = []  # 保存文件路徑
fileContents = []  # 保存文件路徑對應的內容# 遍歷文件夾,獲取文件路徑和內容
# 使用絕對路徑拼接,確保能正確找到分卷文件夾
fenjuan_dir = os.path.join(current_dir, "分卷")
for root, dirs, files in os.walk(fenjuan_dir):  # 遍歷文件夾及其子文件夾for name in files:filePath = os.path.join(root, name)  # 拼接得到文件完整路徑filePaths.append(filePath)  # 將文件路徑添加到列表# 讀取文件內容并添加到列表with open(filePath, 'r', encoding='utf-8') as f:fileContent = f.read()fileContents.append(fileContent)# 將文件路徑和內容轉換為DataFrame
corpos = pd.DataFrame({'filePath': filePaths,'fileContent': fileContents
})# 導入紅樓夢專屬詞庫,提升分詞準確性
# 紅樓夢詞庫與腳本在同一目錄下
user_dict_path = os.path.join(current_dir, "紅樓夢詞庫.txt")
jieba.load_userdict(user_dict_path)# 讀取停用詞庫,用于過濾無關詞匯
# 修正路徑,假設StopwordsCN.txt在當前腳本所在的紅樓夢目錄下
stopwords_path = os.path.join(current_dir, "StopwordsCN.txt")
stopwords = pd.read_csv(stopwords_path, encoding='utf8', engine='python', index_col=False)# 創建新文件,用于保存分詞后結果
output_file = os.path.join(current_dir, "wj.txt")
file_to_jieba = open(output_file, 'w', encoding='utf-8')# 遍歷DataFrame,對每個文件內容進行分詞和停用詞過濾
for index, row in corpos.iterrows():  # 按行遍歷DataFramejuan_ci = ''  # 用于存儲當前文件分詞后的結果fileContent = row['fileContent']  # 獲取當前文件內容segs = jieba.cut(fileContent)  # 進行分詞for seg in segs:# 過濾停用詞和空字符串if seg not in stopwords.stopword.values and len(seg.strip()) > 0:juan_ci += seg + ' '  # 拼接分詞結果file_to_jieba.write(juan_ci + '\n')  # 將結果寫入文件# 關閉文件
file_to_jieba.close()

1. 導入所需庫

python

運行

import pandas as pd  # 數據預處理庫
import os  # 用于文件和目錄操作
import jieba  # 用于中文分詞

  • 導入pandas庫,用于數據的結構化處理(如創建 DataFrame)
  • 導入os庫,用于處理文件路徑和目錄遍歷
  • 導入jieba庫,用于中文文本的分詞處理

2. 獲取當前腳本所在目錄

python

運行

current_dir = os.path.dirname(os.path.abspath(__file__))

  • os.path.abspath(__file__)獲取當前腳本的絕對路徑
  • os.path.dirname()提取該路徑中的目錄部分
  • 目的是獲取可靠的基準路徑,避免相對路徑帶來的問題

3. 初始化存儲數據的列表

python

運行

filePaths = []  # 保存文件路徑
fileContents = []  # 保存文件路徑對應的內容

  • 創建兩個空列表,分別用于存儲后續讀取的文件路徑和文件內容

4. 遍歷文件夾并讀取文件內容

python

運行

fenjuan_dir = os.path.join(current_dir, "分卷")
for root, dirs, files in os.walk(fenjuan_dir):for name in files:filePath = os.path.join(root, name)filePaths.append(filePath)with open(filePath, 'r', encoding='utf-8') as f:fileContent = f.read()fileContents.append(fileContent)

  • 拼接得到 "分卷" 文件夾的完整路徑
  • 使用os.walk()遍歷 "分卷" 文件夾下的所有文件
  • 對每個文件,拼接完整路徑并添加到filePaths列表
  • 以 UTF-8 編碼打開文件,讀取內容并添加到fileContents列表

5. 創建數據框存儲文件信息

python

運行

corpos = pd.DataFrame({'filePath': filePaths,'fileContent': fileContents
})
  • 使用pandas.DataFrame()創建數據框
  • 將文件路徑和內容分別作為兩列存儲,便于后續按行處理

6. 加載自定義詞庫

python

運行

user_dict_path = os.path.join(current_dir, "紅樓夢詞庫.txt")
jieba.load_userdict(user_dict_path)
  • 拼接得到紅樓夢專屬詞庫的路徑
  • 加載自定義詞庫,讓 jieba 分詞更符合《紅樓夢》的語言特點

7. 讀取停用詞庫

python

運行

stopwords_path = os.path.join(current_dir, "StopwordsCN.txt")
stopwords = pd.read_csv(stopwords_path, encoding='utf8', engine='python', index_col=False)
  • 拼接得到停用詞文件的路徑
  • 讀取中文停用詞表,用于后續過濾無意義詞匯(如 "的"、"了" 等)

8. 準備輸出文件

python

運行

output_file = os.path.join(current_dir, "wj.txt")
file_to_jieba = open(output_file, 'w', encoding='utf-8')
  • 定義分詞結果的輸出文件路徑
  • 以寫入模式打開文件,準備存儲處理后的結果

9. 分詞處理并過濾停用詞

python

運行

for index, row in corpos.iterrows():juan_ci = ''fileContent = row['fileContent']segs = jieba.cut(fileContent)for seg in segs:if seg not in stopwords.stopword.values and len(seg.strip()) > 0:juan_ci += seg + ' 'file_to_jieba.write(juan_ci + '\n')

  • 遍歷數據框中的每一行(每個文件內容)
  • 對文件內容進行分詞處理
  • 過濾掉停用詞和空字符串
  • 將處理后的分詞結果拼接成字符串
  • 寫入到輸出文件中

10. 關閉文件

python

運行

file_to_jieba.close()

  • 完成寫入后關閉文件,釋放系統資源

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95409.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LaTeX(排版系統)Texlive(環境)Vscode(編輯器)環境配置與安裝

LaTeX、Texlive 和 Vscode 三者之間的關系,可以把它們理解成語言、工具鏈和編輯器的配合關系。 1.下載Texlive 華為鏡像網站下載 小編這邊下載的是texlive2025.iso最新版的,下載什么版本看自己需求,只要下載后綴未.iso的即可。為避免錯誤&am…

【深入淺出STM32(1)】 GPIO 深度解析:引腳特性、工作模式、速度選型及上下拉電阻詳解

GPIO 深度解析:引腳特性、工作模式、速度選型及上下拉電阻詳解一、GPIO概述二、GPIO的工作模式1、簡述(1)4種輸入模式(2)4種輸出模式(3)4種最大輸出速度2、引腳速度(1)輸…

第1節 大模型分布式推理基礎與技術體系

前言:為什么分布式推理是大模型時代的核心能力? 當我們談論大模型時,往往首先想到的是訓練階段的千億參數、千卡集群和數月的訓練周期。但對于商業落地而言,推理階段的技術挑戰可能比訓練更復雜。 2025年,某頭部AI公司推出的130B參數模型在單機推理時面臨兩個選擇:要么…

《軟件工程導論》實驗報告一 軟件工程文檔

目 錄 一、實驗目的 二、實驗環境 三、實驗內容與步驟 四、實驗心得 一、實驗目的 1. 理解軟件工程的基本概念,熟悉軟件,軟件生命周期,軟件生存周期過程和軟件生命周期各階段的定義和內容。 2. 了解軟件工程文檔的類別、內容及撰寫軟件工…

基于elk實現分布式日志

1.基本介紹 1.1 什么是分布式日志 在分布式應用中,日志被分散在儲存不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日志。這樣是不是感覺很繁瑣和效率低下。所以我們使用集中化的日志管理,分布式日志…

多模態RAG賽題實戰之策略優化--Datawhale AI夏令營

科大訊飛AI大賽(多模態RAG方向) - Datawhale 項目流程圖 1、升級數據解析方案:從 fitz 到 MinerU PyMuPDF(fitz)是基于規則的方式提取pdf里面的數據;MinerU是基于深度學習模型通過把PDF內的頁面看成是圖片…

09--解密棧與隊列:數據結構核心原理

1. 棧 1.1. 棧的簡介 棧 是一種 特殊的線性表,具有數據 先進后出 特點。 注意: stack本身 不支持迭代器操作 主要原因是因為stack不支持數據的隨機訪問,必須保證數據先進后出的特點。stack在CPP庫中實現為一種 容器適配器 所謂容器適配器&a…

打造專屬 React 腳手架:從 0 到 1 開發 CLI 工具

前言: 在前端開發中,重復搭建項目環境是個低效的事兒。要是團隊技術棧固定(比如 React AntD Zustand TS ),每次從零開始配路由、狀態管理、UI 組件,既耗時又容易出錯。這時候,自定義 CLI 腳手架 就派上…

Python day43

浙大疏錦行 Python day43 import torch import numpy as np import pandas as pd import torchvision import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torch.utils.data import Da…

python基于Hadoop的超市數據分析系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具:Navicat/SQLyog等都可以 摘要&…

如何用 COLMAP 制作 Blender 格式的數據集

如何用 COLMAP 制作 Blender 格式的數據集并劃分出 transforms_train.json、transforms_val.json 和 transforms_test.json。 一、什么是 Blender 格式數據集? Blender 格式數據集是 Nerf 和 Nerfstudio 常用的輸入格式,其核心是包含了相機內外參的 JSON 文件,一般命名為:…

[GESP202309 六級] 2023年9月GESP C++六級上機題題解,附帶講解視頻!

本文為GESP 2023年9月 六級的上機題目詳細題解和講解視頻,覺得有幫助或者寫的不錯可以點個贊。 題目一講解視頻 GESP2023年9月六級上機題一題目二講解視頻 題目一:小羊買飲料 B3873 [GESP202309 六級] 小楊買飲料 - 洛谷 題目大意: 現在超市一共有n種飲料&#…

linux 操作ppt

目錄 方法1:用 libreoffice 打開PPT文件 播放腳本: 方法2:用 python-pptx 創建和編輯PPT 方法3:其他方法 在Linux中,可以使用Python通過python-pptx庫來創建和編輯PPT文件,但直接播放PPT文件需要借助其…

元數據管理與數據治理平臺:Apache Atlas 基本搜索 Basic Search

文中內容僅限技術學習與代碼實踐參考,市場存在不確定性,技術分析需謹慎驗證,不構成任何投資建議。 Apache Atlas 框架是一套可擴展的核心基礎治理服務,使企業能夠有效、高效地滿足 Hadoop 中的合規性要求,并支持與整個…

LangChain4J-(1)-Hello World

一、LangChain4J是什么? LangChain4J 是一個專為 Java 生態系統設計的開源框架,用于簡化與大語言模型(LLM,如 OpenAI 的 GPT 系列、Google 的 Gemini、Anthropic 的 Claude 等)的集成和交互。它借鑒了 Python 生態中 L…

HTTPS應用層協議-中間攻擊人

HTTPS應用層協議-中間攻擊人 ? Man-in-the-MiddleAttack,簡稱“MITM 攻擊” 確實,在方案 2/3/4 中,客戶端獲取到公鑰 S 之后,對客戶端形成的對稱秘鑰 X 用服務端給客戶端的公鑰 S 進行加密,中間人即使竊取到了數據&am…

利用 Makefile 高效啟動 VIVADO 軟件:深入解析與實踐

利用 Makefile 高效啟動 VIVADO 軟件:深入解析與實踐 系列文章目錄 1、VMware Workstation Pro安裝指南:詳細步驟與配置選項說明 2、VMware 下 Ubuntu 操作系統下載與安裝指南 3.基于 Ubuntu 的 Linux 系統中 Vivado 2020.1 下載安裝教程 文章目錄利用 …

[前端算法]排序算法

默認情況下,sort() 會將元素轉換為字符串,然后按照 Unicode 編碼的順序進行排序: const fruits [apple, banana, cherry, date]; fruits.sort(); console.log(fruits); // 輸出: ["apple", "banana", "cherry"…

C#標簽批量打印程序開發

C#標簽批量打印程序開發(集成Bartender解決方案)一、系統架構設計 1. 核心模塊劃分 public class LabelPrintingSystem {private IDataLoader _dataLoader; // 數據加載器private ITemplateEngine _templateEngine; // 模板引擎private IPrintControl…

ECC的原理、背景、工作機制和數學基礎

ECC的原理、背景、工作機制和數學基礎摘要:本文首先詳細介紹ECC(Error-Correcting Code,糾錯碼)的原理,包括背景、工作機制和數學基礎。然后,解釋ECC在SRAM(Static Random-Access Memory&#x…