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

jieba 中文處理

一、基於 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('G:/NBA.txt',encoding='utf-8').read()
print(' '.join(analyse.extract_tags(lines,topK=20,withWeight=False,allowPOS=())))


輸出:
'''
韋少 杜蘭特 全明星 全明星賽 MVP 威少 正賽 科爾 投籃 勇士 球員 斯布魯克 更衣櫃 NBA 三連莊 張衛平 西部 指導 雷霆 明星隊
'''

二、詞性標註
1、jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 引數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 為預設詞性標註分詞器。
2、標註句子分詞後每個詞的詞性,採用和 ictclas 相容的標記法。
3、具體的詞性對照表參見計算所漢語詞性標記集

import jieba.posseg as pseg
words = pseg.cut('我愛自然語言處理')
for word,flag in words:
    print('%s %s' % (word,flag))

輸出:
'''
我 r
愛 v
自然語言 l
處理 v
'''

三、並行分詞(linux和mac)
原理:將目標文字按行分隔後,把各行文字分配到多個 Python 程序並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升 基於 python 自帶的 multiprocessing 模組,目前暫不支援 Windows

用法:

jieba.enable_parallel(4) # 開啟並行分詞模式,引數為並行程序數
jieba.disable_parallel() # 關閉並行分詞模式
實驗結果:在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,獲得了 1MB/s 的速度,是單程序版的 3.3 倍。

注意:並行分詞僅支援預設分詞器 jieba.dt 和 jieba.posseg.dt。

import sys
import time
import jieba

jieba.enable_parallel()
content = open(u'西遊記.txt',"r").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()
tm_cost = t2-t1
print('並行分詞速度為 %s bytes/second' % (len(content)/tm_cost))

jieba.disable_parallel()
content = open(u'西遊記.txt',"r").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()
tm_cost = t2-t1
print('非並行分詞速度為 %s bytes/second' % (len(content)/tm_cost))

輸出:
'''
並行分詞速度為 830619.50933 bytes/second
非並行分詞速度為 259941.448353 bytes/second
'''

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

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