TF-IDF——自然語言處理——紅樓夢案例

目錄

一、紅樓夢數據分析

(1)紅樓夢源文件

(2)數據預處理——分卷實現思路

(3)分卷代碼

二、分卷處理,刪除停用詞,將文章轉換為標準格式

1.實現的思路及細節

2.代碼實現(遍歷所有卷的內容,并添加到內存中)

3、代碼實現“1”中剩余的步驟

(1)數據展示

(2)代碼及方法

三、計算紅樓夢分詞后文件的 TF_IDF的值


一、紅樓夢數據分析

(1)紅樓夢源文件

預計要實現的效果:觀察下面的文件截圖,我們希望將紅樓夢每一回的文件內容存在文件中,將文件的“上卷 第一回 甄士隱夢幻識通靈 賈雨村風塵懷閨秀”第幾回,這一整行作為文件的名字,每一回作為一個文件,儲存到指定的路徑下。

最終效果:

(2)數據預處理——分卷實現思路

(1)使用os是python的標準庫,讀取紅樓夢源文件

(2)以寫的格式打開一個以"紅樓夢開頭.txt"為名字的文件,用以存儲文件開頭的內容,如下:

(3)使用for循環,逐行讀取文件內容,通過觀察,每一回的開頭,都會有“卷 第 ”這樣的字,如下

我們可以通過in來判斷是否讀取到這一行,滿足條件則對這行執行strip()方法,去除行前后的空格和換行符。

(4)使用os.path.join方法構建一個完整的路徑,將路徑(根據自己的實際情況來寫)和文件名拼接在一起,這里是把前面寫的路徑,與后面讀取的文件名拼接起來了,分卷最好放置在一個單獨的文件夾中,為了更有條理。

os.path.join 會自動添加成斜杠,會根據系統自動補充路徑中的斜杠,對不同系統有適配性,windows 斜杠\,macos 斜杠/,Linux 斜杠 /。

效果

(5)關閉先前存儲文件開頭的juan_file這個文件,使用close()方法。

(6)按照上面第(4)步拼接的路徑,打開文件,然后使用continue跳出本次循環,向文件中逐行寫入第一回的內容

(7)發現在每一回的下一行都會有這樣一行內容,我們希望將其剔除,剔除方法如下:

if '手機電子書·大學生小說網' in line: #過濾掉無用的行 continue

這里表示如果發現讀取的行中存在'手機電子書·大學生小說網'這個內容,就直接跳出循環,即跳過這一行,循環讀取文件下一行的內容。

(8)按照上面的方法不斷地循環,最終我們就能將整個紅樓夢文件按照每一回存儲在一個文件中的格式將紅樓夢分卷處理。

效果:

(3)分卷代碼

import osfile=open("./data/紅樓夢/紅樓原數據/紅樓夢.txt",encoding='utf-8')    #讀取紅樓夢原數據集
juan_file=open('./data/紅樓夢/紅樓夢開頭.txt','w',encoding='utf-8')   #這里會創建并打開,以紅樓夢開頭.txt為名字的文件
#逐行讀取讀取紅樓夢.txt中的文件內容
for line in file:if '卷 第'in line:      #為了將第幾回這一行,每一回的標頭作為文件的名字,這里需要能夠識別到這樣的行,通過文字匹配來匹配,如果滿足這個條件則會執行下面的其他代碼juan_name=line.strip()+'.txt'     #去除行前后的空格和換行符,與.txt拼接成文件名path = os.path.join('.\\data\\紅樓夢\\分卷\\',juan_name)   #使用os.path.join方法將路徑和文件名拼接在一起print(path)juan_file.close()juan_file=open(path,'w',encoding='utf-8')continueif '手機電子書·大學生小說網' in line:    過濾掉無用的行continuejuan_file.write(line)     #將文件的其他內容寫入到juan_file中
juan_file.close()

二、分卷處理,刪除停用詞,將文章轉換為標準格式

(詞之間通過空格分隔),即進行分詞處理

1.實現的思路及細節

(1)遍歷所有卷的內容,并添加到內存中

