亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注

系統 2751 0

本系列文章主要結合Python語言實現知識圖譜構建相關工程,具有一定創新性和實用性,非常希望各位博友交流討論,相互促進成長。前面兩篇文章詳細講解了哈工大Pyltp工具,包括中文分詞、詞性標注、實體識別、依存句法分析和語義角色標注等。但是其中文分詞效果不是很理想,如“貴州財經大學”總是切分成“貴州”、“財經”和“大學”,這是因為詞典中這些詞的權重較高。這篇文章主要介紹最經典的自然語言處理工具之一——Jieba,包括中文分詞、添加自定義詞典及詞性標注等內容。

知識圖譜系列文章:
[知識圖譜實戰篇] 一.數據抓取之Python3抓取JSON格式的電影實體
[知識圖譜實戰篇] 二.Json+Seaborn可視化展示電影實體
[知識圖譜實戰篇] 三.Python提取JSON數據、HTML+D3構建基本可視化布局
[知識圖譜實戰篇] 四.HTML+D3+CSS繪制關系圖譜
[知識圖譜實戰篇] 五.HTML+D3添加鼠標響應事件顯示相關節點及邊
[知識圖譜實戰篇] 六.HTML+D3實現點擊節點顯示相關屬性及屬性值
[知識圖譜實戰篇] 七.HTML+D3實現關系圖譜搜索功能
[知識圖譜實戰篇] 八.HTML+D3繪制時間軸線及顯示實體

環境下載地址:https://download.csdn.net/download/eastmount/11226539

原文地址:
[Python知識圖譜] 一.哈工大pyltp安裝及中文分句、中文分詞、導入詞典基本用法
[Python知識圖譜] 二.哈工大pyltp詞性標注、命名實體識別、依存句法分析和語義角色標注

參考前文:
[python] 使用Jieba工具中文分詞及文本聚類概念 - eastmount
楊秀璋. Python網絡數據爬取及分析從入門到精通(分析篇). 北京:北京航空航天大學出版社[M]. 2018


一.Jieba工具

在數據分析和數據挖掘中,通常需要經歷前期準備、數據爬取、數據預處理、數據分析、數據可視化、評估分析等步驟,而數據分析之前的工作幾乎要花費數據工程師近一半的工作時間,其中的數據預處理也將直接影響后續模型分析的好壞。

數據預處理(Data Preprocessing)是指在進行數據分析之前,對數據進行的一些初步處理,包括缺失值填寫、噪聲處理、不一致數據修正、中文分詞等,其目標是得到更標準、高質量的數據,糾正錯誤異常數據,從而提升分析的結果。
下圖是中文文本預處理的基本步驟,包括中文分詞、詞性標注、數據清洗、特征提取(向量空間模型存儲)、權重計算(TF-IDF)等

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第1張圖片

“結巴”(Jieba)工具是最常用的中文文本分詞和處理的工具之一,它能實現中文分詞、詞性標注、關鍵詞抽取、獲取詞語位置等功能。其在Github網站上的介紹及下載地址為:https://github.com/fxsjy/jieba

作者推薦大家使用PIP工具來安裝Jieba中文分詞包,安裝語句如下:

            
              pip install jieba

            
          

調用命令“pip install jieba”安裝jieba中文分詞包如下圖所示。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第2張圖片

安裝過程中的會顯示安裝配置相關包和文件的百分比,直到出現“Successfully installed jieba-0.37”命令,表示安裝成功。同時,在安裝過程中會遇到各種問題,大家一定要學會獨立搜索答案解決這些問題,才能提升您獨立解決問題的能力。


Jieba工具具有有以下特點:

  • 支持三種分詞模式,包括精確模式、全模式和搜索引擎模式
  • 支持繁體分詞
  • 支持自定義詞典
  • 代碼對Python2和Python3均兼容
  • 支持多種編程語言,包括Java、C++、Rust、PHP、R、Node.js等

