【Python】jieba分詞模組

小亮520cl發表於2017-10-19

0、前言

jieba庫是進行中文分詞的利器,根據文件描述,具有以下特點:

  1. 支援三種分詞模式:

  • 精確模式,試圖將句子最精確地切開,適合文字分析;

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

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

  • 支援繁體分詞

  • 支援自定義詞典


  • 本文立足實際需求,提取出部分常用的功能作為講解,內容包括:

    • 分詞

    • 提取關鍵詞

    • 搜尋詞彙位置

    1、分詞

    中文分詞是 jieba 庫的核心,其下包括常用的 cut() 和 cut_for_search() 函式。
    cut() 函式傳入待分詞的字串,返回一個可迭代的生成器,可使用 for 迴圈提取或者 list 轉為列表形式。

    import jieba
    string = '今天天氣特別好,很開心' result = jieba.cut(string)
    print(list(result))

    結果:

    ['今天天氣', '特別', '好', ',', '很', '開心']

    cut() 函式預設採用精確模式,使用全模式需修改 cut_all 引數為 True
    程式碼如下:

    result = jieba.cut(string,cut_all=True)

    結果為:

    ['今天', '今天天氣', '天天', '天氣', '特別', '好', '', '', '很', '開心']

    cut_for_search() 分詞函式採用搜尋引擎模式,該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細,通俗來說就是儘可能多的將字串分割為有效的詞彙。

    示例:

    string = '今天天氣' res = jieba.cut(string)
    res2 = jieba.cut_for_search(string)
    print('使用cut:',list(res))
    print('使用cut_for_search:',list(res2))

    結果:

    使用cut: ['今天天氣']
    使用cut_for_search: ['今天', '天天', '天氣', '今天天氣']

    由於採取了不同的分詞策略,所以最後的結果也不一樣,使用哪個需要根據應用場景來選擇。

    2、提取詞彙

    在處理詞彙時,常常我們會提取出現頻率比較高的關鍵詞,jieba.analyse.extract_tags()具有此功能,它接受 4 個引數

    • sentence 為待提取的文字

    • topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20

    • withWeight 為是否一併返回關鍵詞權重值,預設值為 False

    • allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選

    我們以西遊記為例,提取出權重佔比最高的前20個詞彙,程式碼如下:

    from jieba.analyse import extract_tags with open('西遊記.txt','r',errors='ignore')as f:
        data = f.read()
    res = extract_tags(data)
    print(res)

    結果如下:

    ['行者', '八戒', '師父', '三藏', '唐僧', '大聖', '沙僧', '妖精', '菩薩', '和尚', '那怪', '那裡', '長老', '呆子', '徒弟', '怎麼', '不知', '老孫', '國王', '一個']

    修改 topK = 10 得到:

    ['行者', '八戒', '師父', '三藏', '唐僧', '大聖', '沙僧', '妖精', '菩薩', '和尚']

    修改 withWeight = True 得到:

    [('行者', 0.14971032916840787), ('八戒', 0.0684495682590684),
     ('師父', 0.06131338130166949), ('三藏', 0.05296939997015923), 
     ('唐僧', 0.034778382561747076), ('大聖', 0.032424843415734234), 
     ('沙僧', 0.03158331000220929), ('妖精', 0.027699530179843303), 
     ('菩薩', 0.02576333341504996), ('和尚', 0.02426762372832522)]

    jieba 只能返回詞彙的權重,而不能返回該詞出現的頻率,所以在一些特定的應用場景下,比如生成詞雲圖,需要頻數時,使用 jieba.cut() 和 collections 下的 Counter 解決起來更方便,關於 Counter參考:【Counter】

    3、搜尋詞彙位置

    jieba 庫也包含了定位詞彙位置的功能,jieba.tokenize() 可以實現此功能,該函式接收字串,返回一個生成器,包含所有分詞結果以及始末位置,基本用法如下:

    import jieba
    string = '今天天氣特別好,很開心' result = jieba.tokenize(string)
    print(list(result))

    結果如下:

    [('今天天氣', 0, 4), ('特別', 4, 6), ('好', 6, 7),
     (',', 7, 8), ('很', 8, 9), ('開心', 9, 11)]

    如果我們只是找到某個特定的詞彙在文中的位置,拿之前的西遊記文字為例,我們去尋找詞彙 “行者” 第一次出現的位置

    with open('西遊記.txt','r',errors='ignore')as f:
        data = f.read()
    
    result = jieba.tokenize(data) for i in result:
        if '行者' in i:
            print(i)
            break

    結果:

    ('行者', 8593, 8595)

    如此,就能很方便的找到特定詞彙在文章中出現的位置。

    4、小結

    以上就是 jieba 庫的常用的方法,該庫還包括詞性標註、並行分詞、命令列分詞、新增字典等等功能。
    更詳細的內容參考官方文件:
    對該庫的演算法感興趣的同學可參考
    jieba分詞的基本思路:

    對Python中文分詞模組結巴分詞演算法過程的理解和分析:http://blog.csdn.net/rav009/article/details/12196623


    相似模組snowNLP


    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2146148/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章