?
???♂? 個人主頁:@艾派森的個人主頁
???作者簡介:Python學(xué)習(xí)者
?? 希望大家多多支持,我們一起進(jìn)步!??
如果文章對你有幫助的話,
歡迎評論 ??點贊???? 收藏 ??加關(guān)注+
?
中文分詞
????????中文分詞是將中文文本切分成一系列有意義的詞語的過程。中文分詞可以用于文本分析、機器翻譯、信息檢索等領(lǐng)域。傳統(tǒng)的中文分詞方法主要是基于規(guī)則和統(tǒng)計方法,其中規(guī)則分詞法主要通過定義一些分詞規(guī)則來分詞,如基于漢字的筆畫、拼音、部首等規(guī)則;而統(tǒng)計分詞法則是通過訓(xùn)練大規(guī)模中文語料庫來自動學(xué)習(xí)分詞規(guī)律,并使用這些規(guī)律進(jìn)行分詞。隨著深度學(xué)習(xí)技術(shù)的發(fā)展,基于神經(jīng)網(wǎng)絡(luò)的中文分詞方法也逐漸得到廣泛應(yīng)用。在中文分詞領(lǐng)域上,使用最多的就是jieba庫,本次我也將重點介紹jieba庫進(jìn)行中文分詞。
jieba是目前最好的Python中文分詞組件,它主要有以下3種特性:
- 支持3種分詞模式:精確模式、全模式、搜索引擎模式
- 支持繁體字
- 支持自定義詞典
jieba.cut和jieba.lcut接受3個參數(shù):
- 需要分詞的字符串(unicode或UTF-8字符串、GBK字符串)
- cut_all參數(shù):是否使用全模式,默認(rèn)值為False
- HMM參數(shù):用來控制是否使用HMM模型,默認(rèn)值為True
jieba.cut_for_search和jieba.lcut_for_search接受2個參數(shù):
- 需要分詞的字符串(unicode或UTF-8字符串、GBK字符串)
- HMM參數(shù):用來控制是否使用HMM模型,默認(rèn)值為True
?
jieba.cut和jieba.cut_for_search所返回的結(jié)果是一個可迭代的generator,可使用for循環(huán)來獲得分詞后得到的每一個詞語(unicode)。
jieba.lcut和jieba.lcut_for_search直接返回list結(jié)果。
示例:
import jieba
text = '中文分詞是將中文文本切分成一系列有意義的詞語的過程。'
print(jieba.cut(text))
print(jieba.cut_for_search(text))
print(jieba.lcut(text))
print(jieba.lcut_for_search(text))
運行結(jié)果:?
['中文', '分詞', '是', '將', '中文', '文本', '切', '分成', '一系列', '有', '意義', '的', '詞語', '的', '過程', '。']
['中文', '分詞', '是', '將', '中文', '文文', '文本', '切分', '分成', '一系', '一系列', '系列', '列有', '有意', '意義', '的', '詞語', '的', '過程', '。']
['中文', '分詞', '是', '將', '中文', '文本', '切', '分成', '一系', '系列', '一系列', '有', '意義', '的', '詞語', '的', '過程', '。']
<generator object Tokenizer.cut at 0x000001B56EE14740>
<generator object Tokenizer.cut_for_search at 0x000001B56EE14740>
['中文', '分詞', '是', '將', '中文', '文本', '切', '分成', '一系列', '有', '意義', '的', '詞語', '的', '過程', '。']
['中文', '分詞', '是', '將', '中文', '文本', '切', '分成', '一系', '系列', '一系列', '有', '意義', '的', '詞語', '的', '過程', '。']
?分詞默認(rèn)使用的是精確模式,我們可以通過cut_all參數(shù)來改為全模式。如果想使用搜索引擎模式的話,使用jieba.lcut_for_search即可。
示例
import jieba
text = '中文分詞是將中文文本切分成一系列有意義的詞語的過程。'
print(jieba.lcut(text,cut_all=False)) # 默認(rèn)精確模式,即cut_all=False
print(jieba.lcut(text,cut_all=True)) # 改為全模式,即cut_all=True
print(jieba.lcut_for_search(text)) # 搜索引擎模式
運行結(jié)果:?
['中文', '分詞', '是', '將', '中文', '文本', '切', '分成', '一系列', '有', '意義', '的', '詞語', '的', '過程', '。']
['中文', '分詞', '是', '將', '中文', '文文', '文本', '切分', '分成', '一系', '一系列', '系列', '列有', '有意', '意義', '的', '詞語', '的', '過程', '。']
['中文', '分詞', '是', '將', '中文', '文本', '切', '分成', '一系', '系列', '一系列', '有', '意義', '的', '詞語', '的', '過程', '。']
自定義分詞詞典?
????????很多時候使用jieba分詞的結(jié)果會不盡人意,它的分詞里如果沒有該詞語,就會將其分開,比如下面的示例:
import jieba
text = '艾派森是創(chuàng)新辦主任也是大數(shù)據(jù)專家'
jieba.lcut(text)
['艾派', '森是', '創(chuàng)新', '辦', '主任', '也', '是', '大', '數(shù)據(jù)', '專家']
可以發(fā)現(xiàn),我們是不想讓它把“艾派森”、“創(chuàng)新辦”、“大數(shù)據(jù)”分開的,但是在它的詞典里是沒有這些新詞語的,所以這時候我們需要自定義分詞詞典進(jìn)行補充。
方法1:直接定義詞典列表
我們可以直接將我們自定義的詞語放入一個列表中,然后使用jieba.load_userdict進(jìn)行應(yīng)用
b = ['艾派森','創(chuàng)新辦','大數(shù)據(jù)']
jieba.load_userdict(b) # 應(yīng)用自定義詞典列表
jieba.lcut(text)
['艾派森', '是', '創(chuàng)新辦', '主任', '也', '是', '大數(shù)據(jù)', '專家']
方法2:外部文件載入
外部文件的話我們需要創(chuàng)建一個自定義詞典txt文件,里面寫入自定義詞語即可,注意是一行一個詞語。然后將該文件的路徑傳入jieba.load_userdict即可,我這里是代碼和文件在同一路徑下,所以直接寫入文件名即可。
?
# 方法2:外部文件載入
jieba.load_userdict('自定義詞典.txt')
jieba.lcut(text)
['艾派森', '是', '創(chuàng)新辦', '主任', '也', '是', '大數(shù)據(jù)', '專家']
方法3:動態(tài)增加或刪除詞語
優(yōu)點:比添加自定義詞典靈活,隨用隨機。
比如當(dāng)我們遇到如下情況時:
text2 = '我們中出了一個叛徒'
jieba.lcut(text2)
['我們', '中出', '了', '一個', '叛徒']
可以發(fā)現(xiàn)它誤解了我們的初始意思,將“中出”作為一個詞語進(jìn)行分開,我們漢語里面哪有這個詞語,似乎日語里面有這個詞,要么就是csgo里面的口頭語“中出”,意思是從中路出了。所以這時候我們將需要“中出”進(jìn)行刪除,然后加入“出了”這個詞語。
jieba.del_word('中出') # 刪除單詞
jieba.lcut(text2)
['我們', '中', '出', '了', '一個', '叛徒']
可以發(fā)現(xiàn)將“中出”刪除后,它就不會將中和出進(jìn)行組合了。?
jieba.add_word('出了')
jieba.lcut(text2)
['我們', '中', '出了', '一個', '叛徒']
當(dāng)我們添加了“出了”詞語后,它就可以將出和了進(jìn)行組合了,這就符合了我們最初的意思。?
問題:如果我們不想刪除“中出”這個詞,但是又不想讓它合在一起,該怎么辦?
?那么我們就需要提高“中”和“出”這兩個詞的權(quán)重,這樣就不會在進(jìn)行組合了。
# 如果我們不想刪除“中出”這個詞,但是又不想讓它合在一起,可以增大它的詞頻
jieba.add_word('中出') # 為了演示效果,我們需要回到最初始的樣子
jieba.del_word('出了')
print(jieba.lcut(text2))
# 調(diào)節(jié)詞的詞頻,使其能(或不能)被分詞
# tune=True:執(zhí)行詞頻調(diào)整,默認(rèn)False不執(zhí)行
jieba.suggest_freq(('中','出'),tune=True)
print(jieba.lcut(text2))
['我們', '中出', '了', '一個', '叛徒']
['我們', '中', '出', '了', '一個', '叛徒']
可以看出,我們同樣實現(xiàn)了前面的效果。
去除停用詞?
????????去除停用詞是一種常用的自然語言處理技術(shù),它可以大大提高文本分類、情感分析、機器翻譯等任務(wù)的效果。常用的停用詞包括數(shù)字、時間、標(biāo)點符號、常見單詞等。
在中文分詞之后, 就需要進(jìn)行去除停用詞。
首先我們需要準(zhǔn)確一個停用詞庫,這里我建議大家使用哈工大的中文停用詞庫,比較齊全。如果里面沒有你想去除的詞語,你也可以再文件里面進(jìn)行添加,注意還是一行一個詞語。這里我們讀取停用詞庫文件,將里面的停用詞進(jìn)行存儲,后面做篩選用。
?
with open('停用詞庫.txt', encoding='utf-8') as f: # 可根據(jù)需要打開停用詞庫,然后加上不想顯示的詞語
con = f.readlines()
stop_words = set() # 集合可以去重
for i in con:
i = i.replace("\n", "") # 去掉讀取每一行數(shù)據(jù)的\n
stop_words.add(i)
stop_words
??
讀取完停用詞庫我們將可以去除停用詞了,示例如下:?
text3 = '昨天我吃了一大碗米飯,真的是太好吃了!###@'
result = []
for word in jieba.lcut(text3):
if word not in stop_words:
result.append(word)
result
['昨天', '吃', '大碗', '米飯', ',', '真的', '太', '好吃', '!', '###', '@']
可以發(fā)現(xiàn)它確實去除了停用詞庫中的詞語,但是還有標(biāo)點符號等字符沒有去除。
所以這里我們還需要使用re正則進(jìn)行去除字符,只保留中文。
# 去除一些無用的字符只提取出中文出來
import re
new_text = "".join(re.findall('[\u4e00-\u9fa5]+', text3, re.S))
new_text
'昨天我吃了一大碗米飯真的是太好吃了'
可以發(fā)現(xiàn)經(jīng)過這一步處理,我們原來語句中的標(biāo)點符號等異常字符都去除掉了。此時再進(jìn)行分詞和去停用詞就可以算完美了。
result = []
for word in jieba.lcut(new_text):
if word not in stop_words:
result.append(word)
result
['昨天', '吃', '大碗', '米飯', '真的', '太', '好吃']
可以看出分詞的結(jié)果都只有中文了。
如果我們不想保留單詞,比如上面的“吃”、“太”,這樣的詞語沒有什么價值,只需要在去重的時候加上過濾條件即可。原理就是判斷字的長度是否大于1。
result = []
for word in jieba.lcut(new_text):
if word not in stop_words and len(word) > 1:
result.append(word)
result
['昨天', '大碗', '米飯', '真的', '好吃']
綜合
????????前面我們學(xué)習(xí)了中文分詞、去除停用詞、去除標(biāo)點符號。在實際應(yīng)用的時候當(dāng)然還是把這些功能封裝為一個函數(shù),即提高效率也提高代碼可讀性。這里我放出我自己封裝的函數(shù)供大家參考,可以直接拿去用。
import re
import jieba
def chinese_word_cut(mytext):
jieba.load_userdict('自定義詞典.txt') # 這里你可以添加jieba庫識別不了的網(wǎng)絡(luò)新詞,避免將一些新詞拆開
jieba.initialize() # 初始化jieba
# 文本預(yù)處理 :去除一些無用的字符只提取出中文出來
new_data = re.findall('[\u4e00-\u9fa5]+', mytext, re.S)
new_data = " ".join(new_data)
# 文本分詞
seg_list_exact = jieba.lcut(new_data)
result_list = []
# 讀取停用詞庫
with open('停用詞庫.txt', encoding='utf-8') as f: # 可根據(jù)需要打開停用詞庫,然后加上不想顯示的詞語
con = f.readlines()
stop_words = set()
for i in con:
i = i.replace("\n", "") # 去掉讀取每一行數(shù)據(jù)的\n
stop_words.add(i)
# 去除停用詞并且去除單字
for word in seg_list_exact:
if word not in stop_words and len(word) > 1:
result_list.append(word)
return result_list
封裝好之后,我們需要用的時候直接調(diào)用即可。
text3 = '昨天我吃了一大碗米飯,真的是太好吃了!###@'
chinese_word_cut(text3)
['昨天', '大碗', '米飯', '真的', '好吃']
小案例 :將txt文件中的評論內(nèi)容進(jìn)行分詞后輸出為一個新的txt文件
# 加載數(shù)據(jù)
txt_path = '評論內(nèi)容.txt' # 你的txt文件的路徑,絕對路徑和相對路徑都可,我這里是相對路徑
comment_list = []
with open(txt_path)as f:
for i in f.readlines():
i = i.replace('\n','')
comment_list.append(i)
import re
import jieba
# 定義分詞函數(shù)
def chinese_word_cut(mytext):
jieba.load_userdict('自定義詞典.txt') # 這里你可以添加jieba庫識別不了的網(wǎng)絡(luò)新詞,避免將一些新詞拆開
jieba.initialize() # 初始化jieba
# 文本預(yù)處理 :去除一些無用的字符只提取出中文出來
new_data = re.findall('[\u4e00-\u9fa5]+', mytext, re.S)
new_data = " ".join(new_data)
# 文本分詞
seg_list_exact = jieba.lcut(new_data)
result_list = []
# 讀取停用詞庫
with open('停用詞庫.txt', encoding='utf-8') as f: # 可根據(jù)需要打開停用詞庫,然后加上不想顯示的詞語
con = f.readlines()
stop_words = set()
for i in con:
i = i.replace("\n", "") # 去掉讀取每一行數(shù)據(jù)的\n
stop_words.add(i)
# 去除停用詞并且去除單字
for word in seg_list_exact:
if word not in stop_words and len(word) > 1:
result_list.append(word)
return result_list
# 保存分詞結(jié)果
save_path = '分詞后的數(shù)據(jù).txt' # 要保存的分詞文件的路徑
with open(save_path,'a',encoding='utf-8')as f:
for comment in comment_list:
cutted_comment = ' '.join(chinese_word_cut(comment))
if cutted_comment:
f.write(cutted_comment)
f.write('\n')
評論內(nèi)容.txt
?分詞后的數(shù)據(jù).txt
案例實戰(zhàn)
中文分詞是文本分析必須要經(jīng)歷的環(huán)節(jié),關(guān)于具體案例,我前面寫了很多,大家可以學(xué)習(xí)參考。
基于sklearn實現(xiàn)LDA主題模型(附實戰(zhàn)案例)
基于gensim實現(xiàn)word2vec模型(附案例實戰(zhàn))
數(shù)據(jù)分析案例-文本挖掘與中文文本的統(tǒng)計分析
基于TF-IDF+KMeans聚類算法構(gòu)建中文文本分類模型(附案例實戰(zhàn))
大數(shù)據(jù)分析案例-基于樸素貝葉斯算法構(gòu)建微博謠言檢測模型文章來源:http://www.zghlxwxcb.cn/news/detail-512347.html
大數(shù)據(jù)分析案例-基于邏輯回歸算法構(gòu)建微博評論情感分類模型文章來源地址http://www.zghlxwxcb.cn/news/detail-512347.html
到了這里,關(guān)于文本分析-使用jieba庫進(jìn)行中文分詞和去除停用詞(附案例實戰(zhàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!