人們說話不是乙個詞乙個詞崩出來的,文章也就由句子組成。要想讓機器識別美文,體會中華名族漢語的博大精深,不是不可能。但是,首先需要將其轉化成其可以識別的模式——詞語。分詞是自然語言處理(nlp)中最底層、最基本的模組,分詞精度的好壞將直接影響文字分析的結果。
這裡介紹著名的分詞方法:結巴分詞以及基本分詞方法在python和r語言中的用法。
python
中文分詞的三種常用模式
三種模式預設都採用隱馬爾科夫模型分詞;同時,結巴分詞支援繁體分詞和自定義字典方法。
匯入模組:import jieba
(1)、精確模式:
>>> test = '**有道家發源地武當山'
>>> cut1 = jieba.cut(test)
>>> type(cut1)
>>> print('精確分詞結果:',' '.join(cut1))
cut1
不能直接檢視,『 『.join(cut1)函式指用空格分開cut1裡面的元素,然後通過print()函式才能檢視。
精確分詞結果: ** 有 道家 發源地 武當山
(2)、全模式:
>>> cut2 = jieba.cut(test,cut_all = true)
>>> print('全模式分詞結果:',' '.join(cut2))
全模式分詞結果: ** 有 道家 發源 發源地 源地 武當 武當山
把所有可能的詞都考慮進來了。「精確模式」其實有預設引數cut_all = false。
顯然,全模式不管分詞後意思會不會有歧義,只管快速分出所有可能的詞,不適合做文字分析。
(3)、搜尋引擎模式:
>>> cut3 = jieba.cut_for_search(test)
>>> print('搜尋引擎模式分詞結果:',' '.join(cut3))
搜尋引擎模式分詞結果: ** 有 道家 發源 源地 發源地 武當 武當山
搜尋引擎模式也會給出所有可能的分詞結果,但是搜尋引擎模式對於詞典中不存在的詞,比如一些很少見、新詞,卻能給出正確的分詞結果。
新增自定義詞典
path = 『詞典路徑』
jieba.load_userdict (path2)
然後分詞即可。
jieba.analyse.extract_tags(dat,topk = 5)
注意
:親測,詞典一般是.txt,預設是ascii格式,應該另存為utf8模式,為什麼?——有中文。其實,幫助文件裡面有的。
"
>install.packages('jiebard')
>install.packages('jiebar')
> library(jiebard)
> library(jiebar)
分詞
> test <- '革命尚未成功,同志仍需努力!'
首先需要建立分詞引擎
> seg<-worker()
這裡「<=」表示分詞運算子
> seg<=test
[1] "革命" "尚未" "成功" "同志" "仍" "需" "努力"
與下面這句效果一樣
> segment(test,seg)
[1] "革命" "尚未" "成功" "同志" "仍" "需" "努力"
也就是有兩種寫法:
(1)、seg<=test
(2)、segment(test,seg)
後面的類似都有兩種寫法。
詞性標註:可以使tag來進行分詞和詞性標註, 詞性標註使用混合模型分詞,標註採用和 ictclas 相容的標記法。
>seg<-woker('tag')
> test <- '革命尚未成功,同志仍需努力!'
> segment(test,seg)
vn d a n zg v ad
"革命" "尚未" "成功" "同志" "仍" "需" "努力"
這裡seg <= test也是一樣的,後面一樣有這樣寫法,只寫一種,不再強調指出。
> seg2<-worker('keywords',topn = 1)
> keywords(test,seg2)
6.13553
"同志"
simhash與海明距離:
> test <- '革命尚未成功,同志仍需努力!'
> seg3<-worker('simhash',topn = 2)
> simhash(test,seg3)
$simhash
[1] "13489182016966018967"
$keyword
6.13553 6.0229
"同志" "努力"
列表分詞:
支援一次性對多個列表(每個元素為文字)進行分詞。
test2 <- '**有道家發源地武當山'
[[1]]
vn d a n zg v ad
"革命" "尚未" "成功" "同志" "仍" "需" "努力"
[[2]]
ns v n n ns
"**" "有" "道家" "發源地" "武當山"
去除停止詞
>seg <- worker(stop_word = stoppath)
還有一些其它設定,比如:
show_dictpath()
:edit_dict(name = "user")
:預設編輯使用者自定義詞典,還有system(可以開啟編輯jieba.dict.utf8),stop_word(停用詞典)兩個引數值供選擇。
還有一些其它引數,具體參見help("jiebar"),獲取更多詳細資訊,學習利用幫助資訊對於r語言的學習很重要。
其實,具體分詞引擎worker()怎麼設定,我們可以幫助一下:help('worker')就會有:
worker(type = "mix", dict = dictpath, hmm = hmmpath, user = userpath,idf = idfpath, stop_word = stoppath, write = t, qmax = 20, topn = 5,encoding = "utf-8", detect = t, symbol = f, lines = 1e+05,output = null, bylines = f, user_weight = "max")
這裡的一些引數:
type, 引擎型別
dict, 系統詞典
hmm, hmm模型路徑
user, 使用者詞典
idf, idf詞典
write, 是否將檔案分詞結果寫入檔案,預設false
qmax, 最大成詞的字元數,預設20個字元
encoding, 輸入檔案的編碼,預設utf-8
detect, 是否編碼檢查,預設true
symbol, 是否保留符號,預設false
lines, 每次讀取檔案的最大行數,用於控制讀取檔案的長度。大檔案則會分次讀取。
output, 輸出路徑
bylines, 按行輸出
user_weight, 使用者權重
python 中文jieba分詞
import os import jieba from collections import counter def words txt print jieba.cut txt lista jieba.cut txt 返回的結構都是乙個可迭代的 generator,可以使用 for 迴圈來獲得分詞後...
關於jieba分詞 Python
做詞云視覺化的時候,一般都用乙個庫叫jieba,它是用來分詞的。jieba庫在安裝時,會附帶乙個詞庫,這個詞庫中包含了日常漢語的詞語和詞性。在分詞時,jieba庫會先基於詞庫對文字進行匹配,生成文字中的漢字最有可能形成的詞。然後將這些詞組成乙個dag,用動態規劃演算法來查詢最大的概率路徑,盡可能不將...
jieba 利用jieba分詞
目錄 三種分詞模式 新增自定義詞典進行分詞 jieba提供了三種分詞模式,分別是全模式,精確模式和搜尋引擎模式。全模式下會將所有可能的詞語都進行分詞,精確模式下會盡可能的將句子精確切開,搜尋引擎模式實在精確模式的基礎上,對長詞再進行劃分,提高分詞的召回率。使用cut和cut for search即可...