1. 程式人生 > >自然語言處理之jieba分詞

自然語言處理之jieba分詞

 

在所有人類語言中,一句話、一段文字、一篇文章都是有一個個的片語成的。詞是包含獨立意義的最小文字單元,將長文字拆分成單個獨立的詞彙的過程叫做分詞。分詞之後,文字原本的語義將被拆分到在更加精細化的各個獨立詞彙中,詞彙的結構比長文字簡單,對於計算機而言,更容易理解和分析,所以,分詞往往是自然語言處理的第一步。

 

對於英文文字,句子中的詞彙可以通過空格很容易得進行劃分,但是在我們中文中則不然,沒有明顯的劃分標誌,所以需要通過專門的方法(演算法)進行分詞。在Python中,有多種庫實現了各種方法支援中文分詞,例如:jieba、hanlp、pkuseg等。在本篇中,先來說說jieba分詞。

 

1 四種模式分詞¶

 

(1)精確模式:試圖將句子最精確地切開,適合文字分析。精確分詞模式對應的方法是jieba.cut,該方法接受四個輸入引數: 需要分詞的字串;cut_all 引數用來控制是否採用全模式,值為False時表示採用精確分詞模式;HMM 引數用來控制是否使用 HMM 模型。

(2)全模式:把句子中所有的可以成詞的詞語都掃描出來,速度非常快,但是不能解決歧義。全模式同樣是呼叫jieba.cut方法實現,不過cut_all引數值設定為True。

(3)搜尋引擎模式:在精確模式的基礎上,對長詞再詞切分,提高召回率,適合用於搜尋引擎分詞。搜尋引擎模式對應的方法是jieba.cut_for_search。該方法接受兩個引數:需要分詞的字串;是否使用 HMM 模型。該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細。

注意,待分詞的字串可以是 unicode 或 UTF-8 字串、GBK 字串。注意:不建議直接輸入 GBK 字串,可能無法預料地錯誤解碼成 UTF-8。 另外,jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for 迴圈來獲得分詞後得到的每一個詞語(unicode),或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。

在分詞文字過大時,可以使用jieba.enable_parallel()來開啟並行分詞模式,使用多進行進行分詞。

In [1]:
import jieba
In [4]:
strt = "據報道,因雷暴雨天氣,該地區川億線變壓器跌落式熔斷器引流線燒斷,造成電壓不穩" 
 
# 精確模式,預設hi精確模式,所以可以不指定cut_all=False
sl = jieba.cut(strt, cut_all=False, HMM=False)
print("精確模式分詞結果:", ",".join(sl))
print('\n')

# 全模式
sl = jieba.cut(strt, cut_all=True)
print("全模式分詞結果:", ",".join(sl) )
print('\n')
 
# 搜尋引擎模式
sl = jieba.cut_for_search(strt)
print("搜尋引擎模式分詞結果:", ",".join(sl))
 
精確模式分詞結果: 據,報道,,,因,雷暴雨,天氣,,,該,地區,川,億,線,變壓器,跌落,式,熔斷器,引流,線,燒,斷,,,造成,電壓,不,穩


全模式分詞結果: 據,報道,,,因,雷暴,雷暴雨,暴雨,雨天,天氣,,,該地,地區,川,億,線,變壓,變壓器,跌落,式,熔斷,熔斷器,引流,流線,燒,斷,,,造成,成電,電壓,不穩


搜尋引擎模式分詞結果: 據,報道,,,因,雷暴,暴雨,雷暴雨,天氣,,,該,地區,川,億線,變壓,變壓器,跌落,式,熔斷,熔斷器,引流,線,燒斷,,,造成,電壓,不,穩
 

在上面分詞結果中,可以看出,部分專有名詞並沒有被正確劃分,這時候可以試試將HMM引數設定為True,表示使用隱馬爾可夫模型發現新詞:

In [29]:
sl = jieba.cut(strt, cut_all=False, HMM=True)
print(",".join(sl))
 
據,報道,,,因,雷暴雨,天氣,,,該,地區,川,億線,變壓器,跌落,式,熔斷器,引流線,燒斷,,,造成,電壓,不穩
 