(2)將紅樓夢詞庫添加到jieba庫中(jieba不一定能識別出紅樓夢中所有的詞,需要手動添加詞庫)

(3)讀取停用詞(刪除無用的詞)

(4)對每個卷進行分詞,

(5)將所有分詞后的內容寫入到分詞后匯總.txt

分詞后匯總.txt的效果為:

可以看出,紅樓夢的原文被分成上圖的格式,詞與詞之間以空格分隔,同時每一行就是一個分卷的內容,也就是每一行是一回的內容。

2.代碼實現(遍歷所有卷的內容,并添加到內存中)

(1)os.walk():os.walk是直接對文件夾進行遍歷,總共會有三個返回值第一個是文件的路徑,第二個是路徑下的文件夾,第三個是路徑下的文件。

for root,dirs,files in os.walk(r"./data/紅樓夢/分卷"):

這里我們分別用三個變量去接收,os.walk的返回值。

import pandas as pd
import os
filePaths=[]    #用于保存文件的路徑
fileContents=[]    #用于保存文件的內容for root,dirs,files in os.walk(r"./data/紅樓夢/分卷"):for name in files:    #對files進行遍歷,依次取出文件操作filePath=os.path.join(root,name)    #將文件的路徑和名字拼接到一起形成一個完整的路徑,并將路徑存儲在filepath這個變量中print(filePath)filePaths.append(filePath)    #將完整路徑存儲到filepathS這個列表中f=open(filePath,'r',encoding='utf-8')    #根據上面拼接好的路徑,打開文件fileContent=f.read()    #讀取文章內容,一次性讀取全文f.close()    #關閉文件減少內存占用fileContents.append(fileContent)    #將文章內容添加到filecontents這個列表中
corpos=pd.DataFrame(    #使用pandas的DataFrame方法,將filepath和filecontent存儲成dataframe類型{"filePath":filePaths,"fileContent":fileContents}
)
print(corpos)

corpos內部存儲的效果:每一行是一個分卷的內容,第一列是文件存儲的路徑,第二列是每個分卷的內容。

3、代碼實現“1”中剩余的步驟

(1)數據展示

紅樓夢詞庫(紅樓夢詞庫.txt):

停用詞(StopwordsCN.txt):

(2)代碼及方法

load_userdict():是jieba庫中加載新詞到jieba的辭海中,針對海量的新詞可以使用這個方法,對文件格式也有要求,文件的每一行是一個停用詞。

iterrows():遍歷pandas數據,逐行讀取,返回值有兩個,行索引和pandas類型數據的全部內容

“if seg not in stopwords.stopword.values and len(seg.strip())>0:”其中stopwords.stopword.values是stopwords變量下stopword列對應的值調用。

import jiebajieba.load_userdict(r".\data\紅樓夢\紅樓原數據\紅樓夢詞庫.txt")
#讀取停用詞
stopwords=pd.read_csv(r"./data/紅樓夢/紅樓原數據/StopwordsCN.txt",encoding='utf-8',engine='python',index_col=False)
file_to_jieba=open(r'./data/紅樓夢/分詞后匯總.txt','w',encoding='utf-8')
for index,row in corpos.iterrows():juan_ci=''filePath=row['filePath']    #獲取文件路徑fileContent=row['fileContent']     #獲取文件內容   segs=jieba.cut(fileContent)    #使用cut()方法對第一行的內容進行切分,也可以使用lcut(),并將分詞后的結果存儲在segs中for seg in segs:    #利用for循環過濾掉文章中的停用詞if seg not in stopwords.stopword.values and len(seg.strip())>0:#if如果滿足,當前詞不在停用詞中,并且詞不為空的前提下,將這個詞添加到juan_ci+保存juan_ci+=seg+' '#將沒一回的內容寫入到file_to_jieba這個文件中,我們希望每一回在同一行,所以這里在每一回的內容后加上"\n"換行符file_to_jieba.write(juan_ci+'\n')file_to_jieba.close()    #等所有分卷的內容全部寫入后關閉file_to_jieba(分詞后匯總.txt)這個文件,減少內存的占用