Jieba工具主要使用的算法包括:(1)通過基于前綴詞典實現高效的詞圖掃描,構建句子中漢字所有可能生成詞情況的有向無環圖;(2)采用動態規劃查找最大概率路徑,尋找基于詞頻的最大切分組合;(3)對于未登錄詞,采用基于漢字成詞能力的HMM模型結合Viterbi算法。


二.中文分詞

1.基礎知識

由于中文詞語之間是緊密聯系的,一個漢語句子是由一串前后連續的漢字組成,詞與詞之間沒有明顯的分界標志,所以需要通過一定的分詞技術把句子分割成空格連接的詞序列,這就是所謂的中文分詞技術。

中文分詞(Chinese Word Segmentation)指將漢字序列切分成一個個單獨的詞或詞串序列,它能夠在沒有詞邊界的中文字符串中建立分隔標志,通常采用空格分隔。中文分詞是數據分析預處理、數據挖掘、文本挖掘、搜索引擎、知識圖譜、自然語言處理等領域中非常基礎的知識點,只有經過中文分詞后的語料才能轉換為數學向量的形式,繼續進行后面的分析。同時,由于中文數據集涉及到語義、歧義等知識,劃分難度較大,比英文復雜很多。

下面舉個簡單示例,對句子“我是程序員”進行分詞操作。

輸入:我是程序員
輸出1:我\是\程\序\員
輸出2:我是\是程\程序\序員
輸出3:我\是\程序員

這里分別采用了三種方法介紹中文分詞。“我\是\程\序\員”采用的是一元分詞法,將中文字符串分隔為單個漢字;“我是\是程\程序\序員”采用二元分詞法,將中文漢字兩兩分隔;“我\是\程序員”是比較復雜但更實用的分詞方法,它根據中文語義來進行分詞的,其分詞結果更準確。

中文分詞方法有很多,常見的包括基于字符串匹配的分詞方法、基于統計的分詞方法和基于語義的分詞方法等。這里介紹比較經典的基于字符串匹配的分詞方法。

基于字符串匹配的分詞方法又稱為基于字典的分詞方法,它按照一定策略將待分析的中文字符串與機器詞典中的詞條進行匹配,若在詞典中找到某個字符串,則匹配成功,并識別出對應的詞語。該方法的匹配原則包括最大匹配法(MM)、逆向最大匹配法(RMM)、逐詞遍歷法、最佳匹配法(OM)、并行分詞法等。

正向最大匹配法的步驟如下,假設自動分詞詞典中的最長詞條所含漢字的個數為n。

  • 從被處理文本中選取當前中文字符串中的前n個中文漢字作為匹配字段,查找分詞詞典,若詞典中存在這樣一個n字詞,則匹配成功,匹配字段作為一個詞被切分出來。
  • 若分詞詞典中找不到這樣的一個n字詞,則匹配失敗,匹配字段去掉最后一個漢字,剩下的中文字符作為新的匹配字段,繼續進行匹配。
  • 循環前兩個步驟進行匹配,直到匹配成功為止。

例如,現在存在一個句子“北京理工大學生前來應聘”,使用正向最大匹配方法進行中文分詞的過程如下所示。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第3張圖片

2.基本用法

首先讀者看一段簡單的結巴分詞代碼,主要調用兩個函數實現。

  • jieba.cut(text,cut_all=True)
    分詞函數,第一個參數是需要分詞的字符串,第二個參數表示是否為全模式。分詞返回的結果是一個可迭代的生成器(generator),可使用for循環來獲取分詞后的每個詞語,更推薦讀者轉換為list列表再使用。
  • jieba.cut_for_search(text)
    搜索引擎模式分詞,參數為分詞的字符串,該方法適合用于搜索引擎構造倒排索引的分詞,粒度比較細。
            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  
  
