分詞模式
jieba分詞有多種模式可供選擇??蛇x的模式包括:
全切分模式
精確模式
搜索引擎模式
同時(shí)也提供了HMM模型的開(kāi)關(guān)。
其中全切分模式就是輸出一個(gè)字串的所有分詞,
精確模式是對(duì)句子的一個(gè)概率最佳分詞,
而搜索引擎模式提供了精確模式的再分詞,將長(zhǎng)詞再次拆分為短詞。
效果大抵如下:
# encoding=utf-8 import jieba seg_list = jieba.cut("我來(lái)到北京清華大學(xué)", cut_all=True) print("Full Mode: " + "/ ".join(seg_list)) # 全模式 seg_list = jieba.cut("我來(lái)到北京清華大學(xué)", cut_all=False) print("Default Mode: " + "/ ".join(seg_list)) # 精確模式 seg_list = jieba.cut("他來(lái)到了網(wǎng)易杭研大廈") # 默認(rèn)是精確模式 print(", ".join(seg_list)) seg_list = jieba.cut_for_search("小明碩士畢業(yè)于中國(guó)科學(xué)院計(jì)算所,后在日本京都大學(xué)深造") # 搜索引擎模式 print(", ".join(seg_list))
的結(jié)果為
【全模式】: 我/ 來(lái)到/ 北京/ 清華/ 清華大學(xué)/ 華大/ 大學(xué) 【精確模式】: 我/ 來(lái)到/ 北京/ 清華大學(xué) 【新詞識(shí)別】:他, 來(lái)到, 了, 網(wǎng)易, 杭研, 大廈 (此處,“杭研”并沒(méi)有在詞典中,但是也被Viterbi算法識(shí)別出來(lái)了) 【搜索引擎模式】: 小明, 碩士, 畢業(yè), 于, 中國(guó), 科學(xué), 學(xué)院, 科學(xué)院, 中國(guó)科學(xué)院, 計(jì)算, 計(jì)算所, 后, 在, 日本, 京都, 大學(xué), 日本京都大學(xué), 深造
其中,新詞識(shí)別即用HMM模型的Viterbi算法進(jìn)行識(shí)別新詞的結(jié)果。
值得詳細(xì)研究的模式是精確模式,以及其用于識(shí)別新詞的HMM模型和Viterbi算法。
jieba.cut()在載入詞典之后,jieba分詞要進(jìn)行分詞操作,在代碼中就是核心函數(shù)jieba.cut(),代碼如下:
def cut(self, sentence, cut_all=False, HMM=True): """ The main function that segments an entire sentence that contains Chinese characters into seperated words. Parameter: - sentence: The str(unicode) to be segmented. - cut_all: Model type. True for full pattern, False for accurate pattern. - HMM: Whether to use the Hidden Markov Model. """ sentence = strdecode(sentence) if cut_all: re_han = re_han_cut_all re_skip = re_skip_cut_all else: re_han = re_han_default re_skip = re_skip_default if cut_all: cut_block = self.__cut_all elif HMM: cut_block = self.__cut_DAG else: cut_block = self.__cut_DAG_NO_HMM blocks = re_han.split(sentence) for blk in blocks: if not blk: continue if re_han.match(blk): for word in cut_block(blk): yield word else: tmp = re_skip.split(blk) for x in tmp: if re_skip.match(x): yield x elif not cut_all: for xx in x: yield xx else: yield x
其中,
docstr中給出了默認(rèn)的模式,精確分詞 + HMM模型開(kāi)啟。
第12-23行進(jìn)行了變量配置。
第24行做的事情是對(duì)句子進(jìn)行中文的切分,把句子切分成一些只包含能處理的字符的塊(block),丟棄掉特殊字符,因?yàn)橐恍┰~典中不包含的字符可能對(duì)分詞產(chǎn)生影響。
24行中re_han默認(rèn)值為re_han_default,是一個(gè)正則表達(dá)式,定義如下:
# u4E00-u9FD5a-zA-Z0-9+#&._ : All non-space characters. Will be handled with re_han re_han_default = re.compile("([u4E00-u9FD5a-zA-Z0-9+#&._]+)", re.U)
可以看到諸如空格、制表符、換行符之類的特殊字符在這個(gè)正則表達(dá)式被過(guò)濾掉。
25-40行使用yield實(shí)現(xiàn)了返回結(jié)果是一個(gè)迭代器,即文檔中所說(shuō):
jieba.cut 以及 jieba.cut_for_search 返回的結(jié)構(gòu)都是一個(gè)可迭代的 generator,可以使用 for 循環(huán)來(lái)獲得分詞后得到的每一個(gè)詞語(yǔ)(unicode)
其中,31-40行,如果遇到block是非常規(guī)字符,就正則驗(yàn)證一下直接輸出這個(gè)塊作為這個(gè)塊的分詞結(jié)果。如標(biāo)點(diǎn)符號(hào)等等,在分詞結(jié)果中都是多帶帶一個(gè)詞的形式出現(xiàn)的,就是這十行代碼進(jìn)行的。
關(guān)鍵在28-30行,如果是可分詞的block,那么就調(diào)用函數(shù)cut_block,默認(rèn)是cut_block = self.__cut_DAG,進(jìn)行分詞
jieba.__cut_DAG()__cut_DAG的作用是按照DAG,即有向無(wú)環(huán)圖進(jìn)行切分單詞。其代碼如下:
def __cut_DAG(self, sentence): DAG = self.get_DAG(sentence) route = {} self.calc(sentence, DAG, route) x = 0 buf = "" N = len(sentence) while x < N: y = route[x][1] + 1 l_word = sentence[x:y] if y - x == 1: buf += l_word else: if buf: if len(buf) == 1: yield buf buf = "" else: if not self.FREQ.get(buf): recognized = finalseg.cut(buf) for t in recognized: yield t else: for elem in buf: yield elem buf = "" yield l_word x = y if buf: if len(buf) == 1: yield buf elif not self.FREQ.get(buf): recognized = finalseg.cut(buf) for t in recognized: yield t else: for elem in buf: yield elem
對(duì)于一個(gè)sentence,首先 獲取到其有向無(wú)環(huán)圖DAG,然后利用dp對(duì)該有向無(wú)環(huán)圖進(jìn)行最大概率路徑的計(jì)算。
計(jì)算出最大概率路徑后迭代,如果是登錄詞,則輸出,如果是單字,將其中連在一起的單字找出來(lái),這些可能是未登錄詞,使用HMM模型進(jìn)行分詞,分詞結(jié)束之后輸出。
至此,分詞結(jié)束。
其中,值得跟進(jìn)研究的是第2行獲取DAG,第4行計(jì)算最大概率路徑和第20和34行的使用HMM模型進(jìn)行未登錄詞的分詞,在后面的文章中會(huì)進(jìn)行解讀。
DAG = self.get_DAG(sentence) ... self.calc(sentence, DAG, route) ... recognized = finalseg.cut(buf)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/37653.html
摘要:由此得到了,下一步就是使用動(dòng)態(tài)規(guī)劃對(duì)最大概率路徑進(jìn)行求解。最大概率路徑值得注意的是,的每個(gè)結(jié)點(diǎn),都是帶權(quán)的,對(duì)于在詞典里面的詞語(yǔ),其權(quán)重為其詞頻,即。動(dòng)態(tài)規(guī)劃求解法滿足的條件有兩個(gè)重復(fù)子問(wèn)題最優(yōu)子結(jié)構(gòu)我們來(lái)分析最大概率路徑問(wèn)題。 DAG(有向無(wú)環(huán)圖) 有向無(wú)環(huán)圖,directed acyclic graphs,簡(jiǎn)稱DAG,是一種圖的數(shù)據(jù)結(jié)構(gòu),其實(shí)很naive,就是沒(méi)有環(huán)的有向圖_(:...
摘要:分詞的算法中文分詞有難度,不過(guò)也有成熟的解決方案。例如通過(guò)人民日?qǐng)?bào)訓(xùn)練的分詞系統(tǒng),在網(wǎng)絡(luò)玄幻小說(shuō)上,分詞的效果就不會(huì)好。三的優(yōu)點(diǎn)是開(kāi)源的,號(hào)稱是中,最好的中文分詞組件。 showImg(https://segmentfault.com/img/remote/1460000016359704?w=1350&h=900); 題圖:by Lucas Davies 一、前言 分詞,我想是大多數(shù)...
Python在工作中的應(yīng)用還是比較的廣泛的,市場(chǎng)上面對(duì)于這類人才開(kāi)出的薪資還是比較的高的。那么,如何使用第三方庫(kù)jieba庫(kù)與中文分詞進(jìn)行一個(gè)分解呢?下面小編就給大家詳細(xì)的做出一個(gè)解答。 一、什么是jieba庫(kù) jieba是優(yōu)秀的中文分詞第三方庫(kù),由于中文文本之間每個(gè)漢字都是連續(xù)書(shū)寫(xiě)的,我們需要通過(guò)特定的手段來(lái)獲得其中的每個(gè)詞組,這種手段叫做分詞,我們可以通過(guò)jieba庫(kù)來(lái)完成這個(gè)過(guò)程。 ...
摘要:前言今天教大家用模塊來(lái)生成詞云,我讀取了一篇小說(shuō)并生成了詞云,先看一下效果圖效果圖一效果圖二根據(jù)效果圖分析的還是比較準(zhǔn)確的,小說(shuō)中的主人公就是程理,所以出現(xiàn)次數(shù)最多。 前言 今天教大家用wrodcloud模塊來(lái)生成詞云,我讀取了一篇小說(shuō)并生成了詞云,先看一下效果圖: 效果圖一: showImg(https://segmentfault.com/img/remote/1460000015...
閱讀 3440·2021-11-22 09:34
閱讀 728·2021-11-19 11:29
閱讀 1409·2019-08-30 15:43
閱讀 2291·2019-08-30 14:24
閱讀 1919·2019-08-29 17:31
閱讀 1287·2019-08-29 17:17
閱讀 2675·2019-08-29 15:38
閱讀 2850·2019-08-26 12:10