分詞模式
jieba分詞有多種模式可供選擇。可選的模式包括:
全切分模式
精確模式
搜索引擎模式
同時也提供了HMM模型的開關。
其中全切分模式就是輸出一個字串的所有分詞,
精確模式是對句子的一個概率最佳分詞,
而搜索引擎模式提供了精確模式的再分詞,將長詞再次拆分為短詞。
效果大抵如下:
# encoding=utf-8 import jieba seg_list = jieba.cut("我來到北京清華大學", cut_all=True) print("Full Mode: " + "/ ".join(seg_list)) # 全模式 seg_list = jieba.cut("我來到北京清華大學", cut_all=False) print("Default Mode: " + "/ ".join(seg_list)) # 精確模式 seg_list = jieba.cut("他來到了網易杭研大廈") # 默認是精確模式 print(", ".join(seg_list)) seg_list = jieba.cut_for_search("小明碩士畢業于中國科學院計算所,后在日本京都大學深造") # 搜索引擎模式 print(", ".join(seg_list))
的結果為
【全模式】: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學 【精確模式】: 我/ 來到/ 北京/ 清華大學 【新詞識別】:他, 來到, 了, 網易, 杭研, 大廈 (此處,“杭研”并沒有在詞典中,但是也被Viterbi算法識別出來了) 【搜索引擎模式】: 小明, 碩士, 畢業, 于, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, 后, 在, 日本, 京都, 大學, 日本京都大學, 深造
其中,新詞識別即用HMM模型的Viterbi算法進行識別新詞的結果。
值得詳細研究的模式是精確模式,以及其用于識別新詞的HMM模型和Viterbi算法。
jieba.cut()在載入詞典之后,jieba分詞要進行分詞操作,在代碼中就是核心函數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中給出了默認的模式,精確分詞 + HMM模型開啟。
第12-23行進行了變量配置。
第24行做的事情是對句子進行中文的切分,把句子切分成一些只包含能處理的字符的塊(block),丟棄掉特殊字符,因為一些詞典中不包含的字符可能對分詞產生影響。
24行中re_han默認值為re_han_default,是一個正則表達式,定義如下:
# 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)
可以看到諸如空格、制表符、換行符之類的特殊字符在這個正則表達式被過濾掉。
25-40行使用yield實現了返回結果是一個迭代器,即文檔中所說:
jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for 循環來獲得分詞后得到的每一個詞語(unicode)
其中,31-40行,如果遇到block是非常規字符,就正則驗證一下直接輸出這個塊作為這個塊的分詞結果。如標點符號等等,在分詞結果中都是多帶帶一個詞的形式出現的,就是這十行代碼進行的。
關鍵在28-30行,如果是可分詞的block,那么就調用函數cut_block,默認是cut_block = self.__cut_DAG,進行分詞
jieba.__cut_DAG()__cut_DAG的作用是按照DAG,即有向無環圖進行切分單詞。其代碼如下:
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
對于一個sentence,首先 獲取到其有向無環圖DAG,然后利用dp對該有向無環圖進行最大概率路徑的計算。
計算出最大概率路徑后迭代,如果是登錄詞,則輸出,如果是單字,將其中連在一起的單字找出來,這些可能是未登錄詞,使用HMM模型進行分詞,分詞結束之后輸出。
至此,分詞結束。
其中,值得跟進研究的是第2行獲取DAG,第4行計算最大概率路徑和第20和34行的使用HMM模型進行未登錄詞的分詞,在后面的文章中會進行解讀。
DAG = self.get_DAG(sentence) ... self.calc(sentence, DAG, route) ... recognized = finalseg.cut(buf)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37653.html
摘要:由此得到了,下一步就是使用動態規劃對最大概率路徑進行求解。最大概率路徑值得注意的是,的每個結點,都是帶權的,對于在詞典里面的詞語,其權重為其詞頻,即。動態規劃求解法滿足的條件有兩個重復子問題最優子結構我們來分析最大概率路徑問題。 DAG(有向無環圖) 有向無環圖,directed acyclic graphs,簡稱DAG,是一種圖的數據結構,其實很naive,就是沒有環的有向圖_(:...
摘要:分詞的算法中文分詞有難度,不過也有成熟的解決方案。例如通過人民日報訓練的分詞系統,在網絡玄幻小說上,分詞的效果就不會好。三的優點是開源的,號稱是中,最好的中文分詞組件。 showImg(https://segmentfault.com/img/remote/1460000016359704?w=1350&h=900); 題圖:by Lucas Davies 一、前言 分詞,我想是大多數...
Python在工作中的應用還是比較的廣泛的,市場上面對于這類人才開出的薪資還是比較的高的。那么,如何使用第三方庫jieba庫與中文分詞進行一個分解呢?下面小編就給大家詳細的做出一個解答。 一、什么是jieba庫 jieba是優秀的中文分詞第三方庫,由于中文文本之間每個漢字都是連續書寫的,我們需要通過特定的手段來獲得其中的每個詞組,這種手段叫做分詞,我們可以通過jieba庫來完成這個過程。 ...
摘要:前言今天教大家用模塊來生成詞云,我讀取了一篇小說并生成了詞云,先看一下效果圖效果圖一效果圖二根據效果圖分析的還是比較準確的,小說中的主人公就是程理,所以出現次數最多。 前言 今天教大家用wrodcloud模塊來生成詞云,我讀取了一篇小說并生成了詞云,先看一下效果圖: 效果圖一: showImg(https://segmentfault.com/img/remote/1460000015...
閱讀 3384·2021-11-22 09:34
閱讀 656·2021-11-19 11:29
閱讀 1355·2019-08-30 15:43
閱讀 2238·2019-08-30 14:24
閱讀 1870·2019-08-29 17:31
閱讀 1229·2019-08-29 17:17
閱讀 2620·2019-08-29 15:38
閱讀 2736·2019-08-26 12:10