為什么總是把處理完成的文件保存下來呢,預處理結束將文件保存到本地,這樣做的目的是代碼分塊化實現,防止調試代碼時每次都要全部執行,每做一步將處理好的結果保存下來,可以加快調試的效率。

三、計算紅樓夢分詞后文件的 TF_IDF的值

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd#讀取分詞后匯總,并逐行讀取文件內容,存儲在corpos變量中
inFile = open(r"./data/紅樓夢/分詞后匯總.txt","r",encoding='utf-8')
corpos = inFile.readlines()#實例化對象,使用fit_transfrom計算每個詞的TF-IDF的值
vectorizer=TfidfVectorizer()
tfidf=vectorizer.fit_transform(corpos)
print(tfidf)#使用get_feature_names方法獲取紅樓夢的所有關鍵詞
wordlist=vectorizer.get_feature_names()
print(wordlist)#將tfidf轉化為稀疏矩陣
df=pd.DataFrame(tfidf.T.todense(),index=wordlist)
print(df)#逐列排序,輸出tfidf排名前十的關鍵詞及TF-IDF值
for i in range(len(corpos)):featurelist=df[[i]]feature_rank=featurelist.sort_values(by=i,ascending=False)print(f"第{i+1}回的關鍵詞是:{feature_rank[:10]}")

wordlistte特征值的個數33703個為:

輸出效果為:我們就能得到每一回的關鍵詞以及對應的TF-IDF值

代碼匯總:

此處代碼為上面的整合,去除了部分注釋,可以將其放在一個.py文件中,安裝好指定的庫即可運行,需要注意文件的路徑與你自己的文件路徑對應,數據集文件可以到我的數據集中獲取(有單獨的一篇文章注明了數據集)

"""通過os系統標準庫,讀取紅樓夢的原始數據,并將每一回的數據文本存儲到不同的txt文件中。"""import osfile=open("./data/紅樓夢/紅樓原數據/紅樓夢.txt",encoding='utf-8')    #讀取紅樓夢原數據集
juan_file=open('./data/紅樓夢/紅樓夢開頭.txt','w',encoding='utf-8')   #這里會創建并打開,以紅樓夢開頭.txt為名字的文件
#逐行讀取讀取紅樓夢.txt中的文件內容
for line in file:if '卷 第'in line:      #為了將第幾回這一行,每一回的標頭作為文件的名字,這里需要能夠識別到這樣的行,通過文字匹配來匹配,如果滿足這個條件則會執行下面的其他代碼juan_name=line.strip()+'.txt'     #去除行前后的空格和換行符,與.txt拼接成文件名path = os.path.join('.\\data\\紅樓夢\\分卷\\',juan_name)   #使用os.path.join方法將路徑和文件名拼接在一起print(path)juan_file.close()juan_file=open(path,'w',encoding='utf-8')continueif '手機電子書·大學生小說網' in line:    #過濾掉無用的行continuejuan_file.write(line)     #將文件的其他內容寫入到juan_file中
juan_file.close()import pandas as pd
import os
filePaths=[]
fileContents=[]for root,dirs,files in os.walk(r"./data/紅樓夢/分卷"):for name in files:filePath=os.path.join(root,name)print(filePath)filePaths.append(filePath)f=open(filePath,'r',encoding='utf-8')fileContent=f.read()f.close()fileContents.append(fileContent)
corpos=pd.DataFrame({"filePath":filePaths,"fileContent":fileContents}
)print(corpos)import jiebajieba.load_userdict(r".\data\紅樓夢\紅樓原數據\紅樓夢詞庫.txt")
stopwords=pd.read_csv(r"./data/紅樓夢/紅樓原數據/StopwordsCN.txt",encoding='utf-8',engine='python',index_col=False)
file_to_jieba=open(r'./data/紅樓夢/分詞后匯總.txt','w',encoding='utf-8')
for index,row in corpos.iterrows():juan_ci=''filePath=row['filePath']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()from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pdinFile = open(r"./data/紅樓夢/分詞后匯總.txt","r",encoding='utf-8')
corpos = inFile.readlines()vectorizer=TfidfVectorizer()
tfidf=vectorizer.fit_transform(corpos)
print(tfidf)wordlist=vectorizer.get_feature_names()
print(wordlist)df=pd.DataFrame(tfidf.T.todense(),index=wordlist)
print(df)for i in range(len(corpos)):featurelist=df[[i]]feature_rank=featurelist.sort_values(by=i,ascending=False)print(f"第{i+1}回的關鍵詞是:{feature_rank[:10]}")

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

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

