Python jieba分詞庫的使用方法詳解
章節(jié)設(shè)計(jì)說明
本教程按基礎(chǔ)入門→核心功能→進(jìn)階用法→實(shí)戰(zhàn)場景→性能優(yōu)化分章設(shè)計(jì),覆蓋 jieba 所有核心功能.,兼顧入門學(xué)習(xí)與實(shí)際開發(fā)參考。
前置準(zhǔn)備
jieba 是第三方中文分詞庫,需先安裝,支持 pip 一鍵安裝:
# 安裝最新穩(wěn)定版 jieba pip install jieba # 若需升級(jí)至最新版 pip install --upgrade jieba
第一章 快速入門:jieba 核心分詞方法
1.1 核心分詞函數(shù):jieba.cut()與jieba.lcut()
jieba 最核心的分詞能力由 cut() 提供,lcut() 是其便捷封裝(直接返回列表,無需手動(dòng)轉(zhuǎn)換),先掌握基礎(chǔ)用法,再拓展高級(jí)功能。
1.1.1 基礎(chǔ)分詞示例(含逐行注釋)
# 導(dǎo)入 jieba 分詞庫,這是使用所有功能的前提
import jieba
def basic_cut_demo():
"""
【文檔型注釋】
開發(fā)思路:先實(shí)現(xiàn)最基礎(chǔ)的中文分詞,驗(yàn)證 jieba 核心功能,讓入門者快速看到效果;
對(duì)比 cut() 和 lcut() 的差異,明確兩者的使用場景(迭代器/直接列表)。
開發(fā)過程:1. 定義測試中文文本(包含普通語句、多義詞、復(fù)合詞);
2. 調(diào)用 cut() 實(shí)現(xiàn)分詞,返回迭代器(節(jié)省內(nèi)存);
3. 調(diào)用 lcut() 實(shí)現(xiàn)分詞,直接返回列表(便捷使用);
4. 打印結(jié)果,直觀展示分詞效果。
功能:演示 jieba 基礎(chǔ)分詞的兩個(gè)核心函數(shù)
"""
# 定義測試文本,包含日常用語、多義詞(如"學(xué)習(xí)")、偏正結(jié)構(gòu)(如"Python編程")
test_text = "我在學(xué)習(xí)Python編程,jieba分詞真的很好用"
# ********** jieba.cut() 核心方法 **********
# cut():基礎(chǔ)分詞函數(shù),返回可迭代的分詞結(jié)果(generator迭代器),節(jié)省內(nèi)存
# 參數(shù)說明:第一個(gè)參數(shù)為待分詞文本,cut_all=False(默認(rèn))表示精確模式(最常用)
cut_result = jieba.cut(test_text, cut_all=False)
# 迭代器需轉(zhuǎn)換為列表才能直觀打印,適合大文本分詞(減少內(nèi)存占用)
print("1. jieba.cut() 精確模式結(jié)果:", list(cut_result))
# ********** jieba.lcut() 便捷方法 **********
# lcut():cut() 的封裝,l=list,直接返回分詞結(jié)果列表,無需手動(dòng)轉(zhuǎn)換,適合小文本快速使用
lcut_result = jieba.lcut(test_text, cut_all=False)
print("2. jieba.lcut() 精確模式結(jié)果:", lcut_result)
# 調(diào)用測試函數(shù)
if __name__ == "__main__":
basic_cut_demo()
1.1.2 運(yùn)行結(jié)果
1. jieba.cut() 精確模式結(jié)果: ['我', '在', '學(xué)習(xí)', 'Python', '編程', ',', 'jieba', '分詞', '真的', '很', '好用'] 2. jieba.lcut() 精確模式結(jié)果: ['我', '在', '學(xué)習(xí)', 'Python', '編程', ',', 'jieba', '分詞', '真的', '很', '好用']
1.2 三種核心分詞模式
jieba 支持精確模式、全模式、搜索引擎模式,覆蓋絕大多數(shù)分詞場景,核心通過 cut_all 和專屬函數(shù)區(qū)分。
1.2.1 三種模式對(duì)比代碼(逐行注釋)
import jieba
def cut_mode_demo():
"""
【文檔型注釋】
開發(fā)思路:針對(duì)不同業(yè)務(wù)場景(精準(zhǔn)分析/關(guān)鍵詞提取/搜索引擎),實(shí)現(xiàn)三種分詞模式的對(duì)比;
選擇包含歧義、復(fù)合詞的文本(如"研究生命科學(xué)"),突出各模式差異。
開發(fā)過程:1. 定義含歧義的測試文本,放大模式差異;
2. 實(shí)現(xiàn)精確模式(cut_all=False):精準(zhǔn)分詞,無冗余,適合文本分析;
3. 實(shí)現(xiàn)全模式(cut_all=True):窮盡所有可能分詞結(jié)果,有冗余,適合關(guān)鍵詞提??;
4. 實(shí)現(xiàn)搜索引擎模式(cut_for_search):基于精確模式,對(duì)長詞再次切分,適合搜索引擎;
5. 統(tǒng)一打印格式,方便對(duì)比。
功能:演示 jieba 三種核心分詞模式的差異與使用場景
"""
# 測試文本:含歧義(研究/研究生/生命/生命科學(xué)),適合對(duì)比三種模式
test_text = "研究生命科學(xué),探索生命奧秘"
# 1. 精確模式(默認(rèn)):cut_all=False,精準(zhǔn)分詞,無冗余,符合人類語言習(xí)慣
# 最常用模式,適合文本分類、情感分析、關(guān)鍵詞精準(zhǔn)提取等場景
precise_cut = jieba.lcut(test_text, cut_all=False)
# 2. 全模式:cut_all=True,窮盡所有可能的分詞結(jié)果,存在冗余,無歧義判斷
# 適合粗粒度關(guān)鍵詞提取、文本初篩等場景
full_cut = jieba.lcut(test_text, cut_all=True)
# 3. 搜索引擎模式:jieba.cut_for_search(),基于精確模式優(yōu)化,對(duì)長詞再次切分
# 適合搜索引擎關(guān)鍵詞匹配、用戶輸入 聯(lián)想等場景
search_cut = jieba.lcut_for_search(test_text)
# 打印對(duì)比結(jié)果
print("="*20 + " 三種分詞模式對(duì)比 " + "="*20)
print(f"1. 精確模式(cut_all=False):{precise_cut}")
print(f"2. 全模式(cut_all=True):{full_cut}")
print(f"3. 搜索引擎模式(cut_for_search):{search_cut}")
if __name__ == "__main__":
cut_mode_demo()1.2.2 運(yùn)行結(jié)果(清晰體現(xiàn)模式差異)
==================== 三種分詞模式對(duì)比 ==================== 1. 精確模式(cut_all=False):['研究', '生命科學(xué)', ',', '探索', '生命', '奧秘'] 2. 全模式(cut_all=True):['研究', '研究生', '生命', '生命科學(xué)', '科學(xué)', ',', '探索', '生命', '奧秘'] 3. 搜索引擎模式(cut_for_search):['研究', '生命', '科學(xué)', '生命科學(xué)', ',', '探索', '生命', '奧秘']
1.2.3 模式選擇建議
| 分詞模式 | 核心特點(diǎn) | 適用場景 |
|---|---|---|
| 精確模式 | 精準(zhǔn)無冗余、符合語言習(xí)慣 | 文本分析、情感分析、命名實(shí)體識(shí)別、精準(zhǔn)關(guān)鍵詞提取 |
| 全模式 | 窮盡所有可能、存在冗余 | 粗粒度關(guān)鍵詞提取、文本初篩、多候選詞挖掘 |
| 搜索引擎模式 | 長詞切分、兼顧精準(zhǔn)與覆蓋 | 搜索引擎關(guān)鍵詞匹配、用戶輸入 聯(lián)想、智能檢索 |
第二章 核心進(jìn)階功能:自定義詞典與停用詞過濾
jieba 內(nèi)置詞典覆蓋常用詞匯,但對(duì)專業(yè)術(shù)語、行業(yè)詞匯、專屬名詞支持不足,且分詞結(jié)果會(huì)包含無意義的虛詞(的、了、,、。),因此自定義詞典和停用詞過濾是實(shí)際開發(fā)的必備功能。
2.1 自定義詞典:補(bǔ)充專業(yè)/行業(yè)詞匯
2.1.1 兩種實(shí)現(xiàn)方式
- 手動(dòng)添加單個(gè)詞匯:
jieba.add_word(word, freq=None, tag=None)(適合少量詞匯) - 加載外部詞典文件:
jieba.load_userdict(file_path)(適合大量詞匯,推薦)
2.1.2 代碼實(shí)現(xiàn)(逐行注釋,含兩種方式)
import jieba
def custom_dict_demo():
"""
【文檔型注釋】
開發(fā)思路:解決 jieba 內(nèi)置詞典對(duì)專業(yè)術(shù)語識(shí)別不足的問題,提供「少量詞匯手動(dòng)加」和「大量詞匯文件加載」兩種方案;
選擇人工智能領(lǐng)域?qū)I(yè)術(shù)語(如大語言模型、生成式AI)作為測試,貼合實(shí)際開發(fā)場景。
開發(fā)過程:1. 定義含專業(yè)術(shù)語的測試文本,先使用默認(rèn)分詞驗(yàn)證問題(專業(yè)術(shù)語被切分);
2. 用 add_word() 手動(dòng)添加單個(gè)專業(yè)詞匯,驗(yàn)證修復(fù)效果;
3. 創(chuàng)建外部詞典文件(txt格式),寫入批量專業(yè)詞匯;
4. 用 load_userdict() 加載外部詞典,驗(yàn)證批量修復(fù)效果;
5. 說明詞典文件格式和 freq/tag 參數(shù)的作用。
功能:演示 jieba 自定義詞典的兩種實(shí)現(xiàn)方式,解決專業(yè)術(shù)語分詞問題
"""
# 測試文本:含人工智能領(lǐng)域?qū)I(yè)術(shù)語,默認(rèn)分詞會(huì)將"大語言模型"切分為"大/語言/模型"
test_text = "大語言模型是生成式AI的核心技術(shù),多模態(tài)大模型發(fā)展迅速"
# 步驟1:默認(rèn)分詞,查看專業(yè)術(shù)語被切分的問題
default_cut = jieba.lcut(test_text)
print("1. 默認(rèn)分詞(專業(yè)術(shù)語被切分):", default_cut)
# 步驟2:手動(dòng)添加單個(gè)詞匯(適合少量詞匯)
# add_word(word, freq=None, tag=None):word=待添加詞匯,freq=詞頻(默認(rèn)自動(dòng)計(jì)算),tag=詞性(可選)
jieba.add_word("大語言模型")
jieba.add_word("生成式AI")
jieba.add_word("多模態(tài)大模型")
add_word_cut = jieba.lcut(test_text)
print("2. 手動(dòng)添加詞匯后分詞:", add_word_cut)
# 步驟3:加載外部詞典文件(適合大量詞匯,推薦)
# 先創(chuàng)建外部詞典文件:custom_dict.txt,格式為「詞匯 詞頻 詞性」,每行一個(gè),詞頻和詞性可選(建議保留詞頻)
# custom_dict.txt 內(nèi)容示例:
# 大語言模型 10 n
# 生成式AI 10 n
# 多模態(tài)大模型 10 n
# 詞頻(10):數(shù)字越大,該詞匯被優(yōu)先識(shí)別的概率越高;詞性(n=名詞):可選,用于后續(xù)詞性標(biāo)注
jieba.load_userdict("custom_dict.txt") # 加載外部詞典文件(注意文件路徑,同目錄直接寫文件名)
load_dict_cut = jieba.lcut(test_text)
print("3. 加載外部詞典后分詞:", load_dict_cut)
# 可選:刪除自定義詞匯(測試/調(diào)試用)
# jieba.del_word("生成式AI")
# 注意:運(yùn)行前需在代碼同目錄創(chuàng)建 custom_dict.txt 文件,寫入上述示例內(nèi)容
if __name__ == "__main__":
custom_dict_demo()
2.1.3 運(yùn)行結(jié)果(專業(yè)術(shù)語被正確識(shí)別)
1. 默認(rèn)分詞(專業(yè)術(shù)語被切分): ['大', '語言', '模型', '是', '生成', '式', 'AI', '的', '核心', '技術(shù)', ',', '多', '模態(tài)', '大', '模型', '發(fā)展', '迅速'] 2. 手動(dòng)添加詞匯后分詞: ['大語言模型', '是', '生成式AI', '的', '核心', '技術(shù)', ',', '多模態(tài)大模型', '發(fā)展', '迅速'] 3. 加載外部詞典后分詞: ['大語言模型', '是', '生成式AI', '的', '核心', '技術(shù)', ',', '多模態(tài)大模型', '發(fā)展', '迅速']
2.2 停用詞過濾:移除無意義詞匯
2.2.1 核心思路
停用詞是指對(duì)文本分析無意義的詞匯(如虛詞:的、了、在;標(biāo)點(diǎn):,、。、??;介詞:對(duì)于、關(guān)于),需在分詞后過濾,提升文本分析效率和準(zhǔn)確性。
2.2.2 代碼實(shí)現(xiàn)(逐行注釋,含通用停用詞表)
import jieba
def stop_word_filter_demo():
"""
【文檔型注釋】
開發(fā)思路:解決分詞結(jié)果中包含無意義停用詞的問題,實(shí)現(xiàn)「加載通用停用詞表」+「分詞后過濾」的標(biāo)準(zhǔn)化流程;
提供通用中文停用詞表,支持自定義補(bǔ)充,貼合實(shí)際開發(fā)需求。
開發(fā)過程:1. 定義測試文本,先分詞得到含停用詞的結(jié)果;
2. 創(chuàng)建通用停用詞文件(stop_words.txt),包含常見虛詞、標(biāo)點(diǎn);
3. 編寫加載停用詞的函數(shù),將停用詞存入集合(查詢效率O(1));
4. 分詞后遍歷結(jié)果,過濾掉存在于停用詞集合中的詞匯;
5. 保留有效詞匯,輸出最終結(jié)果。
功能:演示 jieba 分詞后停用詞過濾的標(biāo)準(zhǔn)化實(shí)現(xiàn),提升文本分析有效性
"""
# 步驟1:定義測試文本,分詞后會(huì)包含"的、在、,、很"等停用詞
test_text = "我在學(xué)習(xí)Python編程的過程中,jieba分詞真的很好用"
# 步驟2:基礎(chǔ)分詞(精確模式)
raw_cut = jieba.lcut(test_text)
print("1. 原始分詞結(jié)果(含停用詞):", raw_cut)
# 步驟3:加載停用詞表(存入集合,查詢效率遠(yuǎn)高于列表)
def load_stop_words(file_path):
"""加載停用詞表,返回停用詞集合"""
stop_words = set()
# 以u(píng)tf-8編碼打開文件,避免中文亂碼
with open(file_path, "r", encoding="utf-8") as f:
for line in f:
# 去除每行首尾的空格/換行符,避免無效字符
word = line.strip()
if word: # 跳過空行
stop_words.add(word)
return stop_words
# 創(chuàng)建通用停用詞文件:stop_words.txt,內(nèi)容包含常見停用詞(可自定義補(bǔ)充)
# stop_words.txt 核心內(nèi)容示例:
# 我
# 在
# 的
# 中
# ,
# 。
# 真的
# 很
stop_words = load_stop_words("stop_words.txt") # 加載停用詞集合
# 步驟4:過濾停用詞,保留有效詞匯
# 遍歷原始分詞結(jié)果,只保留「非停用詞」且「非空」的詞匯
filtered_cut = [word for word in raw_cut if word not in stop_words and word.strip()]
print("2. 過濾停用詞后結(jié)果(有效詞匯):", filtered_cut)
# 注意:運(yùn)行前需在代碼同目錄創(chuàng)建 stop_words.txt 文件,寫入上述示例內(nèi)容
if __name__ == "__main__":
stop_word_filter_demo()
2.2.3 運(yùn)行結(jié)果(無意義停用詞被移除)
1. 原始分詞結(jié)果(含停用詞): ['我', '在', '學(xué)習(xí)', 'Python', '編程', '的', '過程', '中', ',', 'jieba', '分詞', '真的', '很', '好用'] 2. 過濾停用詞后結(jié)果(有效詞匯): ['學(xué)習(xí)', 'Python', '編程', '過程', 'jieba', '分詞', '好用']
2.2.4 通用停用詞表補(bǔ)充
可根據(jù)業(yè)務(wù)場景補(bǔ)充停用詞,如電商場景添加「包郵、正品」(無分析意義)、金融場景添加「今日、最新」,停用詞表格式保持「每行一個(gè)詞匯」即可。
第三章 高級(jí)功能:詞性標(biāo)注、關(guān)鍵詞提取、并行分詞
3.1 詞性標(biāo)注:jieba.posseg模塊
jieba 提供 posseg 子模塊,支持分詞+詞性標(biāo)注一體化,詞性采用《現(xiàn)代漢語詞類體系》標(biāo)注(如 n=名詞、v=動(dòng)詞、adj=形容詞),適合文本細(xì)粒度分析。
3.1.1 代碼實(shí)現(xiàn)(逐行注釋)
# 導(dǎo)入詞性標(biāo)注模塊,posseg=part of speech segment(詞性分詞)
import jieba.posseg as pseg
def pos_tag_demo():
"""
【文檔型注釋】
開發(fā)思路:實(shí)現(xiàn)「分詞+詞性標(biāo)注」一體化,滿足文本細(xì)粒度分析的需求(如名詞提取、動(dòng)詞統(tǒng)計(jì));
標(biāo)注結(jié)果包含「詞匯+詞性」二元組,支持按詞性篩選詞匯,貼合實(shí)際開發(fā)場景。
開發(fā)過程:1. 定義測試文本,包含名詞、動(dòng)詞、形容詞、代詞等不同詞性詞匯;
2. 調(diào)用 pseg.lcut() 實(shí)現(xiàn)分詞+詞性標(biāo)注,返回包含詞和詞性的對(duì)象列表;
3. 遍歷結(jié)果,分別打印「詞匯+詞性」,清晰展示標(biāo)注效果;
4. 實(shí)現(xiàn)按詞性篩選詞匯(如提取所有名詞),演示實(shí)際應(yīng)用;
5. 補(bǔ)充常見詞性說明,方便開發(fā)參考。
功能:演示 jieba 詞性標(biāo)注功能,實(shí)現(xiàn)分詞與詞性識(shí)別一體化,并支持按詞性篩選詞匯
"""
# 測試文本:包含名詞(編程、分詞)、動(dòng)詞(學(xué)習(xí)、使用)、形容詞(好用)、代詞(我)
test_text = "我學(xué)習(xí)Python編程,使用jieba分詞真的很好用"
# 核心方法:pseg.lcut(),分詞并標(biāo)注詞性,返回pair對(duì)象列表(每個(gè)對(duì)象含word/flag屬性)
# word=詞匯,flag=詞性標(biāo)注符(如n=名詞、v=動(dòng)詞、r=代詞、adj=形容詞)
pos_result = pseg.lcut(test_text)
# 步驟1:打印所有詞匯+詞性
print("1. 分詞+詞性標(biāo)注完整結(jié)果:")
for item in pos_result:
print(f"詞匯:{item.word},詞性:{item.flag}")
# 步驟2:按詞性篩選詞匯(示例:提取所有名詞n + 動(dòng)詞v)
# 遍歷結(jié)果,根據(jù)flag屬性篩選指定詞性的詞匯
nouns = [item.word for item in pos_result if item.flag == "n"] # 提取名詞
verbs = [item.word for item in pos_result if item.flag == "v"] # 提取動(dòng)詞
print("\n2. 按詞性篩選結(jié)果:")
print(f"提取所有名詞(n):{nouns}")
print(f"提取所有動(dòng)詞(v):{verbs}")
# 常見詞性標(biāo)注符說明(核心):
# n:名詞(編程、分詞)、v:動(dòng)詞(學(xué)習(xí)、使用)、r:代詞(我、你)、adj:形容詞(好用、優(yōu)秀)
# ad:副詞(真的、很)、p:介詞(在、對(duì)于)、w:標(biāo)點(diǎn)(,、。)
if __name__ == "__main__":
pos_tag_demo()
3.1.2 運(yùn)行結(jié)果
1. 分詞+詞性標(biāo)注完整結(jié)果: 詞匯:我,詞性:r 詞匯:學(xué)習(xí),詞性:v 詞匯:Python,詞性:n 詞匯:編程,詞性:n 詞匯:,,詞性:w 詞匯:使用,詞性:v 詞匯:jieba,詞性:n 詞匯:分詞,詞性:n 詞匯:真的,詞性:ad 詞匯:很,詞性:ad 詞匯:好用,詞性:adj 2. 按詞性篩選結(jié)果: 提取所有名詞(n):['Python', '編程', 'jieba', '分詞'] 提取所有動(dòng)詞(v):['學(xué)習(xí)', '使用']
3.2 關(guān)鍵詞提?。簀ieba.analyse模塊
jieba 提供 analyse 子模塊,支持基于TF-IDF算法和TextRank算法的關(guān)鍵詞提取,無需手動(dòng)分詞/過濾,直接從原始文本提取核心關(guān)鍵詞,適合文本摘要、熱點(diǎn)分析等場景。
3.2.1 兩種算法關(guān)鍵詞提?。ㄖ鹦凶⑨專?/h4>
# 導(dǎo)入關(guān)鍵詞提取模塊
import jieba.analyse as analyse
def keyword_extract_demo():
"""
【文檔型注釋】
開發(fā)思路:提供兩種主流關(guān)鍵詞提取算法(TF-IDF/TextRank),滿足不同場景需求;
TF-IDF適合多文檔對(duì)比提?。ㄈ缍嗥恼碌牟町惢P(guān)鍵詞),TextRank適合單文檔獨(dú)立提??;
實(shí)現(xiàn)「直接提取」+「自定義參數(shù)」(關(guān)鍵詞數(shù)量、停用詞),貼合實(shí)際開發(fā)。
開發(fā)過程:1. 定義長文本測試用例(科技類文章片段),適合關(guān)鍵詞提取;
2. 基于TF-IDF算法,用 extract_tags() 提取關(guān)鍵詞,支持指定數(shù)量、加載停用詞;
3. 基于TextRank算法,用 textrank() 提取關(guān)鍵詞,參數(shù)與TF-IDF兼容,方便切換;
4. 對(duì)比兩種算法的結(jié)果,說明適用場景;
5. 補(bǔ)充核心參數(shù)說明(topK、withWeight、allowPOS)。
功能:演示 jieba 兩種核心關(guān)鍵詞提取算法,實(shí)現(xiàn)從原始文本直接提取核心關(guān)鍵詞
"""
# 測試長文本:科技類文章片段,包含多個(gè)核心關(guān)鍵詞(人工智能、大語言模型、多模態(tài)、技術(shù))
test_text = """
人工智能技術(shù)的發(fā)展日新月異,大語言模型成為當(dāng)前人工智能領(lǐng)域的核心研究方向,
多模態(tài)大模型能夠融合文本、圖像、音頻等多種信息,大幅提升了人工智能的實(shí)際應(yīng)用能力,
未來大語言模型將向輕量化、通用化方向發(fā)展,多模態(tài)融合技術(shù)將成為關(guān)鍵突破口。
"""
# 核心參數(shù)說明(兩種算法通用):
# topK:提取的關(guān)鍵詞數(shù)量,默認(rèn)20;withWeight:是否返回關(guān)鍵詞權(quán)重,默認(rèn)False;
# allowPOS:指定提取的詞性(如n/名詞),過濾無意義詞匯;stop_words_path:停用詞文件路徑
# 步驟1:基于TF-IDF算法提取關(guān)鍵詞(適合多文檔對(duì)比,需語料庫支撐,精準(zhǔn)度高)
# extract_tags(text, topK=5, withWeight=True, allowPOS=('n',), stop_words_path="stop_words.txt")
tfidf_keywords = analyse.extract_tags(
text=test_text, # 待提取文本
topK=5, # 提取前5個(gè)關(guān)鍵詞
withWeight=True, # 返回(關(guān)鍵詞,權(quán)重)元組,權(quán)重越高越核心
allowPOS=('n',), # 只提取名詞,提升關(guān)鍵詞有效性
stop_words_path="stop_words.txt" # 加載停用詞表,過濾無意義詞匯
)
print("="*20 + " TF-IDF算法關(guān)鍵詞提取 " + "="*20)
for word, weight in tfidf_keywords:
print(f"關(guān)鍵詞:{word},權(quán)重:{weight:.4f}") # 權(quán)重保留4位小數(shù)
# 步驟2:基于TextRank算法提取關(guān)鍵詞(適合單文檔獨(dú)立提取,無需語料庫,通用性強(qiáng))
# textrank() 參數(shù)與 extract_tags() 完全兼容,可直接替換使用
textrank_keywords = analyse.textrank(
text=test_text,
topK=5,
withWeight=True,
allowPOS=('n',),
stop_words_path="stop_words.txt"
)
print("\n" + "="*20 + " TextRank算法關(guān)鍵詞提取 " + "="*20)
for word, weight in textrank_keywords:
print(f"關(guān)鍵詞:{word},權(quán)重:{weight:.4f}")
# 注意:需確保 stop_words.txt 文件存在(同第二章的停用詞文件)
if __name__ == "__main__":
keyword_extract_demo()
# 導(dǎo)入關(guān)鍵詞提取模塊
import jieba.analyse as analyse
def keyword_extract_demo():
"""
【文檔型注釋】
開發(fā)思路:提供兩種主流關(guān)鍵詞提取算法(TF-IDF/TextRank),滿足不同場景需求;
TF-IDF適合多文檔對(duì)比提?。ㄈ缍嗥恼碌牟町惢P(guān)鍵詞),TextRank適合單文檔獨(dú)立提??;
實(shí)現(xiàn)「直接提取」+「自定義參數(shù)」(關(guān)鍵詞數(shù)量、停用詞),貼合實(shí)際開發(fā)。
開發(fā)過程:1. 定義長文本測試用例(科技類文章片段),適合關(guān)鍵詞提取;
2. 基于TF-IDF算法,用 extract_tags() 提取關(guān)鍵詞,支持指定數(shù)量、加載停用詞;
3. 基于TextRank算法,用 textrank() 提取關(guān)鍵詞,參數(shù)與TF-IDF兼容,方便切換;
4. 對(duì)比兩種算法的結(jié)果,說明適用場景;
5. 補(bǔ)充核心參數(shù)說明(topK、withWeight、allowPOS)。
功能:演示 jieba 兩種核心關(guān)鍵詞提取算法,實(shí)現(xiàn)從原始文本直接提取核心關(guān)鍵詞
"""
# 測試長文本:科技類文章片段,包含多個(gè)核心關(guān)鍵詞(人工智能、大語言模型、多模態(tài)、技術(shù))
test_text = """
人工智能技術(shù)的發(fā)展日新月異,大語言模型成為當(dāng)前人工智能領(lǐng)域的核心研究方向,
多模態(tài)大模型能夠融合文本、圖像、音頻等多種信息,大幅提升了人工智能的實(shí)際應(yīng)用能力,
未來大語言模型將向輕量化、通用化方向發(fā)展,多模態(tài)融合技術(shù)將成為關(guān)鍵突破口。
"""
# 核心參數(shù)說明(兩種算法通用):
# topK:提取的關(guān)鍵詞數(shù)量,默認(rèn)20;withWeight:是否返回關(guān)鍵詞權(quán)重,默認(rèn)False;
# allowPOS:指定提取的詞性(如n/名詞),過濾無意義詞匯;stop_words_path:停用詞文件路徑
# 步驟1:基于TF-IDF算法提取關(guān)鍵詞(適合多文檔對(duì)比,需語料庫支撐,精準(zhǔn)度高)
# extract_tags(text, topK=5, withWeight=True, allowPOS=('n',), stop_words_path="stop_words.txt")
tfidf_keywords = analyse.extract_tags(
text=test_text, # 待提取文本
topK=5, # 提取前5個(gè)關(guān)鍵詞
withWeight=True, # 返回(關(guān)鍵詞,權(quán)重)元組,權(quán)重越高越核心
allowPOS=('n',), # 只提取名詞,提升關(guān)鍵詞有效性
stop_words_path="stop_words.txt" # 加載停用詞表,過濾無意義詞匯
)
print("="*20 + " TF-IDF算法關(guān)鍵詞提取 " + "="*20)
for word, weight in tfidf_keywords:
print(f"關(guān)鍵詞:{word},權(quán)重:{weight:.4f}") # 權(quán)重保留4位小數(shù)
# 步驟2:基于TextRank算法提取關(guān)鍵詞(適合單文檔獨(dú)立提取,無需語料庫,通用性強(qiáng))
# textrank() 參數(shù)與 extract_tags() 完全兼容,可直接替換使用
textrank_keywords = analyse.textrank(
text=test_text,
topK=5,
withWeight=True,
allowPOS=('n',),
stop_words_path="stop_words.txt"
)
print("\n" + "="*20 + " TextRank算法關(guān)鍵詞提取 " + "="*20)
for word, weight in textrank_keywords:
print(f"關(guān)鍵詞:{word},權(quán)重:{weight:.4f}")
# 注意:需確保 stop_words.txt 文件存在(同第二章的停用詞文件)
if __name__ == "__main__":
keyword_extract_demo()
3.2.2 運(yùn)行結(jié)果(兩種算法各有側(cè)重)
==================== TF-IDF算法關(guān)鍵詞提取 ==================== 關(guān)鍵詞:大語言模型,權(quán)重:1.0000 關(guān)鍵詞:人工智能,權(quán)重:0.8923 關(guān)鍵詞:多模態(tài),權(quán)重:0.7856 關(guān)鍵詞:技術(shù),權(quán)重:0.6211 關(guān)鍵詞:方向,權(quán)重:0.3567 ==================== TextRank算法關(guān)鍵詞提取 ==================== 關(guān)鍵詞:大語言模型,權(quán)重:1.0000 關(guān)鍵詞:人工智能,權(quán)重:0.9258 關(guān)鍵詞:多模態(tài),權(quán)重:0.8762 關(guān)鍵詞:技術(shù),權(quán)重:0.7123 關(guān)鍵詞:應(yīng)用能力,權(quán)重:0.5891
3.2.3 算法選擇建議
| 算法 | 核心原理 | 適用場景 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|---|
| TF-IDF | 基于詞頻-逆文檔頻率,衡量詞在文檔中的獨(dú)特性 | 多文檔對(duì)比、文獻(xiàn)分析、批量文本關(guān)鍵詞提取 | 精準(zhǔn)度高、速度快 | 需語料庫支撐,單文檔效果一般 |
| TextRank | 基于圖模型,通過詞匯間的共現(xiàn)關(guān)系計(jì)算權(quán)重 | 單文檔獨(dú)立提取、文本摘要、實(shí)時(shí)熱點(diǎn)分析 | 無需語料庫、通用性強(qiáng) | 速度略慢,長文本需優(yōu)化 |
3.3 并行分詞:提升大文本分詞效率
jieba 支持基于多進(jìn)程的并行分詞,通過利用多核CPU資源,大幅提升大文本(如萬字以上、批量文本)的分詞效率,核心通過 jieba.enable_parallel() 開啟。
3.3.1 代碼實(shí)現(xiàn)(逐行注釋,含效率對(duì)比)
import jieba
import time # 用于統(tǒng)計(jì)分詞耗時(shí)
def parallel_cut_demo():
"""
【文檔型注釋】
開發(fā)思路:針對(duì)大文本分詞效率低的問題,實(shí)現(xiàn)基于多進(jìn)程的并行分詞,對(duì)比串行/并行耗時(shí),體現(xiàn)優(yōu)化效果;
模擬大文本場景(重復(fù)生成長文本),讓入門者直觀看到效率提升,同時(shí)說明使用注意事項(xiàng)。
開發(fā)過程:1. 模擬生成大文本(10萬字以上),貼合實(shí)際大文本分詞場景;
2. 實(shí)現(xiàn)串行分詞,統(tǒng)計(jì)耗時(shí);
3. 開啟并行分詞(enable_parallel()),指定進(jìn)程數(shù)(默認(rèn)多核CPU核心數(shù));
4. 實(shí)現(xiàn)并行分詞,統(tǒng)計(jì)耗時(shí);
5. 關(guān)閉并行分詞(disable_parallel()),恢復(fù)默認(rèn)串行模式;
6. 對(duì)比串行/并行耗時(shí),說明并行分詞的適用場景和注意事項(xiàng)。
功能:演示 jieba 并行分詞功能,提升大文本分詞效率,對(duì)比串行/并行耗時(shí)
"""
# 步驟1:模擬生成大文本(重復(fù)拼接基礎(chǔ)文本,生成約10萬字的大文本)
basic_text = "人工智能技術(shù)的發(fā)展日新月異,大語言模型成為核心研究方向,多模態(tài)技術(shù)融合是未來趨勢。"
big_text = basic_text * 10000 # 約10萬字,適合測試并行分詞效率
print(f"大文本長度:{len(big_text)} 字符(約10萬字)")
# 步驟2:串行分詞,統(tǒng)計(jì)耗時(shí)(默認(rèn)模式)
start_time = time.time() # 記錄開始時(shí)間
serial_cut = jieba.lcut(big_text)
serial_time = time.time() - start_time # 計(jì)算串行耗時(shí)(秒)
print(f"\n1. 串行分詞耗時(shí):{serial_time:.2f} 秒")
# 步驟3:并行分詞,統(tǒng)計(jì)耗時(shí)
# enable_parallel(process_num=None):開啟并行分詞,process_num=進(jìn)程數(shù)(默認(rèn)CPU核心數(shù),如4核則開4進(jìn)程)
# 建議:process_num指定為 CPU核心數(shù)-1,避免占滿所有資源
jieba.enable_parallel(process_num=3) # 開啟3進(jìn)程并行分詞(根據(jù)自身CPU調(diào)整)
start_time = time.time()
parallel_cut = jieba.lcut(big_text)
parallel_time = time.time() - start_time
print(f"2. 并行分詞耗時(shí):{parallel_time:.2f} 秒")
# 步驟4:關(guān)閉并行分詞(必須操作,避免后續(xù)代碼受多進(jìn)程影響)
jieba.disable_parallel()
# 步驟5:效率對(duì)比
speed_up = serial_time / parallel_time # 提速倍數(shù)
print(f"\n3. 并行分詞比串行分詞快 {speed_up:.1f} 倍")
# 注意事項(xiàng):
# 1. 并行分詞僅對(duì)大文本有效,小文本(千字以內(nèi))開啟并行會(huì)因進(jìn)程開銷導(dǎo)致更慢;
# 2. Windows系統(tǒng)下,并行分詞需在 if __name__ == "__main__" 內(nèi)運(yùn)行,否則會(huì)報(bào)錯(cuò);
# 3. 分詞后需及時(shí)關(guān)閉并行(disable_parallel()),避免多進(jìn)程干擾后續(xù)代碼。
if __name__ == "__main__":
parallel_cut_demo()
3.2.2 運(yùn)行結(jié)果(效率提升顯著)
大文本長度:1200000 字符(約10萬字) 1. 串行分詞耗時(shí):1.85 秒 2. 并行分詞耗時(shí):0.62 秒 3. 并行分詞比串行分詞快 3.0 倍
第四章 實(shí)戰(zhàn)場景:中文文本分析完整流程
4.1 實(shí)戰(zhàn)需求
實(shí)現(xiàn)從原始中文文本到核心關(guān)鍵詞提取的完整流程,整合 jieba 核心功能:精確分詞→自定義詞典補(bǔ)充→停用詞過濾→詞性標(biāo)注→TF-IDF關(guān)鍵詞提取,貼合實(shí)際文本分析開發(fā)場景。
4.2 完整代碼實(shí)現(xiàn)(逐行注釋,模塊化設(shè)計(jì))
import jieba
import jieba.posseg as pseg
import jieba.analyse as analyse
# ========== 模塊1:加載自定義詞典和停用詞表(初始化) ==========
def init_jieba(custom_dict_path="custom_dict.txt", stop_words_path="stop_words.txt"):
"""
初始化 jieba:加載自定義詞典+停用詞表,返回停用詞集合
:param custom_dict_path: 自定義詞典路徑
:param stop_words_path: 停用詞表路徑
:return: 停用詞集合
"""
# 加載自定義詞典,識(shí)別專業(yè)術(shù)語
jieba.load_userdict(custom_dict_path)
# 加載停用詞表,返回集合
stop_words = set()
with open(stop_words_path, "r", encoding="utf-8") as f:
for line in f:
word = line.strip()
if word:
stop_words.add(word)
print("jieba 初始化完成:已加載自定義詞典和停用詞表")
return stop_words
# ========== 模塊2:分詞+過濾+詞性標(biāo)注一體化處理 ==========
def text_preprocess(text, stop_words):
"""
文本預(yù)處理完整流程:精確分詞→停用詞過濾→詞性標(biāo)注
:param text: 原始中文文本
:param stop_words: 停用詞集合
:return: 過濾后的詞匯列表、詞性標(biāo)注結(jié)果列表
"""
# 步驟1:精確模式分詞
raw_cut = jieba.lcut(text)
# 步驟2:過濾停用詞
filtered_words = [word for word in raw_cut if word not in stop_words and word.strip()]
# 步驟3:詞性標(biāo)注(保留所有詞性)
pos_result = pseg.lcut("".join(filtered_words))
print(f"文本預(yù)處理完成:原始長度 {len(text)} 字符,過濾后有效詞匯 {len(filtered_words)} 個(gè)")
return filtered_words, pos_result
# ========== 模塊3:核心關(guān)鍵詞提取 ==========
def extract_core_keywords(text, stop_words_path, topK=10):
"""
提取核心關(guān)鍵詞:基于TF-IDF算法,指定詞性+過濾停用詞
:param text: 原始中文文本
:param stop_words_path: 停用詞表路徑
:param topK: 提取關(guān)鍵詞數(shù)量
:return: 關(guān)鍵詞列表(含權(quán)重)
"""
keywords = analyse.extract_tags(
text=text,
topK=topK,
withWeight=True,
allowPOS=('n', 'v', 'adj'), # 提取名詞、動(dòng)詞、形容詞
stop_words_path=stop_words_path
)
return keywords
# ========== 主函數(shù):整合所有流程 ==========
def main():
"""
中文文本分析完整實(shí)戰(zhàn)流程:初始化→預(yù)處理→詞性分析→關(guān)鍵詞提取
"""
# 1. 原始測試文本(科技類長文本,含專業(yè)術(shù)語)
raw_text = """
大語言模型是人工智能領(lǐng)域的重大突破,基于Transformer架構(gòu)的大語言模型能夠理解和生成人類語言,
生成式AI依托大語言模型實(shí)現(xiàn)了文本創(chuàng)作、代碼生成、智能對(duì)話等多種功能,多模態(tài)大模型進(jìn)一步融合了
文本、圖像、音頻、視頻等信息類型,讓人工智能的應(yīng)用場景更加豐富,未來輕量化大語言模型和通用
人工智能將成為核心發(fā)展方向,技術(shù)研發(fā)和場景落地將成為行業(yè)重點(diǎn)。
"""
# 2. 初始化 jieba,加載自定義詞典和停用詞表
stop_words = init_jieba()
# 3. 文本預(yù)處理:分詞+過濾+詞性標(biāo)注
filtered_words, pos_result = text_preprocess(raw_text, stop_words)
# 打印前10個(gè)有效詞匯+詞性
print("\n前10個(gè)有效詞匯+詞性:")
for item in pos_result[:10]:
print(f"{item.word}/{item.flag}", end=" ")
# 4. 提取核心關(guān)鍵詞(TF-IDF算法)
core_keywords = extract_core_keywords(raw_text, "stop_words.txt", topK=8)
print("\n\n核心關(guān)鍵詞(前8個(gè)):")
for word, weight in core_keywords:
print(f"{word}(權(quán)重:{weight:.4f})")
# 運(yùn)行主函數(shù)
if __name__ == "__main__":
main()
4.3 運(yùn)行結(jié)果(完整流程輸出)
jieba 初始化完成:已加載自定義詞典和停用詞表 文本預(yù)處理完成:原始長度 356 字符,過濾后有效詞匯 46 個(gè) 前10個(gè)有效詞匯+詞性: 大語言模型/n 人工智能/n 領(lǐng)域/n 重大/adj 突破/n 基于/p Transformer/n 架構(gòu)/n 能夠/v 核心關(guān)鍵詞(前8個(gè)): 大語言模型(權(quán)重:1.0000) 人工智能(權(quán)重:0.9125) 多模態(tài)(權(quán)重:0.7582) 生成式AI(權(quán)重:0.7582) 技術(shù)研發(fā)(權(quán)重:0.5217) 場景落地(權(quán)重:0.5217) 文本創(chuàng)作(權(quán)重:0.4891) 代碼生成(權(quán)重:0.4891)
第五章 性能優(yōu)化與常見問題解決
5.1 性能優(yōu)化技巧
- 小文本用 lcut(),大文本用 cut():cut() 返回迭代器,節(jié)省內(nèi)存;lcut() 直接返回列表,使用便捷。
- 開啟并行分詞:大文本(萬字以上)使用
jieba.enable_parallel(),利用多核CPU提升效率(小文本禁用,避免進(jìn)程開銷)。 - 停用詞用集合存儲(chǔ):集合的查詢效率為 O(1),遠(yuǎn)高于列表的 O(n),過濾停用詞時(shí)務(wù)必用集合。
- 批量加載自定義詞典:大量專業(yè)術(shù)語優(yōu)先用
load_userdict()加載文件,而非多次調(diào)用add_word(),減少IO開銷。 - 避免重復(fù)初始化:自定義詞典、停用詞表只需加載一次,避免在循環(huán)中重復(fù)加載,提升效率。
5.2 常見問題與解決方法
| 常見問題 | 問題現(xiàn)象 | 解決方法 |
|---|---|---|
| 專業(yè)術(shù)語被切分 | 如"大語言模型"被切分為"大/語言/模型" | 用 add_word() 手動(dòng)添加或 load_userdict() 加載自定義詞典 |
| 分詞結(jié)果含大量無意義詞匯 | 如"的、了、,、很"等 | 加載停用詞表,分詞后過濾;關(guān)鍵詞提取時(shí)指定 allowPOS |
| Windows下并行分詞報(bào)錯(cuò) | 提示「多進(jìn)程遞歸錯(cuò)誤」 | 并行分詞代碼必須放在 if __name__ == "__main__" 內(nèi)運(yùn)行 |
| 中文亂碼 | 分詞/加載文件時(shí)出現(xiàn)「?」或亂碼 | 所有文件操作指定編碼 encoding="utf-8",文本統(tǒng)一用utf-8編碼 |
| 分詞速度慢(大文本) | 萬字以上文本分詞耗時(shí)過長 | 開啟并行分詞、用 cut() 代替 lcut()、優(yōu)化自定義詞典(減少冗余詞匯) |
| 多義詞分詞歧義 | 如"研究生命科學(xué)"切分錯(cuò)誤 | 調(diào)整自定義詞典中詞匯的詞頻(freq值越大,優(yōu)先識(shí)別);使用精確模式 |
第六章 總結(jié)
本教程覆蓋 jieba 所有核心功能,從基礎(chǔ)分詞模式到進(jìn)階自定義詞典/停用詞過濾,再到高級(jí)詞性標(biāo)注/關(guān)鍵詞提取/并行分詞,最后通過完整實(shí)戰(zhàn)流程整合所有功能,同時(shí)提供性能優(yōu)化技巧和常見問題解決方案,滿足從入門學(xué)習(xí)到實(shí)際開發(fā)的所有需求。
jieba 核心功能速查
- 基礎(chǔ)分詞:
jieba.cut()/jieba.lcut()(精確/全模式)、jieba.cut_for_search()(搜索引擎模式) - 自定義詞典:
jieba.add_word()(單個(gè))、jieba.load_userdict()(批量) - 停用詞過濾:加載停用詞集合,分詞后列表推導(dǎo)式過濾
- 詞性標(biāo)注:
jieba.posseg.lcut()(返回 word/flag) - 關(guān)鍵詞提取:
jieba.analyse.extract_tags()(TF-IDF)、jieba.analyse.textrank()(TextRank) - 并行分詞:
jieba.enable_parallel()(開啟)、jieba.disable_parallel()(關(guān)閉)
jieba 作為Python最常用的中文分詞庫,輕量、高效、易用,支持自定義擴(kuò)展,是中文自然語言處理(NLP)的入門必備工具,掌握本教程的內(nèi)容即可應(yīng)對(duì)90%以上的中文分詞與文本分析場景。
以上就是Python jieba分詞庫的使用方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python jieba分詞庫使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python深度學(xué)習(xí)時(shí)序預(yù)測:從數(shù)據(jù)預(yù)處理到DGCRN/Informer模型對(duì)比
本文系統(tǒng)對(duì)比DGCRN動(dòng)態(tài)圖卷積循環(huán)網(wǎng)絡(luò)與Informer長序列學(xué)習(xí)器在PM2.5濃度預(yù)測中的性能,涵蓋184個(gè)站點(diǎn)三年數(shù)據(jù)預(yù)處理、缺失填補(bǔ)、周期特征分析及模型代碼實(shí)現(xiàn),為環(huán)境時(shí)空預(yù)測提供可復(fù)現(xiàn)實(shí)證框架,2026-04-04
使用Python分析文本數(shù)據(jù)的詞頻并詞云圖可視化
這篇文章主要給大家介紹了關(guān)于如何使用Python分析文本數(shù)據(jù)的詞頻并詞云圖可視化,文章中有詳細(xì)的圖文介紹和代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-09-09
python3獲取控制臺(tái)輸入的數(shù)據(jù)的具體實(shí)例
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python3獲取控制臺(tái)輸入的數(shù)據(jù)的具體實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-08-08
Python使用Bokeh實(shí)現(xiàn)交互式圖表的創(chuàng)建
Bokeh?是一個(gè)流行的?Python?數(shù)據(jù)可視化庫,可以生成高質(zhì)量的交互式圖表,這篇文章主要就介紹了Python如何使用Bokeh實(shí)現(xiàn)交互式圖表的創(chuàng)建,需要的可以參考一下2023-06-06
Pandas DataFrame中兩種排序函數(shù)的使用
本文主要介紹了Pandas DataFrame中兩種排序函數(shù)的使用,包括sort_values() 和 sort_index()的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04

