日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

jieba中文分词

發(fā)布時(shí)間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jieba中文分词 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

序言

jieba是目前最好的Python中文分詞組件,它主要有以下3種特性:

  • 支持3種分詞模式:精確模式、全模式、搜索引擎模式
  • 支持繁體字
  • 支持自定義詞典
# 導(dǎo)入 jieba import jieba import jieba.posseg as pseg # 詞性標(biāo)注 import jieba.analyse as anls # 關(guān)鍵詞提取

分詞

可使用jieba.cut和jieba.cut_for_search方法進(jìn)行分詞,兩者所返回的結(jié)果都是一個(gè)可迭代的generator,可使用for循環(huán)來(lái)獲得分詞后得到的每一個(gè)詞語(yǔ)(unicode),或者直接使用jieba.lcut以及jieba.lcut_for_search直接返回list。其中:

  • jieba.cut和jieba.lcut接受3個(gè)參數(shù):
    • 需要分詞的字符串(unicode或UTF-8字符串、GBK字符串)
    • cut_all參數(shù):是否使用全模式,默認(rèn)值為False
    • HMM參數(shù):用來(lái)控制是否使用HMM模型,默認(rèn)值為True
  • jieba.cut_for_search和jieba.lcut_for_search接受2個(gè)參數(shù):
    • 需要分詞的字符串(unicode或UTF-8字符串、GBK字符串)
    • HMM參數(shù):用來(lái)控制是否使用HMM模型,默認(rèn)值為True

盡量不要使用GBK字符串,可能無(wú)法預(yù)料的錯(cuò)誤解碼成UTF-8

全模式

seg_list = jieba.cut("他來(lái)到上海交通大學(xué)",cut_all = True) print("【全模式】:" + "/".join(seg_list))

【全模式】:他/來(lái)到/上海/上海交通大學(xué)/交通/大學(xué)

精確模式

seg_list = jieba.cut("他來(lái)到上海交通大學(xué)",cut_all = False) # cut_all默認(rèn)值為False,所以不提供該參數(shù)與設(shè)置為False效果一樣,都是使用精確模式 print(type(seg_list))

<class ‘generator’>

print("【精確模式】:" + "/".join(seg_list))

【精確模式】:他/來(lái)到/上海交通大學(xué)

# 返回列表 seg_list = jieba.lcut("他來(lái)到上海交通大學(xué)",cut_all = True) print(type(seg_list))

<class ‘list’>

print("【返回列表】:{0}".format(seg_list))

【返回列表】:[‘他’, ‘來(lái)到’, ‘上海’, ‘上海交通大學(xué)’, ‘交通’, ‘大學(xué)’]

搜索引擎模式

seg_list = jieba.cut_for_search("他畢業(yè)于上海交通大學(xué)機(jī)電系,后來(lái)在一機(jī)部上海電器科學(xué)研究所工作") print(type(seg_list))

<class ‘generator’>

print("【搜索引擎模式】:" + "/".join(seg_list))

【搜索引擎模式】:他/畢業(yè)/于/上海/交通/大學(xué)/上海交通大學(xué)/機(jī)電/系/,/后來(lái)/在/一機(jī)部/上海/電器/科學(xué)/研究/研究所/工 作

# 返回列表 seg_list = jieba.lcut_for_search("他畢業(yè)于上海交通大學(xué)機(jī)電系,后來(lái)在一機(jī)部上海電器科學(xué)研究所工作") print(type(seg_list))

<class ‘list’>

print("【返回列表】:{0}".format(seg_list))

【返回列表】:[‘他’, ‘畢業(yè)’, ‘于’, ‘上海’, ‘交通’, ‘大學(xué)’, ‘上海交通大學(xué)’, ‘機(jī)電’, ‘系’, ‘,’, ‘后來(lái)’, ‘在’, ‘一 機(jī)部’, ‘上海’, ‘電器’, ‘科學(xué)’, ‘研究’, ‘研究所’, ‘工作’]

