Python 分詞及詞雲繪圖


支持三種分詞模式:
精確模式,試圖將句子最精確地切開,適合文本分析;
全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。


關鍵詞:HMM 隱馬爾可夫模型

 

三種分詞模式:

# -*- coding: utf-8 -*-
import jieba
#jieba.initialize()

seg_list = jieba.cut("中華人民共和國萬歲!", cut_all=False) #精確模式(默認)
print(" | ".join(seg_list))

seg_list = jieba.cut("中華人民共和國萬歲!", cut_all=True)  #全模式
print(" | ".join(seg_list)) 

seg_list = jieba.cut_for_search("中華人民共和國萬歲!")     #搜索引擎模式
print(" | ".join(seg_list))

結果:
中華人民共和國 | 萬歲 | !
中華 | 中華人民 | 中華人民共和國 | 華人 | 人民 | 人民共和國 | 共和 | 共和國 | 萬歲 |  |
中華 | 華人 | 人民 | 共和 | 共和國 | 中華人民共和國 | 萬歲 | !

 

結果可以直接保持為 list

seg_list = jieba.cut("中華人民共和國萬歲!") #默認精確模式
print(seg_list) #此返回生成器

seg_list = jieba.lcut("中華人民共和國萬歲!")
print(seg_list)

seg_list = jieba.lcut_for_search ("中華人民共和國萬歲!")
print(seg_list)

結果:
<generator object Tokenizer.cut at 0x0000000003972150>
['中華人民共和國', '萬歲', '!']
['中華', '華人', '人民', '共和', '共和國', '中華人民共和國', '萬歲', '!']

 

【自定義分詞字典(屬額外添加)】
默認分詞器為 jieba.dt。可使用自定義字典,添加詞庫中沒有的詞,文本必須為 UTF-8 編碼。詞典格式和 dict.txt 一樣,一個詞占一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開。

測試文件 dict.txt 中,我只添加一個單詞 "和國":

jieba.load_userdict("C:/Users/huangzecheng/Desktop/dict.txt") 

seg_list = jieba.cut("中華人民共和國萬歲!", cut_all=True)#如全模式
print(" | ".join(seg_list)) 

結果:
中華 | 中華人民 | 中華人民共和國 | 華人 | 人民 | 人民共和國 | 共和 | 共和國 | 和國 | 萬歲 |  |

【添加刪除分詞】
加載的自定義詞典,是與默認的一起定義分詞的。也可以使用幾個函數添加、刪除、禁止某個詞被划分。
add_word(word, freq=None, tag=None)
del_word(word) 
suggest_freq(segment, tune=True)

jieba.add_word('中華人')
print(" | ".join(jieba.cut("中華人民共和國萬歲!", cut_all=True))) 
結果:中華 | 中華人 | 中華人民 | 中華人民共和國 | 華人 | 人民 | 人民共和國 | 共和 | 共和國 | 和國 | 萬歲 |  |

jieba.del_word('共和') 
print(" | ".join(jieba.cut("中華人民共和國萬歲!", cut_all=True))) 
結果:中華 | 中華人 | 中華人民 | 中華人民共和國 | 華人 | 人民 | 人民共和國 | 共和國 | 和國 | 萬歲 |  |

jieba.add_word('共和')
jieba.suggest_freq('國萬歲', tune=True)
print(" | ".join(jieba.cut("中華人民共和國萬歲!", cut_all=True))) 
結果:中華 | 中華人 | 中華人民 | 中華人民共和國 | 華人 | 人民 | 人民共和國 | 共和國 | 和國 | 國萬歲 | 萬歲 |  |

【使用最多的分詞】
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence :為待提取的文本
topK :為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20
withWeight :為是否一並返回關鍵詞權重值,默認值為 False
allowPOS :僅包括指定詞性的詞,默認值為空,即不篩選

測試:去文本中出現次數最多的前5個字符

str = "topK 為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20;"
str = str + "withWeight 為是否一並返回關鍵詞權重值,默認值為 False"
str = str + "allowPOS 僅包括指定詞性的詞,默認值為空,即不篩選"
str = str + "jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 實例,idf_path 為 IDF 頻率文件"
tags = jieba.analyse.extract_tags(str, topK=5)
print(" | ".join(tags))
結果:默認值 | TFIDF | idf | IDF | path

 上面說過字典有3部分組成:詞語、詞頻(可省略)、詞性(可省略)。textrank可運行過濾不同詞性。
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 

tags = jieba.analyse.textrank(str, topK=5, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 
print(" | ".join(tags))
結果:權重 | 關鍵詞 | 詞性 | 頻率 | 新建

【取分詞及詞性】

words = jieba.posseg.cut("中華人民共和國萬歲!")
for word, flag in words:
    print('%s %s' % (word, flag))

結果:
中華人民共和國 ns
萬歲 m
! x

【取分詞及起止位置】

words = jieba.tokenize("中華人民共和國萬歲!")
for w in words:
    print("word %s\t\t start: %d \t\t end:%d" % (w[0],w[1],w[2]))

結果:
word 中華人民共和國      start: 0         end:7
word 萬歲                start: 7         end:9
word !                  start: 9         end:10
words = jieba.tokenize("中華人民共和國萬歲!", mode='search') #搜索模式
for w in words:
    print("word %s\t\t start: %d \t\t end:%d" % (w[0],w[1],w[2]))

結果:
word 中華                start: 0                end:2
word 華人                start: 1                end:3
word 人民                start: 2                end:4
word 共和                start: 4                end:6
word 共和國              start: 4                end:7
word 中華人民共和國      start: 0                end:7
word 萬歲                start: 7                end:9
word !                  start: 9                end:10

簡單示例:從 sql server 數據庫中讀取某個文本字段,分詞並自定義繪圖

# -*- coding: utf-8 -*-

import pymssql
import jieba
import jieba.analyse
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from scipy.misc import imread

host = "localhost"
user = "kk"
passwd = "kk"
dbname = "hzc"
conn = None

try:
    conn = pymssql.connect(
        host = host,
        user = user,
        password = passwd,
        database = dbname
        )
    cur = conn.cursor()
    cur.execute("select col from jieba;")
    rows = cur.fetchall()
    tagsall=u""
    #tagsall = open('filepath.txt','r').read()
    for row in rows:
        tags = jieba.analyse.extract_tags(row[0], topK=20)
        tagsjoin = u" ".join(tags)
        tagsall = tagsall + " " + tagsjoin
        #print(tagsjoin)

    #http://labfile.oss.aliyuncs.com/courses/756/DroidSansFallbackFull.ttf
    wc_cfg = WordCloud(
        font_path="D:/Python35/Tools/whl/DroidSansFallbackFull.ttf",#字體
        mask= imread("D:/Python35/Tools/whl/bg.png"),#背景模板(只黑白圖,黑的顯示)
        background_color="white", #背景色
        max_words=1000,     #最大詞量
        mode="RGBA",        #透明底色(background_color不為空).默認rgb
        width=500,          #寬度
        height=400,         #高度
        max_font_size=100   #字體大小
    )
    wc = wc_cfg.generate(tagsall)
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
finally:
    if conn:
        conn.close()

 


免責聲明!

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



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