遺憾的是,就算使用了發現新詞功能,只是進一步劃分出了“燒斷”一詞,仍然沒有對“川億線”、“跌落式”、“引流線”等詞彙進行正確提取,這是隱馬爾可夫模型分詞原理決定的,只能發現在原始訓練詞庫彙總頻率稍高的新詞,而對沒有出現過的新詞無能為力。這時候,我們可以自定義詞典來新增新詞。

 

2 自定義詞典分詞¶

 

2.1 新增詞典¶

 

自定義詞典分詞是指在分詞前,使用者手動將部分詞彙新增到結巴分詞的詞庫中。通過這種方式可以進一步提取出預設詞庫中沒有的詞彙,提高分詞準確率。

在新增詞典通過jieba.load_userdict(file_name)方法實現,引數file_name是詞典檔名,詞典中一個詞佔一行,每一行分三部分,即詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。

 

可見,“川億線”一次已被正確劃分。再來試試jieba.load_userdict(file_name)新增詞庫,這種方式的好處是可以一次性新增多個詞。我們先將詞彙寫入檔案,請讀者自行新建一個名為“dict.txt”的檔案,寫入一下內容:

 

跌落式 90 a 熔斷器 80 a 跌落式熔斷器 10 n 引流線 80 n

In [2]:
strt = "據報道,因雷暴雨天氣,該地區川億線變壓器跌落式熔斷器引流線燒斷,造成電壓不穩" 
In [10]:
jieba.load_userdict('dict.txt')
sl = jieba.cut(strt, cut_all=False)
print(",".join(sl))
 
據,報道,,,因,雷暴雨,天氣,,,該,地區,川,億線,變壓器,跌落式熔斷器,引流線,燒斷,,,造成,電壓,不,穩
 

從上面結果可以看出,新增自定義的詞庫後,原本沒有被正確劃分出來的詞,如“跌落式熔斷器”,“引流線”等都被正確劃分出來了。

 

2.2 調整詞典¶

 

新增自定義的詞典後,有時候我們還是需要對詞典進行微調。

  • jieba.suggest_freq()

在上述我們自定義的詞典中包含“跌落式”、“熔斷器”、“跌落式熔斷器”三個詞,但是分詞結果中按最長的“跌落式熔斷器”進行分詞,如果我們分別進行劃分,可以使用jieba.suggest_freq()方法調節單個詞語的詞頻,使其能(或不能)被正確劃分出來。

In [16]:
jieba.suggest_freq(('跌落式', '熔斷器'), tune=True)
Out[16]:
0
In [24]:
sl = jieba.cut(strt, cut_all=False, HMM=False)
print(",".join(sl))
 
據,報道,,,因,雷暴雨,天氣,,,該,地區,川,億,線,變壓器,跌落,式,熔斷器,引流線,燒,斷,,,造成,電壓,不穩
 

這時候,“跌落式”、“熔斷器”兩個詞就沒有在被完整劃分。

 

同時,對於居中的“不穩”一詞,在上述分詞結果中被分成了兩個部分,這裡也可以通過jieba.suggest_freq()調整,使其分為一個完整詞。

In [12]:
jieba.suggest_freq('不穩', tune=True)
Out[12]:
12
In [13]:
sl = jieba.cut(strt, cut_all=False)
print(",".join(sl))
 
據,報道,,,因,雷暴雨,天氣,,,該,地區,川,億線,變壓器,跌落式熔斷器,引流線,燒斷,,,造成,電壓,不穩
In [25]:
sl = jieba.cut(strt, cut_all=False)
print(",".join(sl))
 
據,報道,,,因,雷暴雨,天氣,,,該,地區,川,億線,變壓器,跌落,式,熔斷器,引流線,燒斷,,,造成,電壓,不穩
 
  • jieba.add_word(word, freq=None, tag=None)

jieba.add_word()用於向詞庫中新增一個詞,該方法有三個引數:word指需要新增的詞,freq是詞頻,tag是詞性,其中,詞頻和詞性可省略。例如,在上述分詞中沒有被正確劃分為一個詞“川億線”新增到詞庫中:

In [27]:
jieba.add_word('川億線')
sl = jieba.cut(strt, cut_all=False, HMM=False)
print(",".join(sl))
 
據,報道,,,因,雷暴雨,天氣,,,該,地區,川億線,變壓器,跌落,式,熔斷器,引流線,燒,斷,,,造成,電壓,不穩
 
  • del_word(word)

del_word(word)可以刪除詞庫中的一個詞。

