<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          jieba,為中文分詞而生的Python庫

          共 6933字,需瀏覽 14分鐘

           ·

          2022-04-20 20:14

          中文分詞,通俗來說,就是將一句(段)話按一定的規(guī)則(算法)拆分成詞語、成語、單個文字。


          中文分詞是很多應用技術的前置技術,如搜索引擎、機器翻譯、詞性標注、相似度分析等,都是先對文本信息分詞處理,再用分詞結果來搜索、翻譯、對比等。


          在Python中,最好用的中文分詞庫是jieba。用“結巴”給一個中文分詞庫命名,非常生動形象,同時還帶有一種程序員式的幽默感。


          最好的Python中文分詞組件



          “結巴”中文分詞:做最好的Python中文分詞組件


          這是jieba分詞的slogan,打開jieba分詞的GitHub、PyPI源,都會在簡介里看到這句標語。這充分體現(xiàn)了jieba開發(fā)團隊的愿景和目標,在目前看來,jieba已經(jīng)稱得上最好的Python中文分詞庫。


          2022年4月寫本文時,jieba在GitHub上已經(jīng)獲得了28.3K的Star,而且數(shù)量正在快速增長,足夠證明jieba的受歡迎程度非常高。

          ?

          jieba除了有Python語言的版本,也有C++、JAVA、iOS等十幾門編程語言的版本,從PC端到移動端,都可以支持。這點值得給jieba的維護團隊點贊,說不定未來,jieba可以做所有語言里最好的中文分詞組件。


          jieba的使用方法



          Step1. 安裝jieba


          pip?install?jieba


          jieba是第三方庫,需要先安裝才能使用,直接使用pip安裝即可,jieba兼容Python2和Python3,安裝命令都一樣。如果安裝慢,可以添加-i參數(shù)指定鏡像源。


          Step2. 調(diào)用jieba進行分詞


          import?jieba

          test_content?=?'迅雷不及掩耳盜鈴兒響叮當仁不讓世界充滿愛之勢'
          cut_res?=?jieba.cut(test_content,?cut_all=True)
          print(list(cut_res))


          運行結果:


          ['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'不及',?'掩耳',?'掩耳盜鈴',?
          '兒',?'響叮當',?'叮當',?'當仁不讓',?'不讓',?'世界',?'充滿',?'愛',
          ?'之',?'勢']


          jieba分詞的使用非常簡單,直接導入jieba庫,調(diào)用cut()方法,傳入需要切分的內(nèi)容,即可返回分詞結果。返回結果是一個可迭代的生成器generator,可以進行遍歷,也可以轉(zhuǎn)換成list打印出結果。


          jieba分詞的四種模式



          jieba分詞支持四種分詞模式:


          1.精確模式


          試圖將句子最精確地切開,適合文本分析。


          cut_res?=?jieba.cut(test_content,?cut_all=False)
          print('[精確模式]:',?list(cut_res))
          cut_res?=?jieba.cut(test_content,?cut_all=False,?HMM=False)
          print('[精確模式]:',?list(cut_res))


          [精確模式]:?['迅雷不及',?'掩耳盜鈴',?'兒響',?'叮',?'當仁不讓',?
          '世界',?'充滿',?'愛之勢']
          [精確模式]:?['迅雷不及',?'掩耳盜鈴',?'兒',?'響',?'叮',?'當仁不讓',
          ?'世界',?'充滿',?'愛',?'之',?'勢']


          精確模式是最常用的分詞模式,分詞結果不存在冗余數(shù)據(jù)。


          HMM參數(shù)默認為True,根據(jù)HMM模型(隱馬爾可夫模型)自動識別新詞。如上面的例子中,HMM為True,結果中將“兒響”、“愛之勢”識別成了新詞,HMM為False,這些字只能單獨成詞,分成單個文字。


          2.全模式


          把句子中所有可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義。


          cut_res?=?jieba.cut(test_content,?cut_all=True)
          print('[全模式]:',?list(cut_res))


          [全模式]:?['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'不及',?'掩耳',?'掩耳盜鈴',?
          '兒',?'響叮當',?'叮當',?'當仁不讓',?'不讓',?'世界',?'充滿',?'愛',?'之',?'勢']


          全模式從待分詞內(nèi)容的第一個字開始遍歷,將每一個字作為詞語的第一個字,返回所有可能的詞語,會重復利用詞語和字,因此也可能會出現(xiàn)多種含義。


          cut_all參數(shù)默認為False,即默認不是全模式,將cut_all設置為True,則采用全模式分詞。


          3.搜索引擎模式


          在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。


          cut_res?=?jieba.cut_for_search(test_content)
          print('[搜索引擎模式]:',?list(cut_res))


          [搜索引擎模式]:?['迅雷',?'不及',?'迅雷不及',?'掩耳',?'掩耳盜鈴',?'兒響',?
          '叮',?'不讓',?'當仁不讓',?'世界',?'充滿',?'愛之勢']


          搜索引擎模式在精確模式的基礎上,對精確模式中的長詞,再按照全模式進一步分詞,用于搜索時可以匹配到更多的結果。


          4.paddle模式


          利用PaddlePaddle深度學習框架,訓練序列標注(雙向GRU)網(wǎng)絡模型實現(xiàn)分詞。同時支持詞性標注。


          paddle模式使用需先安裝paddlepaddle-tiny,安裝命令:pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。jieba v0.40以下版本,請升級jieba,pip install jieba --upgrade 。


          上面是官方的描述,但是,當前已經(jīng)找不到paddlepaddle-tiny鏡像源了,感興趣可以去PaddlePaddle官網(wǎng)找找方法。


          通常不會使用到paddle模式,所以我們了解前面三種模式即可。


          5.小結


          cut()方法有四個參數(shù),sentence接收待分詞的內(nèi)容;cut_all設置是否使用全模式;HMM設置是否使用HMM模型識別新詞;use_paddle設置是否使用panddle模式。


          cut_for_search()有兩個參數(shù),sentence和HMM。


          cut()和cut_for_search()都是返回generator,如果想直接返回列表,可以使用對應的lcut()和lcut_for_search(),用法完全相同。


          自定義分詞詞典



          使用jieba分詞時,分詞結果需要與jieba的詞典庫進行匹配,才能返回到分詞結果中。因此有些詞需要用戶自定義,才能識別到。


          1.添加自定義詞語到詞典中


          jieba.add_word('鈴兒響叮當')
          jieba.add_word('讓世界充滿愛')
          jieba.add_word('迅雷不及掩耳之勢')
          lcut_res?=?jieba.lcut(test_content,?cut_all=True,?HMM=False)
          print('[添加自定義詞語]:',?lcut_res)


          [添加自定義詞語]:?['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'不及',?'掩耳',?'掩耳盜鈴',
          ?'鈴兒響叮當',?'響叮當',?'叮當',?'當仁不讓',?'不讓',?'讓世界充滿愛',?'世界',?
          ?'充滿',?'愛',?'之',?'勢']


          add_word()有三個參數(shù),分別是添加的詞語、詞頻和詞性,詞頻和詞性可以省略。


          添加自定義詞語后,自定義詞語如果能匹配到,就會返回到分詞結果中。如果自定義詞語在待分詞語句中沒有連續(xù)的匹配結果,分詞結果中不會體現(xiàn)。


          2.添加指定的文件作為分詞詞典


          自定義詞典格式要和默認詞典dict.txt一樣,一個詞占一行,每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name若為路徑或二進制方式打開的文件,則文件必須為UTF-8編碼。


          本文自定義一個mydict.txt文本文件,內(nèi)容如下:


          迅雷不及掩耳之勢?3?a
          掩耳盜鈴?3?a
          鈴兒響叮當?3?a
          當仁不讓?3?a
          讓世界充滿愛?3?n


          文件編碼要設置成UTF-8,在PyCharm可以點擊File>Settings>File Encodings,將Global Encoding和Project Encoding設置成UTF-8。



          然后使用load_userdict()加載自定義詞典。


          jieba.load_userdict('mydict.txt')
          lcut_res?=?jieba.lcut(test_content,?cut_all=True,?HMM=False)
          print('[使用自定義詞典]:',?lcut_res)


          [使用自定義詞典]:?['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'不及',?'掩耳',?'掩耳盜鈴',?
          '鈴兒響叮當',?'響叮當',?'叮當',?'當仁不讓',?'不讓',?'讓世界充滿愛',?'世界',?
          '充滿',?'愛',?'之',?'勢']


          使用了自定義詞典,會同時根據(jù)jieba的默認詞典和自定義詞典進行分詞。添加自定義詞典和添加單個詞語的效果一樣,區(qū)別是可以批量添加,而不用重復調(diào)用add_word()。


          3.從詞典中刪除詞語


          jieba.del_word('不及')
          jieba.del_word('不讓')
          jieba.del_word('之')
          lcut_res?=?jieba.lcut(test_content,?cut_all=True,?HMM=False)
          print('[刪除詞語]:',?lcut_res)


          [刪除詞語]:?['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'掩耳',?'掩耳盜鈴',?'兒',?
          '響叮當',?'叮當',?'當仁不讓',?'世界',?'充滿',?'愛',?'之',?'勢']


          刪除的詞語一般是語氣助詞、邏輯連接詞等,這些詞對于文本分析沒有實際意義,反而會成為干擾。


          在設置刪除的詞語后,結果中不再有刪除的詞語,但對于單個字,會獨立成詞,所以刪除后在結果中也還存在。


          4.調(diào)整詞語的詞頻


          調(diào)整詞語的詞頻,調(diào)整其在結果中被分出來的可能性,使分詞結果滿足預期。分兩種情況,一種是將分詞結果中的一個長詞拆分成多個詞,另一種是將分詞結果中的多個詞組成一個詞。


          lcut_res?=?jieba.lcut(test_content,?cut_all=False,?HMM=False)
          print('[設置前]:',?lcut_res)
          jieba.suggest_freq('讓世界充滿愛',?True)
          lcut_res?=?jieba.lcut(test_content,?cut_all=False,?HMM=False)
          print('[設置后]:',?lcut_res)


          [設置前]:?['迅雷不及',?'掩耳盜鈴',?'兒',?'響',?'叮',?'當仁不讓',?'世界',?'充滿',?'愛',?'之',?'勢']
          [設置后]:?['迅雷不及',?'掩耳盜鈴',?'兒',?'響叮當',?'仁',?'不',?'讓世界充滿愛',?'之',?'勢']


          suggest_freq()有兩個參數(shù),segment參數(shù)表示分詞的片段,如果是將一個詞拆開,則傳入拆開后的元組,如果是指定某個詞要作為一個整體,則傳入字符串;tune參數(shù)為True,則調(diào)整詞語的詞頻。


          注意:自動計算的詞頻在使用HMM新詞發(fā)現(xiàn)功能時可能無效。


          關鍵詞提取



          關鍵詞提取使用jieba中的analyse模塊,基于兩種不同的算法,提供了兩個不同的方法。


          1.基于TF-IDF算法的關鍵詞提取


          from?jieba?import?analyse

          key_word?=?analyse.extract_tags(test_content,?topK=3)
          print('[key_word]:',?list(key_word))
          key_word?=?analyse.extract_tags(test_content,?topK=3,?withWeight=True)
          print('[key_word]:',?list(key_word))


          [key_word]:?['迅雷不及',?'兒響',?'愛之勢']
          [key_word]:?[('迅雷不及',?1.7078239289857142),?('兒響',?1.7078239289857142),?('愛之勢',?1.7078239289857142)]


          extract_tags()方法有四個參數(shù),sentence為待提取的文本;topK為返回最大權重關鍵詞的個數(shù),默認值為20;withWeight表示是否返回權重,是的話返回(word, weight)的list,默認為False;allowPOS為篩選指定詞性的詞,默認為空,即不篩選。


          2.基于TextRank算法的關鍵詞提取


          key_word?=?analyse.textrank(test_content,?topK=3)
          print('[key_word]:',?list(key_word))
          allow?=?['ns',?'n',?'vn',?'v',?'a',?'m',?'c']
          key_word?=?analyse.textrank(test_content,?topK=3,?allowPOS=allow)
          print('[key_word]:',?list(key_word))


          [key_word]:?['兒響',?'世界']
          Prefix?dict?has?been?built?successfully.
          [key_word]:?['充滿',?'兒響',?'世界']


          textrank()方法與extract_tags()方法用法相似,需要注意的是allowPOS有默認值('ns', 'n', 'vn', 'v'),默認篩選這四種詞性的詞,可以自己設置。其他參數(shù)都與extract_tags()方法相同。


          詞性標注



          詞性標注使用jieba中的posseg模塊,標注分詞后每個詞的詞性,采用和ictclas兼容的標記法。


          from?jieba?import?posseg

          pos_word?=?posseg.lcut(test_content)
          print(pos_word)


          [pair('迅雷不及',?'i'),?pair('掩耳盜鈴',?'i'),?pair('兒響',?'n'),
          ?pair('叮',?'v'),?pair('當仁不讓',?'i'),?pair('世界',?'n'),?
          ?pair('充滿',?'a'),?pair('愛',?'v'),?pair('之',?'u'),?pair('勢',?'ng')]


          posseg.lcut()有兩個參數(shù),sentence和HMM。


          詞性和詞性標簽參考下表:


          標簽含義標簽含義標簽含義標簽含義
          n普通名詞f方位名詞s處所名詞t時間
          nr人名ns地名nt機構名nw作品名
          nz其他專名v普通動詞vd動副詞vn名動詞
          a形容詞ad副形詞an名形詞d副詞
          m數(shù)量詞q量詞r代詞p介詞
          c連詞u助詞xc其他虛詞w標點符號
          PER人名LOC地名ORG機構名TIME時間


          返回詞語在原文的起止位置



          返回詞語在原文的起止位置使用jieba中的Tokenize模塊,實際調(diào)用時使用tokenize()方法。


          res?=?jieba.tokenize(test_content)
          for?r?in?res:
          ????if?len(r[0])?>?3:
          ????????print('word:{}\t?start:{}\t?end:{}'.format(*r))
          ????elif?len(r[0])?>?1:
          ????????print('word:{}\t\t?start:{}\t?end:{}'.format(*r))
          ????else:
          ????????print('word:{}\t\t\t?start:{}\t?end:{}'.format(*r))


          word:迅雷不及??start:0?? end:4
          word:掩耳盜鈴??start:4?? end:8
          word:兒響??? start:8?? end:10
          word:叮???? start:10??end:11
          word:當仁不讓??start:11??end:15
          word:世界??? start:15??end:17
          word:充滿??? start:17??end:19
          word:愛之勢??? start:19??end:22


          tokenize()方法有三個參數(shù),unicode_sentence為待分詞內(nèi)容,注意,只接受unicode編碼內(nèi)容;mode參數(shù)為指定分詞模式,如需要使用搜索引擎模式,則設置mode='search';HMM默認為True。


          以上就是jieba分詞的常用功能介紹,更多用法請從下方參考文檔訪問GitHub。


          參考文檔:https://github.com/fxsjy/jieba

          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色一道本 | 综合五月丁香视频 | 香蕉A| 亚洲情热 | 国产理论在线 |