jieba中文處理


一:前言

和拉丁語系不同,亞洲語言是不用空格分開每個有意義的詞的。而當我們進行自然語言處理的時候,大部分情況下,詞匯是我們對句子和文章理解的基礎,因此需要一個工具去把完整的文本中分解成粒度更細的詞。

jieba就是這樣一個非常好用的中文工具,是以分詞起家的,但是功能比分詞要強大很多。

二:基本分詞函數與用法

jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for 循環來獲得分詞后得到的每一個詞語(unicode)

jieba.cut 方法接受三個輸入參數:

  • 需要分詞的字符串
  • cut_all 參數用來控制是否采用全模式
  • HMM 參數用來控制是否使用 HMM 模型

jieba.cut_for_search 方法接受兩個參數

  • 需要分詞的字符串
  • 是否使用 HMM 模型。

  該方法適合用於搜索引擎構建倒排索引的分詞,粒度比較細

import jieba

list0 = jieba.cut('小明碩士畢業於中國科學院計算所,后在哈佛大學深造', cut_all=True)
print('全模式', list(list0))
# ['小', '明', '碩士', '畢業', '於', '中國', '中國科學院', '科學', '科學院', '學院', '計算', '計算所', '', '', '后', '在', '哈佛', '哈佛大學', '大學', '深造']
list1 = jieba.cut('小明碩士畢業於中國科學院計算所,后在哈佛大學深造', cut_all=False)
print('精准模式', list(list1))
# ['小明', '碩士', '畢業', '於', '中國科學院', '計算所', ',', '后', '在', '哈佛大學', '深造']
list2 = jieba.cut_for_search('小明碩士畢業於中國科學院計算所,后在哈佛大學深造')
print('搜索引擎模式', list(list2))
# ['小明', '碩士', '畢業', '於', '中國', '科學', '學院', '科學院', '中國科學院', '計算', '計算所', ',', '后', '在', '哈佛', '大學', '哈佛大學', '深造']

添加用戶自定義詞典

很多時候我們需要針對自己的場景進行分詞,會有一些領域內的專有詞匯。

  • 1.可以用jieba.load_userdict(file_name)加載用戶字典
  • 2.少量的詞匯可以自己用下面方法手動添加:
    • 用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中動態修改詞典
    • 用 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來。

  加載用戶詞典方式:

# 未加載用戶詞典時
st1=jieba.cut('王蔣小明在加州理工大學上學')
# ['王', '蔣小明', '在', '加州', '理工大學', '上學']
print(list(st1))

# 加載用戶詞典時
# jieba自帶的庫一般在python都為site-packages\jieba\dict.txt
jieba.load_userdict('d.txt')
# 詞典格式和dict.txt一樣,一詞一行,每行分三個部分(用空格隔開),詞語 詞頻(可省) 詞性(可省)
# 順序不可顛倒,若filename為路徑或二進制方式打開,則需為UTF-8
# 定義: 王蔣小明 加州理工大學 在d.txt中
st2=jieba.cut('王蔣小明在加州理工大學上學')
# ['王蔣小明', '在', '加州理工大學', '上學']
print(list(st2))

  調節詞頻

a=jieba.cut('在考試中將有監控')
print(list(a)) # ['在', '考試', '中將', '有', '監控']
jieba.suggest_freq(('',''),True) # 通過調節詞頻,讓中和將都被划出來
b=jieba.cut('在考試中將有監控')
print(list(b)) # ['在', '考試', '中', '將', '有', '監控']

關鍵詞提取:

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

import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 為待提取的文本
    • topK 為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20
    • withWeight 為是否一並返回關鍵詞權重值,默認值為 False
    • allowPOS 僅包括指定詞性的詞,默認值為空,即不篩選
import jieba.analyse as analyse
lines = open('西游記.txt','r',encoding='utf8').read() # 西游記.txt為整本西游記小說
lists0=analyse.extract_tags(lines, topK=20, withWeight=False, allowPOS=())
print(list(lists0)) # 抽出整本小說的關鍵字
# ['行者', '八戒', '師父', '三藏', '唐僧', '大聖', '沙僧', '妖精', '菩薩', '和尚', '那怪', '那里', '長老', '呆子', '徒弟', '怎么', '不知', '老孫', '國王', '一個']

關於TF-IDF 算法的關鍵詞抽取補充

  • 關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫可以切換成自定義語料庫的路徑

    • 用法: jieba.analyse.set_idf_path(file_name) # file_name為自定義語料庫的路徑
    • 關鍵詞提取所使用停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑
  • 關鍵詞一並返回關鍵詞權重值示例

詞性標注

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 參數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 為默認詞性標注分詞器。
  • 標注句子分詞后每個詞的詞性,采用和 ictclas 兼容的標記法。
  • 具體的詞性對照表
import jieba.posseg as pseg
words = pseg.cut("我愛我的祖國")
for word, flag in words:
    print('%s %s' % (word, flag))
# 我 r
# 愛 v
# 我 r
# 的 uj
# 祖國 n

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

注意,輸入參數只接受 unicode

print("默認模式的tokenize")
result = jieba.tokenize(u'自然語言處理非常有用')
for tk in result:
    print("%s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))
print("\n==================================================\n")
print("搜索模式的tokenize")
result = jieba.tokenize(u'自然語言處理非常有用', mode='search')
for tk in result:
    print("%s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))
"""
默認模式的tokenize
自然語言         start: 0          end:4
處理         start: 4          end:6
非常         start: 6          end:8
有用         start: 8          end:10

==================================================

這是搜索模式的tokenize
自然         start: 0          end:2
語言         start: 2          end:4
自然語言         start: 0          end:4
處理         start: 4          end:6
非常         start: 6          end:8
有用         start: 8          end:10
"""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM