NLP_Python3——jieba中文處理

相對於英語使用空格分隔開每個單詞,中文是沒有固定的分隔符來分開每個詞語的,而大部分情況下詞語卻是進行NLP的基礎,故在此使用jieba中文分詞來對語句進行分詞。

jieba分詞github地址:https://github.com/fxsjy/jieba

jieba分詞github上面的說明已經非常詳細了,只要稍微有點python基礎應該都可以按圖索驥的照搬,建議大家照着api把jiaba分詞的功能都試一遍,這樣比看文字去猜要印象深刻,這裏就不再copy過來水字數了<(* ̄▽ ̄*)/ 這邊就將一些關鍵點通過腳本簡單的描述一下

1.cut與cut_for_search區別:

cut_for_search適用於搜索引擎構建倒排索引,分詞效果接近cut的全模式;兩者返回的都是generator類型結果

2.cut的全模式與精確模式:

全模式會匹配所有可能成詞的字符串並將其列出;精確模式是將原文進行劃分,如果導入專業詞典,可以提高分詞的準確率;默認情況下,cut使用精確模式


import jieba

ori = '這種是四軸無人機植保機,帶有四個噴嘴,主要是噴灑農藥,因爲螺旋槳產生的風是下壓的,能讓農藥打到植被的根底部,讓植被更容易吸收'

strs = jieba.cut(ori, cut_all=True)
print('全模式Cut:', ','.join(strs))
strs = jieba.cut(ori, cut_all=False)
print('精確模式Cut:', ','.join(strs))
strs = jieba.cut_for_search(ori)
print('Cut_for_search:', ','.join(strs))

**********************************************
輸出結果:
全模式Cut: 這種,是,四,軸,無人,無人機,人機,植保,機,,,帶有,四個,噴嘴,,,主要,要是,噴灑,農藥,,,因爲,螺旋,螺旋槳,產生,的,風,是,下壓,的,,,能,讓,農藥,打到,植被,的,根底,底部,,,讓,植被,更,容易,吸收

精確模式Cut: 這種,是,四軸,無人機,植保,機,,,帶有,四個,噴嘴,,,主要,是,噴灑,農藥,,,因爲,螺旋槳,產生,的,風,是,下壓,的,,,能,讓,農藥,打,到,植被,的,根,底部,,,讓,植被,更,容易,吸收

Cut_for_search: 這種,是,四軸,無人,人機,無人機,植保,機,,,帶有,四個,噴嘴,,,主要,是,噴灑,農藥,,,因爲,螺旋,螺旋槳,產生,的,風,是,下壓,的,,,能,讓,農藥,打,到,植被,的,根,底部,,,讓,植被,更,容易,吸收

3.lcut和lcut_for_search與cut和cut_for_search類似只是返回結果爲list

import jieba

ori = '這種是四軸無人機植保機,帶有四個噴嘴,主要是噴灑農藥,因爲螺旋槳產生的風是下壓的,能讓農藥打到植被的根底部,讓植被更容易吸收'
strs = jieba.cut(ori, cut_all=False)
print('精確模式Cut類型:', type(strs))
str_list = jieba.lcut(ori, cut_all=False)
print('精確模式Lcut類型:', type(str_list))

***********************************
輸出結果:
精確模式Cut類型: <class 'generator'>
精確模式Lcut類型: <class 'list'>

4.添加用戶詞典(通常用於添加術語庫):

大量的可以通過jieba.load_userdict(file_name)加載,少量的可以用jiaba.add_word(word,freq=None,tag=None)和jieba.del_word(word)來動態調整,使用jiaba.suggest_freq(segment,tune=True)可以調節詞語的詞頻,進而影響到改詞能否分出來;注意如果添加新詞後分詞時需要將HMM參數調爲False,否則jieba將可能會忽略添加的新詞而通過HMM算法進行分詞

import jieba

ori = '這種是四軸無人機植保機,帶有四個噴嘴,主要是噴灑農藥,因爲螺旋槳產生的風是下壓的,能讓農藥打到植被的根底部,讓植被更容易吸收'
strs = jieba.cut(ori, HMM=True)
print('精確模式Cut:', ','.join(strs))
strs = jieba.cut(ori, HMM=False)
print('精確模式Cut:', ','.join(strs))
jieba.suggest_freq(('植保機'), True)
strs = jieba.cut(ori, HMM=False)
print('精確模式Cut:', ','.join(strs))

***************************************
輸出結果:
開啓HMM模式Cut: 
這種,是,四軸,無人機,植保,機,,,帶有,四個,噴嘴,,,主要,是,噴灑,農藥,,,因爲,螺旋槳,產生,的,風,是,下壓,的,,,能,讓,農藥,打,到,植被,的,根,底部,,,讓,植被,更,容易,吸收