HMM模型

HMM模型,即隱馬爾可夫模型(Hidden Markov Model,HMM),是一種基于概率的統(tǒng)計(jì)分析模型,用來(lái)描述一個(gè)系統(tǒng)隱性狀態(tài)的轉(zhuǎn)移和隱性狀態(tài)的表現(xiàn)概率。在jieba中,對(duì)于未登錄到詞庫(kù)的詞,使用了基于漢字成詞能力的HMM模型和Viterbi算法,其大致原理是:

采用四個(gè)隱含狀態(tài),分別表示為單字成詞,詞組的開(kāi)頭,詞組的中間,詞組的結(jié)尾。通過(guò)標(biāo)注號(hào)的分詞練集,可以得到HMM的各個(gè)參數(shù),然后使用Viterbi算法來(lái)解釋測(cè)試集,得到分詞結(jié)果。

seg_list = jieba.cut("他來(lái)到了網(wǎng)易杭研大廈",HMM = False) #默認(rèn)精確模式和關(guān)閉HMM print("【未啟用HMM】:" + "/".join(seg_list))

【未啟用HMM】:他/來(lái)到/了/網(wǎng)易/杭/研/大廈

seg_list = jieba.cut("他來(lái)到了網(wǎng)易杭研大廈",HMM = True) #默認(rèn)精確模式和啟用HMM print("【啟用HMM】:" + "/".join(seg_list))

【啟用HMM】:他/來(lái)到/了/網(wǎng)易/杭研/大廈

繁體字分詞

jieba還支持對(duì)繁體字進(jìn)行分詞

ft_text = """人生易老天難老 歲歲重陽(yáng) 今又重陽(yáng) 戰(zhàn)地黃花分外香 壹年壹度秋風(fēng)勁 不似春光 勝似春光 寥廓江天萬(wàn)裏霜 """ # 全模式 print("【全模式】:" + "/".join(jieba.cut(ft_text,cut_all=True)))

【全模式】:人生/易/老天/難/老// //歲/歲/重/陽(yáng)// //今/又/重/陽(yáng)// //戰(zhàn)/地/黃/花/分外/香// //壹年/壹/度/秋/風(fēng)/勁// //不似/春光// //勝/似/春光// //寥廓/江天/萬(wàn)/裏/霜// /

# 精確模式 print("【精確模式】:" + "/".join(jieba.cut(ft_text,cut_all=False)))

【精確模式】:人生/易/老天/難老/ /歲/歲/重陽(yáng)/ /今/又/重陽(yáng)/ /戰(zhàn)地/黃/花/分外/香/ /壹年/壹度/秋風(fēng)勁/ /不/似/春光/ /勝似/春光/ /寥廓/江天/萬(wàn)/裏/霜/

# 搜索引擎模式 print("【搜索引擎模式】:" + "/".join(jieba.cut_for_search(ft_text)))

【搜索引擎模式】:人生/易/老天/難老/ /歲/歲/重陽(yáng)/ /今/又/重陽(yáng)/ /戰(zhàn)地/黃/花/分外/香/ /壹年/壹度/秋風(fēng)勁/ /不/似/春 光/ /勝似/春光/ /寥廓/江天/萬(wàn)/裏/霜/

添加自定義詞典

開(kāi)發(fā)者可以指定自定義詞典,以便包含jieba詞庫(kù)里沒(méi)有的詞,詞典格式如下:

詞語(yǔ) 詞頻(可省略) 詞性(可省略)

雖然jieba有新詞識(shí)別能力,但自行添加新詞可以保證更高的正確率

載入詞典

使用jieba.load_userdict(file_name)即可載入詞典;filename為文件類對(duì)象或自定義詞典的路徑。

sample_text = "周大福是創(chuàng)新辦主任也是云計(jì)算方面的專家"# 未加載詞典 print("【未加載詞典:】" + '/'.join(jieba.cut(sample_text)))

