1. 程式人生 > >jieba中文處理

jieba中文處理

nes 格式 unicode ont 詞頻 字符 sea pack HR

一:前言

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

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.analyse.set_stop_words(file_name) # file_name為自定義語料庫的路徑
      • 自定義語料庫示例
      • 用法示例
  • 關鍵詞一並返回關鍵詞權重值示例

    • 用法示例

詞性標註

  • 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
"""

jieba中文處理