text 
              
                =
              
              
                "小楊畢業于北京理工大學,從事Python人工智能相關工作。"
              
              
                #全模式
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
              cut_all
              
                =
              
              
                True
              
              
                )
              
              
                print
              
              
                (
              
              
                type
              
              
                (
              
              data
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[全模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
              cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
              
                #默認是精確模式 
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[默認模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
              
                #搜索引擎模式 
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut_for_search
              
                (
              
              text
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[搜索引擎模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
              
                #返回列表
              
              
seg_list 
              
                =
              
               jieba
              
                .
              
              lcut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              
                "[返回列表]: {0}"
              
              
                .
              
              
                format
              
              
                (
              
              seg_list
              
                )
              
              
                )
              
            
          

輸出結果如下所示。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第4張圖片

最終的分詞結果比較理想,其中精確模式輸出的“小/楊/畢業/于/北京理工大學/,/從事/Python/人工智能/相關/工作/。”比較精準。下面簡單敘述結巴中文分詞的三種分詞模式。

全模式
該模式將語料中所有可以組合成詞的詞語都構建出來,其優點是速度非常快,缺點是不能解決歧義問題,并且分詞結果不太準確。其分詞結果為“小/楊/畢業/于/北京/北京理工/北京理工大學/理工/理工大/理工大學/工大/大學///從事/Python/人工/人工智能/智能/相關/工作//”。

精確模式
該模式利用其算法將句子最精確地分隔開,適合文本分析,通常采用這種模式進行中文分詞。其分詞結果為“小/楊/畢業/于/北京理工大學/,/從事/Python/人工智能/相關/工作/。”,其中“北京理工大學”、“人工智能”這些完整的名詞被精準識別,但也有部分詞未被識別,后續導入詞典可以實現專有詞匯識別。

搜索引擎模式
該模式是在精確模式基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。其結果為“小/楊/畢業/于/北京/理工/工大/大學/理工大/北京理工大學/,/從事/Python/人工/智能/人工智能/相關/工作/。”。

3.基于HMM模型的中文分詞

隱馬爾可夫模型(Hidden Markov Model, HMM)是一種基于概率的統計分析模型,用來描述一個系統隱性狀態的轉移和隱性狀態的表現概率。到目前為止,HMM模型被認為是解決大多數自然語言處理問題最為快速、有效的方法之一。它成功解決了語義識別、機器翻譯等問題。

在Jieba工具中,對于未登錄到詞庫的詞,使用了基于漢字成詞能力的 HMM 模型和 Viterbi 算法,其大致原理是采用四個隱含狀態,分別表示為單字成詞、詞組的開頭、詞組的中間和詞組的結尾。通過標注好的分詞訓練集,可以得到 HMM的各個參數,然后使用 Viterbi 算法來解釋測試集,得到分詞結果。

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  
  
text 
              
                =
              
              
                "他來到了網易杭研大廈工作,我繼續去北理讀研。"
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                ,
              
               HMM
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
              
                #精確模式+HMM
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                ,
              
               HMM
              
                =
              
              
                True
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
            
          

輸出結果如下圖所示,未啟用HMM模型時,它無法識別“杭研”、“北理”詞語,將其拆分成了“杭”、“研”和“北”、“理”,而啟用HMM模型時,它有效識別了新詞“杭研”、“北理”。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第5張圖片

4.繁體中文分詞

Jieba工具支持中文繁體字的識別,將前面示例轉換為繁體字,即“小楊畢業於北京理工大學,從事Python人工智能相關工作。”,調用Jieba分詞的代碼如下所示。

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  
  
text 
              
                =
              
              
                "小楊畢業於北京理工大學,從事Python人工智能相關工作。"
              
              
                #全模式
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                True
              
              
                )
              
              
                print
              
              
                (
              
              
                type
              
              
                (
              
              data
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[全模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
              
                #搜索引擎模式 
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut_for_search
              
                (
              
              text
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[搜索引擎模式]: "
              
              
                ,
              
              
                "/"
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
            
          

輸出結果如下所示:

            
              
                [
              
              全模式
              
                ]
              
              
                :
              
                /
              
                /
              
                /
              
                /
              
                /
              
              北京
              
                /
              
              北京理工
              
                /
              
              理工
              
                /
              
              理工大
              
                /
              
              工大
              
                /
              
                //
              
              
                /
              
                /
              
                /
              
              Python
              
                /
              
              人工
              
                /
              
              人工智能
              
                /
              
              智能
              
                /
              
                /
              
                /
              
              工作
              
                //
              
              
                [
              
              精確模式
              
                ]
              
              
                :
              
                /
              
                /
              
              畢業
              
                /
              
                /
              
              北京理工
              
                /
              
              大學
              
                /
              
                /
              
              從事
              
                /
              
              Python
              
                /
              
              人工智能
              
                /
              
              相關
              
                /
              
              工作
              
                /
              
                [
              
              搜索引擎模式
              
                ]
              
              
                :
              
                /
              
                /
              
              畢業
              
                /
              
                /
              
              北京
              
                /
              
              理工
              
                /
              
              北京理工
              
                /
              
              大學
              
                /
              
                /
              
              從事
              
                /
              
              Python
              
                /
              
              人工
              
                /
              
              智能
              
                /
              
              人工智能
              
                /
              
              相關
              
                /
              
              工作
              
                /
              
          

三.添加自定義詞典

1.添加詞典

在進行中文分詞過程中,通常會遇到一些專用詞語無法精準的切分,比如“乾清宮”會被分割為“乾”、“清宮”,“黃果樹瀑布”會被分割為“黃果樹”、“瀑布”,“云計算”會被分割為“云”、“計算”,“貴州財經大學”會被分割為“貴州”、“財經大學”等。雖然Jieba工具有新詞識別能力,但也無法識別出所有Jieba詞庫里沒有的詞語,但它為開發者提供了添加自定義詞典功能,從而保證更好的分詞正確率。其函數原型如下:

  • load_userdict(f)
    該函數只有一個參數,表示載入的自定義詞典路徑,f 為文件類對象或自定義詞典路徑下的文件。詞典的格式為:一個詞占一行,每行分為三部分:
            
              word  freq  word_type

            
          

其中,word為對應的詞語,freq為詞頻(可省略),word_type為詞性(可省了),中間用空格隔開,順序不可以改變。注意,文件必須為UTF-8編碼。

下面舉例講解,第一個代碼是未導入自定義詞典的中文分詞。

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  
  
text 
              
                =
              
              
                "小楊在貴州財經大學工作,擅長大數據、云計算,喜歡乾清宮、黃果樹瀑布等景區。"
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[原始文本]: "
              
              
                ,
              
               text
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                " "
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
            
          

輸出結果未將“貴州財經大學”、“大數據”、“云計算”、“乾清宮”、“黃果樹瀑布”等詞匯正確分割。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第6張圖片

接著導入自定義詞典,其本地詞典命名為“dict.txt”,如圖所示,包括設置“貴州財經大學”的詞性為機構名詞“nt”,“大數據”、“云計算”的詞性為名詞“n”,也有省略詞性和詞頻的“乾清宮”。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第7張圖片

完整代碼如下:

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  

text 
              
                =
              
              
                "楊秀璋在貴州財經大學工作,擅長大數據、云計算,喜歡乾清宮、黃果樹瀑布等景區。"
              
              
                #導入自定義詞典
              
              
jieba
              
                .
              
              load_userdict
              
                (
              
              
                "dict.txt"
              
              
                )
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[原始文本]: "
              
              
                ,
              
               text
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                " "
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
            
          

此時的輸出結果有效地提取了“貴州財經大學”、“云計算”、“乾清宮”。但也有兩個未識別出的詞語,“黃果樹瀑布”不在詞典中,故被拆分成了“黃果樹”和“瀑布”,“大數據”雖然在詞典中,卻仍然拆分成了“大”和“數據”。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第8張圖片

2.動態修改詞典

在Jieba工具中,可以在程序中動態修改詞典,通過add_word(word, freq=None, tag=None)函數添加新詞語,通過del_word(word)函數刪除自定義詞語。

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  

text 
              
                =
              
              
                "小楊在貴州財經大學工作,擅長大數據、云計算,喜歡乾清宮、黃果樹瀑布等景區。"
              
              
                #導入自定義詞典
              
              
jieba
              
                .
              
              load_userdict
              
                (
              
              
                "dict.txt"
              
              
                )
              
              
                #添加自定義詞語
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "小楊"
              
              
                )
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "黃果樹瀑布"
              
              
                )
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "自然語言處理"
              
              
                ,
              
               freq
              
                =
              
              
                10
              
              
                ,
              
               tag
              
                =
              
              
                "nz"
              
              
                )
              
              
                #刪除自定義詞語
              
              
jieba
              
                .
              
              del_word
              
                (
              
              
                "北理工"
              
              
                )
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[原始文本]: "
              
              
                ,
              
               text
              
                ,
              
              
                "\n"
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                " "
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
            
          

該代碼增加了新詞語“小楊”、“黃果樹瀑布”和“自然語言處理”,刪除了“北理工”,其運行結果如下所示,它有效地將“小楊”和“黃果樹瀑布”進行了精準識別。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第9張圖片

此時,讀者可能會有一個疑問,為什么“大數據”被拆分成了“大”和“數據”呢?這是因為Jieba詞庫中“大”和“數據”的重要程度更高,我們可以使用suggest_freq(segment, tune=True)函數調節單個詞語的詞頻,使其被分割出來。

代碼如下所示:

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  

text 
              
                =
              
              
                "小楊在貴州財經大學工作,擅長大數據、云計算,喜歡乾清宮、黃果樹瀑布等景區。"
              
              
                #導入自定義詞典
              
              
jieba
              
                .
              
              load_userdict
              
                (
              
              
                "dict.txt"
              
              
                )
              
              
                #添加自定義詞語
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "小楊"
              
              
                )
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "黃果樹瀑布"
              
              
                )
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "自然語言處理"
              
              
                ,
              
               freq
              
                =
              
              
                10
              
              
                ,
              
               tag
              
                =
              
              
                "nz"
              
              
                )
              
              
                #刪除自定義詞語
              
              
jieba
              
                .
              
              del_word
              
                (
              
              
                "北理工"
              
              
                )
              
              
                #調節詞頻
              
              
jieba
              
                .
              
              suggest_freq
              
                (
              
              
                '大數據'
              
              
                ,
              
              
                True
              
              
                )
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[原始文本]: "
              
              
                ,
              
               text
              
                ,
              
              
                "\n"
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                " "
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                )
              
            
          

最終的輸出結果為“ 小楊 貴州財經大學 工作 , 擅長 大數據 云計算 , 喜歡 乾清宮 黃果樹瀑布 等 景區 。”

終于將“小楊”、“貴州財經大學”、“大數據”、“云計算”、“乾清宮”、“黃果樹瀑布”等專有詞語識別出來。同時,如果自定義詞典存在很多專用名詞,并且需要設置它們的高權重,可以使用下面的代碼循環設置每一個詞語的詞頻。

            
              
                #循環設置詞頻重要程度
              
              
fp 
              
                =
              
              
                open
              
              
                (
              
              
                "dict.txt"
              
              
                ,
              
              
                'r'
              
              
                ,
              
               encoding
              
                =
              
              
                'utf8'
              
              
                )
              
              
                for
              
               line 
              
                in
              
               fp
              
                :
              
              
    line 
              
                =
              
               line
              
                .
              
              strip
              
                (
              
              
                )
              
              
jieba
              
                .
              
              suggest_freq
              
                (
              
              line
              
                ,
              
              
                True
              
              
                )
              
              
                #第二種方法
              
              
                [
              
              jieba
              
                .
              
              suggest_freq
              
                (
              
              line
              
                .
              
              strip
              
                (
              
              
                )
              
              
                ,
              
              
                True
              
              
                )
              
              
                for
              
               line 
              
                in
              
              
                open
              
              
                (
              
              
                "dict.txt"
              
              
                ,
              
              
                'r'
              
              
                ,
              
              encoding
              
                =
              
              
                'utf8'
              
              
                )
              
              
                ]
              
            
          

四. 詞性標注

詞性標注(Part-Of-Speech Tagging, POS Tagging)也被稱為語法標注(Grammatical Tagging)或詞類消疑(Word-category Disambiguation),是將語料庫內單詞的詞性按其含義和上下文內容進行標記的文本數據處理技術。通過詞性標注處理,可以將分詞得到的詞序列中每個單詞標注一個正確的詞性。

在Jieba工具中,調用jieba.posseg.POSTokenizer(tokenizer=None)函數新建自定義分詞器。tokenizer參數可指定內部使用的jieba.Tokenizer分詞器,jieba.posseg.dt為默認詞性標注分詞器。Jieba工具采用和Ictclas 兼容的標記法,標注句子分詞后每個詞的詞性通過循環輸出。表4-1為Jieba工具的各個詞性及含義。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第10張圖片

官方文檔給出的示例如下所示,通過“import jieba.posseg as pseg”語句導入擴展包,接著循環輸出word(詞語)和flag(詞性)值。

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba
              
                .
              
              posseg 
              
                as
              
               pseg


              
                #詞性標注
              
              
words 
              
                =
              
               pseg
              
                .
              
              cut
              
                (
              
              
                "我愛北京天安門"
              
              
                )
              
              
                for
              
               word
              
                ,
              
               flag 
              
                in
              
               words
              
                :
              
              
                print
              
              
                (
              
              
                '%s %s'
              
              
                %
              
              
                (
              
              word
              
                ,
              
               flag
              
                )
              
              
                )
              
            
          

輸出結果如圖所示,其中“我”表示代詞,對應“r”;“愛”對應動詞,對應“v”,“北京”和“天安門”對應地點名詞,對應“ns”。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第11張圖片

上面小節的示例對應的詞性標注代碼如下所示。

            
              
                #encoding=utf-8  
              
              
                import
              
               jieba  

              
                import
              
               jieba
              
                .
              
              posseg

              
                import
              
               jieba
              
                .
              
              analyse

text 
              
                =
              
              
                "小楊在貴州財經大學工作,擅長大數據、云計算,喜歡乾清宮、黃果樹瀑布等景區。"
              
              
                #導入自定義詞典
              
              
jieba
              
                .
              
              load_userdict
              
                (
              
              
                "dict.txt"
              
              
                )
              
              
                #添加自定義詞語
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "小楊"
              
              
                )
              
              
