1. 程式人生 > >【NLP】【一】中文分詞之jieba

【NLP】【一】中文分詞之jieba

宣告:本文參考jieba官方文件而成,官方連結:https://github.com/fxsjy/jieba

【一】jieba安裝

pip install jieba

【二】jieba簡介

簡介可見jieba官方說明:https://pypi.org/project/jieba/

總而言之,jieba用於中文分詞,支援的文字編碼格式為utf-8,支援的功能包括:中文分詞、關鍵字提取、詞性標註

整體功能如下圖:

【三】結巴使用之分詞

1. 使用精確模式

# -*- coding:utf-8 -*-
import jieba

sentence = "我愛北京天安門"

seg = jieba.cut(sentence=sentence)
print("/".join(seg))

結果如下:

我/愛/北京/天安門

2. 使用全模式

import jieba

sentence = "我愛北京天安門"

seg = jieba.cut(sentence=sentence,cut_all=True)
print("/".join(seg))

結果如下:

我/愛/北京/天安/天安門

3.使用搜索模式

# -*- coding:utf-8 -*-
import jieba

sentence = "我愛北京天安門"

seg = jieba.cut_for_search(sentence=sentence)
print("/".join(seg))

結果如下:

我/愛/北京/天安/天安門

關於三種模式的區別,可見官方描述:

4. 分詞介面詳解

4.1 cut介面,該介面接受三個引數,重點關注一下第一個引數:要求句子編譯格式為unicode編碼。所以,如果是GBK編碼,需要先轉換為utf-8介面的編碼格式。

cut(self, sentence, cut_all=False, HMM=True)
   - sentence: The str(unicode) to be segmented.
   - cut_all: Model type. True for full pattern, False for accurate pattern.
   - HMM: Whether to use the Hidden Markov Model.

當我們不知道文件的編碼格式時,可以採用如下程式碼:

import chardet
with open("xxx.txt",'rb') as f:
    data = f.read()
    print(chardet.detect(data))

輸出結果為:

{'confidence': 0.99, 'language': 'Chinese', 'encoding': 'GB2312'}

4.2 cut_for_search介面

cut_for_search(self, sentence, HMM=True)

4.3 jieba.lcut 以及 jieba.lcut_for_search 直接返回 list

print(jieba.lcut(sentence))
print(jieba.lcut_for_search(sentence))

結果如下:

['我', '愛', '北京', '天安門']
['我', '愛', '北京', '天安', '天安門']

【四】自定義詞典

1. 先看看jieba自帶的詞典長啥樣

jieba/dict.txt

T恤 4 n
A座 3 n
A股 3 n
A型 3 n
A輪 3 n

可以看出,jieba的詞典組成格式為:一行一個詞語,詞語 詞頻 詞性

據jieba官方介紹:

詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒

2. 自定一一個字典

我 4 n
北京 3 n
天安門

3. 使用自定義詞典

jieba.load_userdict(r"D:\jieba-0.39\my_dict.txt")
print(jieba.lcut(sentence))
print(jieba.lcut_for_search(sentence))

結果如下:

['我', '愛', '北京', '天安門']
['我', '愛', '北京', '天安', '天安門']

【五】調整詞典

jieba支援動態調整已經載入的詞典

有兩種方法

1. 將新詞加入詞典

2. 調整詞典中的某個詞的詞頻

使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程式中動態修改詞典。

使用 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來。

【六】關鍵詞提取

jieba分詞支援兩種關鍵詞提取演算法:TF-IDF、TextRank。這兩種演算法會在後面的文章結合jieba原始碼進行分析。這裡先看看如何使用。

1. 基於TF-IDF進行關鍵詞提取

print(','.join(jieba.analyse.extract_tags(sentence,topK=2)))

結果如下:

天安門,北京

1.1 介面詳解 extract_tags

extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False)
sentence 為待提取的文字
topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
withWeight 為是否一併返回關鍵詞權重值,預設值為 False
allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選

該介面用於基於TF-IDF提取關鍵詞,可用於篩選指定詞性的關鍵詞,返回值可以帶關鍵詞的權重,也可以不帶。

2. 依據TextRank演算法進行關鍵詞提取

print(','.join(jieba.analyse.textrank(sentence,topK=2)))

結果如下:

天安門,北京

2.1 介面詳解 textrank

textrank(self, sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'), withFlag=False):
- topK: return how many top keywords. `None` for all possible words.
- withWeight: if True, return a list of (word, weight);
			  if False, return a list of words.
- allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v'].
			if the POS of w is not in this list, it will be filtered.
- withFlag: if True, return a list of pair(word, weight) like posseg.cut
			if False, return a list of words

【七】詞性標註

words =jieba.posseg.cut(sentence)
for word, flag in words:
    print('%s %s' % (word, flag))

結果如下:

我 r
愛 v
北京 n
天安門 ns

 

總結:jieba提供的中文分詞、詞性標註、關鍵字提取等功能,使用簡單,安裝方便。其實現不僅有python版本,還有c++ java等版本,詳情可以jieba官方連結:https://github.com/fxsjy/jieba