In [28]:
jieba.del_word('川億線')
sl = jieba.cut(strt, cut_all=False, HMM=False)
print(",".join(sl))
 
據,報道,,,因,雷暴雨,天氣,,,該,地區,川,億,線,變壓器,跌落,式,熔斷器,引流線,燒,斷,,,造成,電壓,不穩
 

3 詞性標註¶

 

jieba分詞中,通過jieba.posseg提供詞性標註支援。jieba.posseg.cut()方法返回一個生成器,jieba.posseg.lcut()放回一個列表。

In [30]:
import jieba.posseg
In [39]:
sl = jieba.posseg.cut(strt)
for x in sl:
    print('分詞: ', x.word, '     詞性: ', x.flag)
 
分詞:  據      詞性:  p
分詞:  報道      詞性:  v
分詞:  ,      詞性:  x
分詞:  因      詞性:  p
分詞:  雷暴雨      詞性:  nr
分詞:  天氣      詞性:  n
分詞:  ,      詞性:  x
分詞:  該      詞性:  r
分詞:  地區      詞性:  n
分詞:  川      詞性:  j
分詞:  億線      詞性:  m
分詞:  變壓器      詞性:  n
分詞:  跌落      詞性:  v
分詞:  式      詞性:  k
分詞:  熔斷器      詞性:  n
分詞:  引流線      詞性:  n
分詞:  燒斷      詞性:  v
分詞:  ,      詞性:  x
分詞:  造成      詞性:  v
分詞:  電壓      詞性:  n
分詞:  不穩      詞性:  a
 

結巴分詞中,各種詞性標註含義如下所示:

 

相關推薦

自然語言處理jieba

  在所有人類語言中,一句話、一段文字、一篇文章都是有一個個的片語成的。詞是包含獨立意義的最小文字單元,將長文字拆分成單個獨立的詞彙的過程叫做分詞。分詞之後,文字原本的語義將被拆分到在更加精細化的各個獨立詞彙中,詞彙的結構比長文字簡單,對於計算機而言,更容易理解和分析,所以,分詞往往是自然

自然語言處理中文器-jieba器詳解及python實戰

中文分詞是中文文字處理的一個基礎步驟,也是中文人機自然語言互動的基礎模組,在進行中文自然語言處理時,通常需要先進行分詞。本文詳細介紹現在非常流行的且開源的分詞器結巴jieba分詞器,並使用python實

自然語言處理中文器詳解

中文分詞是中文文字處理的一個基礎步驟,也是中文人機自然語言互動的基礎模組,不同於英文的是,中文句子中沒有詞的界限,因此在進行中文自然語言處理時,通常需要先進行分詞,分詞效果將直接影響詞性,句法樹等模組

自然語言處理2 -- jieba用法及原理

系列文章,請多關注 Tensorflow原始碼解析1 – 核心架構和原始碼結構 帶你深入AI(1) - 深度學習模型訓練痛點及解決方法 自然語言處理1 – 分詞 自然語言處理2 – jieba分詞用法及原理 自然語言處理3 – 詞性標註 自然語言處理4 – 句法分析 自然語言處理5 –

自然語言處理_SentencePiece

1、 說明 SentencePiece是一個google開源的自然語言處理工具包。網上是這麼描述它的:資料驅動、跨語言、高效能、輕量級——面向神經網路文字生成系統的無監督文字詞條化工具。 那麼它究竟是幹什麼的呢?先舉個例子:假設在資料探勘時,有一列特徵T是文字描述,我們需要將其轉

自然語言處理jieba, gensim模塊

src tex tokenize 出現 其中 lambda pip 理論 aid 一,自然語言處理 自然語言處理(NLP) :自然語言處理是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融

自然語言處理入門----中文原理

1.中文分詞原理介紹 1.1 中文分詞概述 中文分詞(Chinese Word Segmentation) 指的是將一個漢字序列切分成一個一個單獨的詞。分詞就是將連續的字序列按照一定的規範重新組合成詞序列的過程。 1.2 中文分詞方法介紹 現有的分詞方法可分為三大類:基於字串匹配的分

自然語言處理word2vec原理向量生成

前言 word2vec是如何得到詞向量的?這個問題比較大。從頭開始講的話,首先有了文字語料庫,你需要對語料庫進行預處理,這個處理流程與你的語料庫種類以及個人目的有關,比如,如果是英文語料庫你可能需要大小寫轉換檢查拼寫錯誤等操作,如果是中文日語語料庫你需