jieba
              
                .
              
              add_word
              
                (
              
              
                "黃果樹瀑布"
              
              
                )
              
              
                #調節詞頻
              
              
jieba
              
                .
              
              suggest_freq
              
                (
              
              
                '大數據'
              
              
                ,
              
              
                True
              
              
                )
              
              
                #精確模式  
              
              
data 
              
                =
              
               jieba
              
                .
              
              cut
              
                (
              
              text
              
                ,
              
               cut_all
              
                =
              
              
                False
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[原始文本]: "
              
              
                ,
              
               text
              
                ,
              
              
                "\n"
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                "[精確模式]: "
              
              
                ,
              
              
                " "
              
              
                .
              
              join
              
                (
              
              data
              
                )
              
              
                ,
              
              
                "\n"
              
              
                )
              
              
                #詞性標注
              
              
sentence_seged 
              
                =
              
               jieba
              
                .
              
              posseg
              
                .
              
              cut
              
                (
              
              text
              
                )
              
              
outstr 
              
                =
              
              
                ''
              
              
                for
              
               x 
              
                in
              
               sentence_seged
              
                :
              
              
    outstr 
              
                +=
              
              
                "{}/{}  "
              
              
                .
              
              
                format
              
              
                (
              
              x
              
                .
              
              word
              
                ,
              
               x
              
                .
              
              flag
              
                )
              
              
                print
              
              
                (
              
              u
              
                '[詞性標注]:'
              
              
                ,
              
               outstr
              
                )
              
            
          