【未加載詞典:】周大福/是/創(chuàng)新/辦/主任/也/是/云/計(jì)算/方面/的/專家

# 載入詞典 jieba.load_userdict("userdict.txt") # 加載詞典后 print("【加載詞典后】:" + '/'.join(jieba.cut(sample_text)))

【加載詞典后】:周大福/ 是/ 創(chuàng)新辦/ 主任/ 也/ 是/ 云計(jì)算/ 方面/ 的/ 專家

調(diào)整詞典

使用add_word(word,freq=None,tag=None)和del_word(word)在程序中動(dòng)態(tài)修改詞典。

jieba.add_word('石墨烯') #增加自定義詞語(yǔ) jieba.add_word('凱特琳',freq=42,tag='nz') #設(shè)置詞頻和詞性 jieba.del_word('自定義詞') #刪除自定義詞語(yǔ)

使用suggest_freq(segment,tune=True)可調(diào)節(jié)單個(gè)詞語(yǔ)的詞頻,使其能(或不能)被分出來(lái)。

# 調(diào)節(jié)詞頻前 print("【調(diào)節(jié)詞頻前】:" + '/'.join(jieba.cut('如果放到post中將出錯(cuò)。',HMM=False)))

【調(diào)節(jié)詞頻前】:如果/放到/post/中將/出錯(cuò)/。

# 調(diào)節(jié)詞頻 jieba.suggest_freq(('中','將'),True)

494

# 調(diào)節(jié)詞頻后 print("【調(diào)節(jié)詞頻后】:" + '/'.join(jieba.cut('如果放到post中將出錯(cuò)。',HMM=False)))

【調(diào)節(jié)詞頻后】:如果/放到/post/中/將/出錯(cuò)/。

關(guān)鍵詞提取

jieba提供了兩種關(guān)鍵詞提取方法,分別基于 TF-IDF 算法和 TextRank 算法。

基于 TF-IDF 算法的關(guān)鍵詞提取

TF-IDF(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率)是一種統(tǒng)計(jì)方法,用以評(píng)估一個(gè)詞語(yǔ)對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的一份文件的重要程度,其原理可概括為:

一個(gè)詞語(yǔ)在一篇文章中出現(xiàn)次數(shù)越多,同時(shí)在所有文檔中出現(xiàn)次數(shù)越少,越能夠代表該文章

計(jì)算公式:
TF?IDF=TF?IDFTF - IDF = TF * IDF TF?IDF=TF?IDF

其中:

  • TF(term frequency, TF):詞頻,某一個(gè)給定的詞語(yǔ)在該文件中出現(xiàn)的次數(shù),計(jì)算公式:

TFw=在某一類中詞條w出現(xiàn)的次數(shù)該類中所有的詞條數(shù)目TF_w = \frac{在某一類中詞條w出現(xiàn)的次數(shù)}{該類中所有的詞條數(shù)目} TFw?=數(shù)w現(xiàn)數(shù)?

  • IDF(inverse document frequency, IDF):逆文件頻率,如果包含詞條的文件越少,則說(shuō)明詞條具有很好的類別區(qū)分能力,計(jì)算公式:

IDF=log(語(yǔ)料庫(kù)的文檔總數(shù)包含詞條w的文檔數(shù)+1)IDF = log(\frac{語(yǔ)料庫(kù)的文檔總數(shù)}{包含詞條w的文檔數(shù)+1}) IDF=log(w數(shù)+1語(yǔ)庫(kù)數(shù)?)

通過(guò)jieba.analyse.extract_tags方法可以基于 TF-IDF 算法進(jìn)行關(guān)鍵詞提取,該方法共有4個(gè)參數(shù):

  • sentence:為待提取的文本
  • topK:為返回幾個(gè) TF/IDF 權(quán)重最大的關(guān)鍵詞,默認(rèn)值為20
  • withWeight:是否一并返回關(guān)鍵詞權(quán)重值,默認(rèn)值為False
  • allowPOS:僅包括指定詞性的詞,默認(rèn)值為空
