1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        jieba,為中文分詞而生的Python庫(kù)

        共 6933字,需瀏覽 14分鐘

         ·

        2022-04-20 20:14

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


        中文分詞是很多應(yīng)用技術(shù)的前置技術(shù),如搜索引擎、機(jī)器翻譯、詞性標(biāo)注、相似度分析等,都是先對(duì)文本信息分詞處理,再用分詞結(jié)果來(lái)搜索、翻譯、對(duì)比等。


        在Python中,最好用的中文分詞庫(kù)是jieba。用“結(jié)巴”給一個(gè)中文分詞庫(kù)命名,非常生動(dòng)形象,同時(shí)還帶有一種程序員式的幽默感。


        最好的Python中文分詞組件



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


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


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

        ?

        jieba除了有Python語(yǔ)言的版本,也有C++、JAVA、iOS等十幾門編程語(yǔ)言的版本,從PC端到移動(dòng)端,都可以支持。這點(diǎn)值得給jieba的維護(hù)團(tuán)隊(duì)點(diǎn)贊,說不定未來(lái),jieba可以做所有語(yǔ)言里最好的中文分詞組件。


        jieba的使用方法



        Step1. 安裝jieba


        pip?install?jieba


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


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


        import?jieba

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


        運(yùn)行結(jié)果:


        ['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'不及',?'掩耳',?'掩耳盜鈴',?
        '兒',?'響叮當(dāng)',?'叮當(dāng)',?'當(dāng)仁不讓',?'不讓',?'世界',?'充滿',?'愛',
        ?'之',?'勢(shì)']


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


        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))


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


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


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


        2.全模式


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


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


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


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


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


        3.搜索引擎模式


        在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。


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


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


        搜索引擎模式在精確模式的基礎(chǔ)上,對(duì)精確模式中的長(zhǎng)詞,再按照全模式進(jìn)一步分詞,用于搜索時(shí)可以匹配到更多的結(jié)果。


        4.paddle模式


        利用PaddlePaddle深度學(xué)習(xí)框架,訓(xùn)練序列標(biāo)注(雙向GRU)網(wǎng)絡(luò)模型實(shí)現(xiàn)分詞。同時(shí)支持詞性標(biāo)注。


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


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


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


        5.小結(jié)


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


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


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


        自定義分詞詞典



        使用jieba分詞時(shí),分詞結(jié)果需要與jieba的詞典庫(kù)進(jìn)行匹配,才能返回到分詞結(jié)果中。因此有些詞需要用戶自定義,才能識(shí)別到。


        1.添加自定義詞語(yǔ)到詞典中


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


        [添加自定義詞語(yǔ)]:?['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'不及',?'掩耳',?'掩耳盜鈴',
        ?'鈴兒響叮當(dāng)',?'響叮當(dāng)',?'叮當(dāng)',?'當(dāng)仁不讓',?'不讓',?'讓世界充滿愛',?'世界',?
        ?'充滿',?'愛',?'之',?'勢(shì)']


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


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


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


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


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


        迅雷不及掩耳之勢(shì)?3?a
        掩耳盜鈴?3?a
        鈴兒響叮當(dāng)?3?a
        當(dāng)仁不讓?3?a
        讓世界充滿愛?3?n


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



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


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


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


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


        3.從詞典中刪除詞語(yǔ)


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


        [刪除詞語(yǔ)]:?['迅雷',?'迅雷不及',?'迅雷不及掩耳',?'掩耳',?'掩耳盜鈴',?'兒',?
        '響叮當(dāng)',?'叮當(dāng)',?'當(dāng)仁不讓',?'世界',?'充滿',?'愛',?'之',?'勢(shì)']


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


        在設(shè)置刪除的詞語(yǔ)后,結(jié)果中不再有刪除的詞語(yǔ),但對(duì)于單個(gè)字,會(huì)獨(dú)立成詞,所以刪除后在結(jié)果中也還存在。


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


        調(diào)整詞語(yǔ)的詞頻,調(diào)整其在結(jié)果中被分出來(lái)的可能性,使分詞結(jié)果滿足預(yù)期。分兩種情況,一種是將分詞結(jié)果中的一個(gè)長(zhǎng)詞拆分成多個(gè)詞,另一種是將分詞結(jié)果中的多個(gè)詞組成一個(gè)詞。


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


        [設(shè)置前]:?['迅雷不及',?'掩耳盜鈴',?'兒',?'響',?'叮',?'當(dāng)仁不讓',?'世界',?'充滿',?'愛',?'之',?'勢(shì)']
        [設(shè)置后]:?['迅雷不及',?'掩耳盜鈴',?'兒',?'響叮當(dāng)',?'仁',?'不',?'讓世界充滿愛',?'之',?'勢(shì)']


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


        注意:自動(dòng)計(jì)算的詞頻在使用HMM新詞發(fā)現(xiàn)功能時(shí)可能無(wú)效。


        關(guān)鍵詞提取



        關(guān)鍵詞提取使用jieba中的analyse模塊,基于兩種不同的算法,提供了兩個(gè)不同的方法。


        1.基于TF-IDF算法的關(guān)鍵詞提取


        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]:?['迅雷不及',?'兒響',?'愛之勢(shì)']
        [key_word]:?[('迅雷不及',?1.7078239289857142),?('兒響',?1.7078239289857142),?('愛之勢(shì)',?1.7078239289857142)]


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


        2.基于TextRank算法的關(guān)鍵詞提取


        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有默認(rèn)值('ns', 'n', 'vn', 'v'),默認(rèn)篩選這四種詞性的詞,可以自己設(shè)置。其他參數(shù)都與extract_tags()方法相同。


        詞性標(biāo)注



        詞性標(biāo)注使用jieba中的posseg模塊,標(biāo)注分詞后每個(gè)詞的詞性,采用和ictclas兼容的標(biāo)記法。


        from?jieba?import?posseg

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


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


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


        詞性和詞性標(biāo)簽參考下表:


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


        返回詞語(yǔ)在原文的起止位置



        返回詞語(yǔ)在原文的起止位置使用jieba中的Tokenize模塊,實(shí)際調(diào)用時(shí)使用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:當(dāng)仁不讓??start:11??end:15
        word:世界??? start:15??end:17
        word:充滿??? start:17??end:19
        word:愛之勢(shì)??? start:19??end:22


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


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


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

        瀏覽 53
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            影音资源男人 | 九九热精品在线 | 一级片黄片 | 严国精品国产三级国产 | 亚洲黄色片免费 | 啊日出水了用力小说 | 国产无码操逼视频 | 阿v2024官网 | 精品传媒一区二区 | 女s风情艳主豪宅调教贱奴 |