輸出結果如圖所示。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第12張圖片

五.總結

希望這篇基礎性文章對你有所幫助,如果有錯誤或不足之處,還請海涵。下一篇將詳細講解Jieba工具實現關鍵詞抽取、事件抽取和命名實體識別等例子。望喜歡~同時,后續分享更多的是網絡安全方面的文章了,從零開始很難,但秀璋會一路走下去的,加油。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第13張圖片

故人應在千里外,
不寄梅花遠信來。
武漢第一周學習結束,寄了第一封家書給女神,接下來這幾年,應該會寫上200來封吧,很期待,也很漫長,但我倆的故事將繼續書寫。

今天早上做了我來這的第一次PPT匯報,是關于網絡安全和數據挖掘、人工智能的融合,也聽了學弟們的匯報,真的學到好多,也記錄了無數未知的詞匯,接下來要學的更多。這一周給我最深刻的印象就是:學弟學妹們怎么這么刻苦?早上去得很早,中午不回去午休,晚上還繼續敲代碼,而且本科大三的學弟們也很多,在沒有老師的情況下,小組自發組織PPT匯報探討,仿佛我是那個最“偷懶”的學生,我猜:肯定是外面太熱,他們都想蹭空調!

真的很感激這次來之不易的學習機會,感謝所有的老師、師兄師姐、師弟師妹,更感激家人朋友和女神。也謝謝CSDN認識的博友請我吃飯,武大測繪本碩博連讀讓我甚是佩服,真的通過CSDN認識了很多朋友,大家分散五湖四海,共同進步。