s = "此外,公司擬對(duì)全資子公司吉林歐亞置業(yè)有限公司增資4.3億元,增資后,吉林歐亞置業(yè)注冊(cè)資本由7000萬(wàn)元增加到5億元。吉林歐亞置業(yè)主要經(jīng)營(yíng)范圍為房地產(chǎn)開(kāi)發(fā)及百貨零售等業(yè)務(wù)。目前在建吉林歐亞城市商業(yè)綜合體項(xiàng)目。2013年,實(shí)現(xiàn)營(yíng)業(yè)收入0萬(wàn)元,實(shí)現(xiàn)凈利潤(rùn)-139.13萬(wàn)元。" for x, w in anls.extract_tags(s, topK=20, withWeight=True):print('%s %s' % (x, w))

歐亞 0.7300142700289363
吉林 0.659038184373617
置業(yè) 0.4887134522112766
萬(wàn)元 0.3392722481859574
增資 0.33582401985234045
4.3 0.25435675538085106
7000 0.25435675538085106
2013 0.25435675538085106
139.13 0.25435675538085106
實(shí)現(xiàn) 0.19900979900382978
綜合體 0.19480309624702127
經(jīng)營(yíng)范圍 0.19389757253595744
億元 0.1914421623587234
在建 0.17541884768425534
全資 0.17180164988510638
注冊(cè)資本 0.1712441526
百貨 0.16734460041382979
零售 0.1475057117057447
子公司 0.14596045237787234
營(yíng)業(yè) 0.13920178509021275

使用jieba.analyse.TFIDF(idf_path=None)可以新建TFIDF實(shí)例,其中idf_path為IDF頻率文件。

基于 TextRank算法的關(guān)鍵詞提取

TextRank是另一種關(guān)鍵詞提取算法,基于大名鼎鼎的PageRank,其原理可參見(jiàn)論文——http://web.eecs.umich.edu/~mihalcea/papers/mihalcea.emnlp04.pdf

通過(guò)jieba.analyse.testrank方法可以使用基于 TextRank 算法的關(guān)鍵詞提取,其與jieba.analyse.extract_tags有一樣的參數(shù),但前者默認(rèn)過(guò)濾詞性(allowPOS=('ns','n','vn','v'))。

for x, w in anls.textrank(s, withWeight=True):print('%s %s' % (x, w))

吉林 1.0
歐亞 0.9966893354178172
置業(yè) 0.6434360313092776
實(shí)現(xiàn) 0.5898606692859626
收入 0.43677859947991454
增資 0.4099900531283276
子公司 0.35678295947672795
城市 0.34971383667403655
商業(yè) 0.34817220716026936
業(yè)務(wù) 0.3092230992619838
在建 0.3077929164033088
營(yíng)業(yè) 0.3035777049319588
全資 0.303540981053475
綜合體 0.29580869172394825
注冊(cè)資本 0.29000519464085045
有限公司 0.2807830798576574
零售 0.27883620861218145
百貨 0.2781657628445476
開(kāi)發(fā) 0.2693488779295851
經(jīng)營(yíng)范圍 0.2642762173558316

使用jieba.analyse.TextRank()可以新建自定義 TextRank 實(shí)例。

自定義語(yǔ)料庫(kù)

關(guān)鍵詞提取所使用逆向文件頻率(IDF)文本語(yǔ)料庫(kù)和停止詞(Stop Words)文本語(yǔ)料庫(kù)可以切換成自定義語(yǔ)料庫(kù)的路徑。

jieba.analyse.set_stop_words("stop_words.txt") jieba.analyse.set_idf_path("idf.txt.big") for x, w in anls.extract_tags(s, topK=20, withWeight=True):print('%s %s' % (x, w))