自然語言處理與中文的難點總結

中文自動分詞 指的是使用計算機自動對中文文字進行詞語的切分,即像英文那樣使得中文句子中的詞之間有空格以標識。中文自動分詞被認為是中文自然語言處理中的一個最基本的環節。 中文分詞的難點 · 未登入詞,基於詞庫的分詞方法往往不能識別新詞、特定領域的專有詞。人名、機構名、

自然語言處理的中文方法

中文分詞方法 平臺:win7,python,vs2010 1、CRF++ CRF++是著名的條件隨機場開源工具,也是目前綜合性能最佳的CRF工具。 一、工具包的下載: 其中有兩種,一種是Linux下(帶原始碼)的,一種是win32的,下載 ht

自然語言處理工具pyhanlp與詞性標註

Pyhanlp分詞與詞性標註的相關內容記得此前是有分享過的。可能時間太久記不太清楚了。以下文章是分享自“baiziyu”所寫(小部

自然語言處理、命名主體識別、詞性、語法分析-stanfordcorenlp-NER(二)

轉載請註明出處:https://blog.csdn.net/HHTNAN 在前面我們介紹了Stanford CoreNLP, 自然語言處理之命名實體識別-tanfordcorenlp-NER(一) 功能列表 工具以及對各種語言的支援如下表(英文和中文支援的最好),分別對應:

自然語言處理:c++中文(附原始碼)

githup地址:https://github.com/jbymy 一、簡介 中文分詞是地然語言處理中的最基礎的環節,到目前為止已經有不少優秀的分詞工具的出現,如“中科院分詞”,“結

自然語言處理hanlp,Python呼叫與構建,、關鍵詞提取、命名主體識別

HanLP是一系列模型與演算法組成的NLP工具包,由大快搜索主導並完全開源,目標是普及自然語言處理在生產環境中的應用。HanLP具備功能完善、效能高效、架構清晰、語料時新、可自定義的特點。在Python中一種是直接呼叫hanlp的介面pyhanlp.還有就是

NLPjieba原理簡析

一、jieba介紹 jieba庫是一個簡單實用的中文自然語言處理分詞庫。 jieba分詞屬於概率語言模型分詞。概率語言模型分詞的任務是:在全切分所得的所有結果中求某個切分方案S,使得P(S)最大。 jieba支援三種分詞模式: 全模式,把句子中所有的可以成詞的詞語都掃描出來,

自然語言處理:搭建基於HanLP的開發環境(轉)

環境搭建比FNLP的簡單,具體參考:https://github.com/hankcs/HanLP 各個版本的下載:https://github.com/hankcs/HanLP/releases 完畢後有一個報錯: 字元型別對應表載入失敗: D:/eclipse_workspace

自然語言處理AI深度學習頂級實戰課

自然語言處理之AI深度學習頂級實戰課網盤地址:https://pan.baidu.com/s/1cPqqMpX-xDEMoA3iDscrnw 提取碼: swqh備用地址(騰訊微雲):https://share.weiyun.com/5UGchsv 密碼:pp5ix3 課程大綱:1、NLP和深度學習發展概況和

自然語言處理情感分析與觀點挖掘

觀點、情感以及與之相關的許多概念,如評價、評估、態度、感情、情緒和心情,與我們主觀的感覺和感受密切相關。這些是人類心理活動的核心要素,也是影響人們日常行為的關鍵因素。情感分析也稱為觀點挖掘,是一個旨在利用可計算的方法從自然語言文字中提取觀點和情感資訊的研究課題。 一.情感分

【python資料處理jieba

jieba(結巴)是一個強大的分詞庫,完美支援中文分詞  三種分詞模式 import jieba s = u'我想和女朋友一起去北京故宮博物院參觀和閒逛。' cut = jieba.cut(s) #三種模式 print( '【Output】精確模式:') prin

自然語言處理命名實體識別-tanfordcorenlp-NER(一)

轉載請註明出處:https://blog.csdn.net/HHTNAN 簡介 CoreNLP 專案是Stanford開發的一套開源的NLP系統。包括tokenize, pos , parse 等功能,與SpaCy類似。SpaCy號稱是目前最快的NLP系統, 並且提供現成的pyt