[Python知識圖譜] 三.Jieba工具中文分詞、添加自定義詞典及詞性標注詳解_第14張圖片

未來的路還很長,優秀的人真的太多,我們只有做好自己,不忘初心,享受生活,砥礪前行。明天周末繼續奮斗,晚安娜,記得收信

(By:楊秀璋 2019-07-28 周日下午5點寫于武大 https://blog.csdn.net/Eastmount )


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线观看日本一区 | 99热这里只有精品4 99热这里只有精品5 | 国产高清不卡一区二区 | 五月婷婷一区 | 婷婷免费高清视频在线观看 | 欧洲精品在线观看 | 一本大道香蕉高清久久 | 日韩不卡一级毛片免费 | 国产高清精品久久久久久久 | 四月婷婷七月婷婷综合 | 四虎影院在线免费观看视频 | 国产精品免费综合一区视频 | 亚洲国产精品综合久久久 | 天天色天天操天天射 | 看真人视频一一级毛片 | 这里只有精品免费视频 | 国产欧美一区二区三区视频 | 国产在线观看中文字幕 | 国产精品一区二区在线播放 | 国产精品久久久久久久久免费 | 97碰公开在线观看免费视频 | 天天摸天天操天天干 | 国产精品成人亚洲 | 高清亚洲综合色成在线播放放 | 久久精品日日躁精品 | 青青99| 伊人久久综合视频 | 成人区精品一区二区不卡亚洲 | 亚洲国产九九精品一区二区 | 国产成人 免费观看 | 亚洲成色在线综合网站 | 国产一区二区三区亚洲综合 | 亚洲国产精品看片在线观看 | 国产女人水多毛片18 | 中文字幕视频不卡 | 成人欧美一区二区三区黑人妖 | 欧美肥老妇做爰视频 | 午夜视频在线观看网站 | 国产99视频精品一区 | 国产午夜不卡在线观看视频666 | 亚洲综合色婷婷中文字幕 |