相關文章

【NLP 面經 5】

難以承受的東西只會讓我在下一次更平靜的面對 —— 25.4.2 一、NER任務,CRF模型改進 命名實體識別(NER)任務中,你使用基于條件隨機場(CRF)的模型,然而模型在識別嵌套實體和重疊實體時效果不佳&a…

機器學習之回歸算法

《數據挖掘技術與應用》 【實驗名稱】 實驗:回歸算法 【實驗目的】 1.了解回歸算法理論基礎 2.平臺實現算法 3. 編程實現分類算法 【實驗原理】 線性回歸是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法&…

Cline源碼分析

Cline源碼分析 --- vscode插件開發與cline的界面系統 vscode插件開發基礎知識開發基礎?核心概念核心API調試與發布調試 學習路線React開發界面前端代碼分析package.jsonview/title(視圖標題欄菜單)?editor/title(編輯器標題欄菜單&#xff…

k8s EmptyDir(空目錄)詳解

1. 定義與特性 emptyDir 是 Kubernetes 中一種臨時存儲卷類型,其生命周期與 Pod 完全綁定。當 Pod 被創建時,emptyDir 會在節點上生成一個空目錄;當 Pod 被刪除時,該目錄及其數據會被永久清除。它主要用于同一 Pod 內多個容器間的…

【idea】實用插件

SonarLint SonarLint:代碼質量掃描工具 使用 SonarLint 可以幫助我們發現代碼的問題,并且還提供了相應的解決方案. 對于每一個問題,SonarLint 都給出了示例,還有相應的解決方案,教我們怎么修改,極大的方便了我們的開發…

【mysql 的安裝及使用】

MySQL 9.0 一、下載MySQL[MySQL 9.0 下載] [(https://dev.mysql.com/downloads/mysql/)選擇自定義,選擇合適安裝路徑二、檢查安裝情況配置環境變量打開命令行查看版本創建數據庫在MySQL中,可以使用create database語句來創建數據庫。以下是創建一個名為my_db的數據庫的示例:…

leetcode118.楊輝三角

思路源自 【LeetCode 每日一題】118. 楊輝三角 | 手寫圖解版思路 代碼講解 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> result new ArrayList<>();for (int i 0; i < numRows; i) {List<…

【git】git pull 和 git rebase

git pull 和 git rebase 都是 Git 中用于同步代碼的命令&#xff0c;但它們的工作方式和適用場景有顯著區別。以下是兩者的詳細對比&#xff1a; 1. 核心區別 特性git pullgit rebase本質git fetch git merge&#xff08;默認&#xff09;將當前分支的提交“重新播放”到目標…

DIY搭建網站(學術個人介紹主頁)

本教程介紹了如何創建并管理一個基于GitHub Pages的個人網站。首先&#xff0c;需要在GitHub上創建一個遵循特定命名規則的新倉庫&#xff0c;例如用戶名.github.io&#xff0c;以便建立個人站點。接著&#xff0c;通過Fork一個開源模板代碼倉庫并添加index.html文件來構建主頁…

數據結構初階:二叉樹的前中后序三種遍歷(遞歸的暴力美學)

想要實現二叉樹的遍歷可以創建一個鏈式結構的二叉樹 回顧一下二叉樹的概念&#xff0c;二叉樹分為空樹和非空二叉樹&#xff0c;非空二叉樹由根節點、根節點的左子樹和根節點的右子樹組成。 typedef char BTDataType; // 數據類型 typedef struct BinaryTreeNode {B…

WebUI問題總結

修改WebUI代碼時遇到的一些問題以及解決辦法 1. thttpd服務器環境的搭建 可參考《thttpd安裝與啟動流程》這一篇文章 其中遇到的問題有 thttpd版本問題&#xff1a;版本過舊會導致安裝失敗&#xff0c;盡量安裝新版本thttpd的啟動命令失敗的話要加上sudo修改文件權限&#…

【C++重點】deque

C queue 容器介紹 queue 是 C 標準庫中的一個容器適配器&#xff0c;它實現了先進先出&#xff08;FIFO&#xff09;數據結構。即&#xff0c;元素按照插入的順序排隊&#xff0c;首先插入的元素最先出隊。queue 適用于需要排隊處理任務的場景&#xff0c;比如消息隊列、任務調…

透過 /proc 看見內核:Linux 虛擬文件系統與 systemd 初始化初探

當我們在終端中輸入 ps、top、cat /proc/cpuinfo 等命令時&#xff0c;是否思考過這些信息來自哪里&#xff1f;為什么無需啟動任何守護進程&#xff0c;就能實時讀取系統負載、內存占用&#xff0c;甚至內核版本&#xff1f;這一切的答案&#xff0c;都藏在 Linux 系統中的一個…

操作系統(中斷 異常 陷阱) ─── linux第28課

目錄 1.硬件中斷 2. 時鐘中斷 3. OS本質 4. 軟件中斷 缺頁中斷&#xff1f;內存碎片處理&#xff1f;除零野指針錯誤&#xff1f; 操作系統本質總結 操作系統是對軟件硬件資源管理的軟件 1.硬件中斷 中斷向量表(IDT)就是操作系統的?部分&#xff0c;啟動就加載到內存中了…

文件分片上傳

1前端 <inputtype"file"accept".mp4"ref"videoInput"change"handleVideoChange"style"display: none;">2生成hash // 根據整個文件的文件名和大小組合的字符串生成hash值&#xff0c;大概率確定文件的唯一性fhash(f…

機器學習的一百個概念(5)數據增強

前言 本文隸屬于專欄《機器學習的一百個概念》&#xff0c;該專欄為筆者原創&#xff0c;引用請注明來源&#xff0c;不足和錯誤之處請在評論區幫忙指出&#xff0c;謝謝&#xff01; 本專欄目錄結構和參考文獻請見[《機器學習的一百個概念》 ima 知識庫 知識庫廣場搜索&…

基于微信小程序的智慧鄉村旅游服務平臺【附源碼】

基于微信小程序的智慧鄉村旅游服務平臺&#xff08;源碼L文說明文檔&#xff09; 目錄 4系統設計 4.1系統功能設計 4.2系統結構 4.3.數據庫設計 4.3.1數據庫實體 4.3.2數據庫設計表 5系統詳細實現 5.1 管理員模塊的實現 5.1.1旅游景點管理…

數據驅動的智能BMS革新:機器學習賦能電池健康預測與安全協同優化

傳統電池管理系統&#xff08;BMS&#xff09;依賴等效電路模型和固定參數算法&#xff0c;面臨電化學機理復雜、老化行為非線性、多工況適應性差等瓶頸。例如&#xff0c;健康狀態&#xff08;SOH&#xff09;和荷電狀態&#xff08;SOC&#xff09;估算易受溫度、循環次數及電…

使用JSON.stringify報錯:Uncaught TypeError: cyclic object value

具體錯誤 Uncaught TypeError: cyclic object valueonMouseOver Amap.vue:125renderMarker Amap.vue:84emit maps:1emit maps:1ci maps:1ui maps:1fireEvent maps:1jL maps:1Xt maps:1T maps:1<anonymous> amap.vue:49promise callback*nextTick runtime-core.esm-bundl…

Spring Boot 工程創建詳解

2025/4/2 向全棧工程師邁進&#xff01; 一、SpingBoot工程文件的創建 點擊Project Structure 然后按著如下點擊 最后選擇Spring Boot &#xff0c;同時記得選擇是Maven和jar&#xff0c;而不是war。因為Boot工程內置了Tomcat&#xff0c;所以不需要war。 緊接著選擇Spring We…