吉林 1.0174270215234043
歐亞 0.7300142700289363
增資 0.5087135107617021
實(shí)現(xiàn) 0.5087135107617021
置業(yè) 0.4887134522112766
萬(wàn)元 0.3392722481859574
此外 0.25435675538085106
全資 0.25435675538085106
有限公司 0.25435675538085106
4.3 0.25435675538085106
注冊(cè)資本 0.25435675538085106
7000 0.25435675538085106
增加 0.25435675538085106
主要 0.25435675538085106
房地產(chǎn) 0.25435675538085106
業(yè)務(wù) 0.25435675538085106
目前 0.25435675538085106
城市 0.25435675538085106
綜合體 0.25435675538085106
2013 0.25435675538085106

詞性標(biāo)注

jieba.posseg.POSTokenizer(tokenizer=None)新建自定義分詞器,tokenizer參數(shù)可指定內(nèi)部使用的jieba.Tokenizer分詞器。jieba.posseg.dt為默認(rèn)詞性標(biāo)注分詞器。

標(biāo)注句子分詞后的每個(gè)詞的詞性,采用和ictcals兼容的標(biāo)記法。

words = pseg.cut("他改變了中國(guó)") for word, flag in words:print("{0} {1}".format(word, flag))

他 r
改變 v
了 ul
中國(guó) ns

并行分詞

將目標(biāo)文本按行分隔后,把各行文本分配到多個(gè)Python進(jìn)程并行分詞,然后歸并結(jié)果,從而獲得分詞速度的客觀提升。用法:

  • jieba.enable_parallel(4):開(kāi)啟并行分詞模式,參數(shù)為并行進(jìn)程數(shù)
  • jieba.disable_parallel():關(guān)閉并行分詞模式

注意:基于 python 自帶的 multiprocessing 模塊,目前暫不支持 Windows

返回詞語(yǔ)在原文的起止位置

使用jieba.tokenize方法可以返回詞語(yǔ)在原文的起止位置。

注意:輸入?yún)?shù)只接受unicode

result = jieba.tokenize(u'上海益民食品一廠有限公司') print("【普通模式】") for tk in result:print("word:{0} \t start:{1} \t end:{2}".format(tk[0],tk[1],tk[2]))

【普通模式】

word:上海 start:0 end:2
word:益民 start:2 end:4
word:食品 start:4 end:6
word:一廠 start:6 end:8
word:有限公司 start:8 end:12

result = jieba.tokenize(u'上海益民食品一廠有限公司',mode="search") print("【搜索模式】") for tk in result:print("word:{0} \t start:{1} \t end:{2}".format(tk[0],tk[1],tk[2]))

【搜索模式】

word:上海 start:0 end:2
word:益民 start:2 end:4
word:食品 start:4 end:6
word:一廠 start:6 end:8
word:有限 start:8 end:10
word:公司 start:10 end:12
word:有限公司 start:8 end:12

實(shí)例

1.1對(duì)哈姆雷特文本進(jìn)行詞頻統(tǒng)計(jì)
def getText():txt = open(r"hamlet.txt",'r').read()txt = txt.lower()for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_{|}·~’‘': #將特殊符號(hào)均替換為空格txt = txt.replace(ch," ")return txthamletTxt = getText() words = hamletTxt.split() counts = {} for word in words:counts[word] = counts.get(word,0) + 1items = list(counts.items()) items.sort(key = lambda x:x[1], reverse=True) #按value值排序 for i in range(10): #輸出前十多的詞頻word, count = items[i]print("{0:<10}{1:>5}".format(word, count))

the 1138
and 965
to 754
of 669
you 550
i 542
a 542
my 514
hamlet 462
in 436

1.2《三國(guó)演義》人物出場(chǎng)統(tǒng)計(jì)
# V1版本 from os import read import jieba txt = open(r"threekingdoms.txt","r",encoding="utf-8").read() words = jieba.lcut(txt) counts = {} for word in words:if len(word) == 1:continueelse:counts[word] = counts.get(word,0) + 1 items = list(counts.items()) items.sort(key=lambda x:x[1], reverse=True) for i in range(15):word, count = items[i]print("{0:<10}{1:>5}".format(word,count))