關閉HMM模式Cut: 
這種,是,四,軸,無人機,植保,機,,,帶有,四個,噴嘴,,,主要,是,噴灑,農藥,,,因爲,螺旋槳,產生,的,風,是,下壓,的,,,能,讓,農藥,打,到,植被,的,根,底部,,,讓,植被,更,容易,吸收

關閉HMM且加入調整新詞詞頻Cut: 
這種,是,四,軸,無人機,植保機,,,帶有,四個,噴嘴,,,主要,是,噴灑,農藥,,,因爲,螺旋槳,產生,的,風,是,下壓,的,,,能,讓,農藥,打,到,植被,的,根,底部,,,讓,植被,更,容易,吸收

5.提取關鍵詞

    1.1)基於TF-IDF算法的關鍵詞抽取:

impory jieba


ori = '這種是四軸無人機植保機,帶有四個噴嘴,主要是噴灑農藥,因爲螺旋槳產生的風是下壓的,能讓農藥打到植被的根底部,讓植被更容易吸收'
strs = jieba.analyse.extract_tags(sentence=ori,  # 待提取原文
                                  topK=20,  # 返回幾個TF/IDF權重最大的關鍵詞,默認爲20
                                  withWeight=True,  # 是否一併返回關鍵詞的權重值,默認爲False
                                  allowPOS=())  # 僅包括指定詞性的詞,默認爲空
print('關鍵詞及權重爲:')
for (k, v) in strs:
    print(k, v)

************************************
輸出結果爲:
關鍵詞及權重爲:
農藥 0.8217097884639999
植被 0.719015454252
四軸 0.597738375145
植保 0.591061805515
噴嘴 0.5302420393
下壓 0.506973876815
噴灑 0.503601812775
無人機 0.48260912049650007
螺旋槳 0.443186252478
底部 0.3419243009845
帶有 0.33062166254799996
吸收 0.311675969833
四個 0.306925352242
容易 0.270697183402
產生 0.2270312503385
因爲 0.2024189068105
這種 0.19852254011249998
主要 0.172928225041

    1.2)切換IDF文本語料庫爲自定義語料庫路徑:jieba.analyse.set_idf_path(file_name)

    1.3)  切換關鍵詞提取所使用停止詞文本語料庫爲自定義語料庫路徑:jieba.analyse.set_stop_words(file_name)

    2.1) 基於TextRank算法的關鍵詞抽取:此函數與基於TF-IDF算法的關鍵詞抽取函數參數相同,需要注意的是此函數默認過濾詞性,故allowPOS參數不能爲空,否則會得到空值

import jieba.analyse

ori = '這種是四軸無人機植保機,帶有四個噴嘴,主要是噴灑農藥,因爲螺旋槳產生的風是下壓的,能讓農藥打到植被的根底部,讓植被更容易吸收'
strs = jieba.analyse.textrank(sentence=ori,  # 待提取原文
                              topK=20,  # 返回幾個TF/IDF權重最大的關鍵詞,默認爲20
                              withWeight=True,  # 是否一併返回關鍵詞的權重值,默認爲False
                              allowPOS=('ns', 'n', 'vn', 'v'))  # 僅包括指定詞性的詞,默認過濾詞性

print('關鍵詞及權重爲:')
for (k, v) in strs:
    print(k, v)

*********************************************
輸出結果:
關鍵詞及權重爲:
螺旋槳 1.0
農藥 0.8759898646172835
產生 0.7867742915818781
噴灑 0.6996158154963905
風是 0.5973042098678957
下壓 0.590317791482311
噴嘴 0.5844892605660431
植被 0.5674678333270774
帶有 0.3326323546342714
吸收 0.32263772112456274

6.詞性標註:

import jieba.posseg as pseg

ori = '這種是四軸無人機植保機,帶有四個噴嘴,主要是噴灑農藥,因爲螺旋槳產生的風是下壓的,能讓農藥打到植被的根底部,讓植被更容易吸收'

words = pseg.cut(ori)
for word, flag in words:
    print(word, flag)

**********************************************
輸出結果爲:
這種 r
是 v
四 m
軸 n
無人機 l
植保 nr
機 n
, x
帶有 v
四個 m
噴嘴 v
, x
主要 b
是 v
噴灑 v
農藥 n
, x
因爲 c
螺旋槳 n
產生 n
的 uj
風是 n
下壓 v
的 uj
, x
能 v
讓 v
農藥 n
打 v
到 v
植被 n
的 uj
根 a
底部 f
, x
讓 v
植被 n
更 d
容易 a
吸收 v

7.並行分詞(據說目前還未支持windows,最少github上是這麼寫的~~):將文本分行後可以將各行文本分配給多個進程進行分詞,最後將結果合併,進而利用多線程提升分詞效率,此功能基於python自帶的multiprocessing模塊

    jieba.enable_parallel(n)  # 開啓並行分詞模式,參數n爲並行進程數

    jieba.disable_parallel()  # 關閉並行分詞模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章