曹操 953
孔明 836
將軍 772
卻說(shuō) 656
玄德 585
關(guān)公 510
丞相 491
二人 469
不可 440
荊州 425
玄德曰 390
孔明曰 390
不能 384
如此 378
張飛 358

可以看出以上的結(jié)果中存在著很多不是人名的詞頻,這需要我們對(duì)代碼做一些改進(jìn)。改進(jìn)版如下:

# V2版 from os import terminal_size import jieba excludes = {"將軍","卻說(shuō)","荊州","二人","不可","不能","如此","商議","軍士","左右","軍馬","次日","引兵","如何","大喜","天下","東吳"}txt = open(r"threekingdoms.txt",'r',encoding='utf-8').read() words = jieba.lcut(txt) counts = {} for word in words:if len(word) == 1:continueelif word == "諸葛亮" or word == "孔明曰":rword = "孔明"elif word == "關(guān)公" or word == "云長(zhǎng)":rword = "關(guān)羽"elif word == "玄德" or word == "玄德曰":rword == "劉備"elif word == "孟德" or word == "丞相" or word == "主公":rword = "曹操"else:rword = wordcounts[rword] = counts.get(rword,0) + 1for word in excludes:del counts[word]items = list(counts.items()) items.sort(key=lambda x:x[1], reverse=True) for i in range(10):word, count = items[i]print("{0:<10}{1:>5}".format(word,count))

曹操 1795
孔明 1384
關(guān)羽 788
張飛 361
呂布 303
趙云 280
劉備 277
孫權(quán) 265
于是 252
今日 244

1.3 利用extract_tags算法對(duì)《三國(guó)演義》中的關(guān)鍵詞進(jìn)行提取
from os import read import jieba import jieba.analyse as anls txt = open(r"threekingdoms.txt","r",encoding="utf-8").read() for x, w in anls.extract_tags(txt, topK=20, withWeight=True):print('%s %s' % (x, w))

孔明 0.03758532276566071
曹操 0.03691595997415334
玄德 0.026956068237259715
將軍 0.02673692163610917
關(guān)公 0.025206101530884824
卻說(shuō) 0.02446332750666053
丞相 0.020777068164177157
玄德曰 0.01954516271712038
孔明曰 0.01954516271712038
引兵 0.01898980058244164
云長(zhǎng) 0.018232960704155924
荊州 0.018136019538121863
張飛 0.017755511674800408
二人 0.017061952960250298
主公 0.016121368683811123
呂布 0.01529292186862885
趙云 0.014223904044216125
不可 0.013875565783051705
軍士 0.013751985052577697
商議 0.013351444143675124

1.4 利用textrank算法對(duì)《三國(guó)演義》中的關(guān)鍵詞進(jìn)行提取
from os import read import jieba import jieba.analyse as anls txt = open(r"threekingdoms.txt","r",encoding="utf-8").read() for x, w in anls.textrank(txt, withWeight=True):print('%s %s' % (x, w))

將軍 1.0
卻說(shuō) 0.847581019581622
丞相 0.5718053633959947
荊州 0.5303375153661818
不能 0.5290785118607801
不可 0.5001642467979682
軍士 0.45454238780777795
軍馬 0.36953009002402293
主公 0.3676381961018778
引兵 0.34890535163745795
商議 0.3238605331150697
東吳 0.3033786183888577
只見(jiàn) 0.3024237420127731
后主 0.2830994654967138
陛下 0.2823911867603753
人馬 0.279927492918901
漢中 0.26341749501986467
都督 0.25452786463113664
大喜 0.251798437942011
眾將 0.25156001701107994

總結(jié)

以上是生活随笔為你收集整理的jieba中文分词的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。