作者:Sinte-Beuve
好的數(shù)據(jù)可視化,可以使得數(shù)據(jù)分析的結(jié)果更通俗易懂?!霸~云”就是數(shù)據(jù)可視化的一種形式。給出一段文本的關(guān)鍵詞,根據(jù)關(guān)鍵詞的出現(xiàn)頻率而生成的一幅圖像,人們只要掃一眼就能夠明白文章主旨。
最近在知乎、以及各大媒體上經(jīng)??梢钥吹竭@個(gè)詞云,剛好前段之間讀了胡蘭成的《今生今世》,所以就嘗試著自己通過(guò)python來(lái)實(shí)現(xiàn)圖云。碰巧的是,今天剛好也是張愛(ài)玲的誕辰。下面是最終生成的結(jié)果。圖一為全詞的圖生成,背景是張愛(ài)玲的肖像,圖二圖三分別是散文集中出現(xiàn)的人名和地名。
下面主要來(lái)介紹一下詞云生成的過(guò)程。順便一提的是,現(xiàn)在也有很多在線的網(wǎng)站是可以直接生成詞云的,只要把文字貼進(jìn)去就可以了,例如圖悅。但是,由于我選取的是二十世紀(jì)中期的作品,分析和提取關(guān)鍵詞的過(guò)程有一定的復(fù)雜性,所以還是通過(guò)python來(lái)處理。
需要的工具matplotlib
matplotlib,不用多講,用python學(xué)習(xí)過(guò)機(jī)器學(xué)習(xí)的人都知道,是一個(gè)繪圖庫(kù),最終詞云的繪制需要用到它。jieba
jieba,最好用的開(kāi)源中文分詞工具。他最主要的兩個(gè)功能是分詞和關(guān)鍵詞的抽取。在詞云的生成過(guò)程中都需要用到。wordcloud
wordcloud是一個(gè)詞云生成器,只要進(jìn)行相關(guān)的配置就能生成相應(yīng)的詞云。
以上三個(gè)工具具體的使用方法,我會(huì)在參考文獻(xiàn)中貼出來(lái),這里就不花篇幅單獨(dú)講了,直接看《今生今世》的例子。
實(shí)現(xiàn)過(guò)程
實(shí)現(xiàn)的過(guò)程簡(jiǎn)單來(lái)講,兩步走,1. 提取關(guān)鍵詞,2. 生成詞云。
提取關(guān)鍵詞
在使用jieba來(lái)提取關(guān)鍵詞之前,我們需要考慮幾個(gè)問(wèn)題。比如說(shuō),
jieba是否能準(zhǔn)確提取我們散文集中的關(guān)鍵詞(人名、地名)?散文中會(huì)存在例如“我們”、“覺(jué)得”、“這樣”這一類的詞,這類詞的出現(xiàn)導(dǎo)致了,散文集中真正的關(guān)鍵詞無(wú)法被提取出來(lái)。散文中會(huì)存在例如“汪先生”,而jieba分詞,將其分成“汪先生”和“先生”兩個(gè)詞,從而導(dǎo)致“先生”的頻率遠(yuǎn)大于“汪先生”,從而對(duì)結(jié)果產(chǎn)生影響。正是由于中文的復(fù)雜性,所以對(duì)關(guān)鍵詞的提取帶來(lái)了難度,好在jieba基本能夠?qū)⑸鲜鰡?wèn)題解決。那么下面就是代碼實(shí)現(xiàn)的過(guò)程了。
1. 解決問(wèn)題1和問(wèn)題3
jieba有內(nèi)置詞庫(kù),一些常見(jiàn)的人名地名,他是能夠自己分辨出來(lái)了的。一些比較生僻的詞可以通過(guò)自定義詞庫(kù)來(lái)添加進(jìn)去,保證識(shí)別率。詞典格式和dict.txt一樣,一個(gè)詞占一行;每一行分三部分:詞語(yǔ)、詞頻(可省略)、詞性(可省略),用空格隔開(kāi),順序不可顛倒。file_name 若為路徑或二進(jìn)制方式打開(kāi)的文件,則文件必須為 UTF-8 編碼。例如,
應(yīng)英娣 10 nr英娣 10 nr應(yīng)小姐 10 nr范秀美 10 nr白相人 9 nr俞傅家 8 ns俞傅村 8 ns俞家 8 ns斯家 8 ns蕙蘭中學(xué) 8 ns蕙蘭 8 ns靜安寺路 8 ns胡村 8 ns大楚報(bào) 6 nt苦竹 6 nt
自定義詞典的詞頻一般在10左右,或者>10都可以。
然后在代碼中通過(guò)代碼引入即可。
jieba.load_userdict("namedict.txt")
2. 解決問(wèn)題2
“我們”、“覺(jué)得”、“這樣”這一類詞語(yǔ)叫做停頓詞,需要先處理。我們可以先去網(wǎng)上下載各大機(jī)構(gòu)的停用詞詞庫(kù),然后應(yīng)用到散文集中,由于停用詞詞庫(kù)大多使用的是現(xiàn)在的文法,而《今生今世》創(chuàng)作時(shí)間比較早,有些可能還需要人為添加停頓詞。
下面是去除停頓詞的代碼。
def clean_using_stopword(text): """ 去除停頓詞,利用常見(jiàn)停頓詞表+自建詞庫(kù) :param text: :return: """ mywordlist = [] # 用精確模式來(lái)分詞 seg_list = jieba.cut(text, cut_all=False) liststr = "/ ".join(seg_list) with open(stopwords_path) as f_stop: f_stop_text = f_stop.read() f_stop_text = unicode(f_stop_text, 'utf-8') f_stop_seg_list = f_stop_text.split('\n') for myword in liststr.split('/'): # 去除停頓詞,生成新文檔 if not (myword.strip() in f_stop_seg_list) and len(myword.strip()) > 1: mywordlist.append(myword) return ''.join(mywordlist)
經(jīng)過(guò)以上兩步的操作,就生成了一個(gè)新的文檔,去除了停頓詞。接下來(lái)就是提取關(guān)鍵詞的時(shí)候了。
def extract_keywords(): """ 利用jieba來(lái)進(jìn)行中文分詞。 analyse.extract_tags采用TF-IDF算法進(jìn)行關(guān)鍵詞的提取。 :return: """ # 抽取1000個(gè)關(guān)鍵詞,帶權(quán)重,后面需要根據(jù)權(quán)重來(lái)生成詞云 allow_pos = ('nr',) # 詞性 tags = jieba.analyse.extract_tags(preprocessing(), 1000, withWeight=True) keywords = dict() for i in tags: print("%s---%f" % (i[0], i[1])) keywords[i[0]] = i[1] return keywords
jieba.analyse.extract_tags()方法就是用來(lái)提取關(guān)鍵詞的,參數(shù)依次為(文本,抽取關(guān)鍵詞的數(shù)量,返回結(jié)果是否帶權(quán)重,提取關(guān)鍵詞的詞性)。由于詞云是需要根據(jù)權(quán)重來(lái)生成的因此withWeight為true。得到結(jié)果如下,對(duì)TF-IDF算法有了解的,應(yīng)該知道這里的權(quán)重就是tf-idf。
汪先生---0.037881愛(ài)玲---0.032921這樣---0.030461愛(ài)珍---0.025920日本---0.025699只覺(jué)---0.019628太太---0.019364
allowPOS=allow_pos可以提取指定詞性的關(guān)鍵詞,“nr”為人物名詞,“ns”為地點(diǎn)名詞。這樣就可以生成散文集的人名詞云和地點(diǎn)詞云了。
生成詞云
接下來(lái)就輪到wordcloud登場(chǎng)了。過(guò)程很簡(jiǎn)單,依次是
初始化WordCloud生成詞云。直接給出代碼,
def draw_wordcloud(): """ 生成詞云。1.配置WordCloud。2.plt進(jìn)行顯示 :return: """ back_coloring = plt.imread(bg_image_path) # 設(shè)置背景圖片 # 設(shè)置詞云屬性 wc = WordCloud(font_path=font_path, # 設(shè)置字體 background_color="white", # 背景顏色 max_words=2000, # 詞云顯示的最大詞數(shù) mask=back_coloring, # 設(shè)置背景圖片 ) # 根據(jù)頻率生成詞云 wc.generate_from_frequencies(extract_keywords()) # 顯示圖片 plt.figure() plt.imshow(wc) plt.axis("off") plt.show() # 保存到本地 wc.to_file("wordcloud.jpg")
這里需要注意的,WordCloud默認(rèn)生成的詞云為矩形的,如果需要自定義詞云的形狀,需要提供一張二值化的圖片,生成的詞會(huì)填充圖的黑色部分。
wordcloud對(duì)中文的支持不太好,需要自己設(shè)置字體,自己文件在項(xiàng)目中。ttf的字體可以去系統(tǒng)中提取。
完整的代碼實(shí)現(xiàn)
代碼可見(jiàn)我的github
# -*- coding: utf-8 -*-from __future__ import print_functionimport jieba.analyseimport matplotlib.pyplot as pltfrom wordcloud import WordCloudjieba.load_userdict("namedict.txt")# 設(shè)置相關(guān)的文件路徑bg_image_path = "pic/image2.jpg" # 二值化圖片text_path = 'jsjs.txt' # 《今生今世》文本font_path = 'msyh.ttf' # 字體stopwords_path = 'stopword.txt'# 函數(shù)體見(jiàn)上文def clean_using_stopword(text)def preprocessing(): """ 文本預(yù)處理 :return: """ with open(text_path) as f: content = f.read() return clean_using_stopword(content) return content # 函數(shù)體見(jiàn)上文def extract_keywords():if __name__ == '__main__': draw_wordcloud()
提取的算法原理
jieba的jieba.analyse.extract_tags()用到的是自然語(yǔ)言處理當(dāng)中非常常見(jiàn)的一個(gè)算法——TF-IDF(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率)算法。原理也比較容易看懂,有興趣了解的,可以看下面的博客。
TF-IDF原理及使用TF-IDF與余弦相似性的應(yīng)用(一):自動(dòng)提取關(guān)鍵詞散文的分析
顯然,愛(ài)玲是詞云中最大的一個(gè)詞,這就提現(xiàn)了,胡蘭成是愛(ài)張愛(ài)玲的嗎?或許也不見(jiàn)得吧,畢竟胡蘭成總共有8個(gè)老婆,張只是其中之一。
小說(shuō)三要素,人物、情節(jié)、環(huán)境。
人物,詞云上基本已經(jīng)可以很好的體現(xiàn)。最大的無(wú)疑是他的愛(ài)人和他的上司。其中貫穿了兩條主線——政治和愛(ài)情。政治線上。汪精衛(wèi)、李士群、周佛海提到的最多,都是大漢奸;愛(ài)情線上,胡蘭成的8個(gè)老婆當(dāng)中,有6個(gè)在詞云上,玉鳳、愛(ài)玲、秀美、一枝、愛(ài)珍、小周。
環(huán)境,這里就弱化成地名吧。最大的是胡村,他的出生地;日本,他了結(jié)余生的地方。當(dāng)然也能梳理出一條他作為漢奸最后逃亡的路線。胡村—>杭州—>諸暨—>溫州—>香港—>臺(tái)灣—>日本
- 蜜度索驥:以跨模態(tài)檢索技術(shù)助力“企宣”向上生長(zhǎng)
- 密態(tài)計(jì)算技術(shù)助力農(nóng)村普惠金融 螞蟻密算、網(wǎng)商銀行項(xiàng)目入選大數(shù)據(jù)“星河”案例
- 專利糾紛升級(jí)!Netflix就虛擬機(jī)專利侵權(quán)起訴博通及VMware
- 兩大難題發(fā)布!華為啟動(dòng)2024奧林帕斯獎(jiǎng)全球征集
- 2025年工業(yè)軟件市場(chǎng)格局:7個(gè)關(guān)鍵統(tǒng)計(jì)數(shù)據(jù)與分析
- Commvault持續(xù)業(yè)務(wù)策略:應(yīng)對(duì)現(xiàn)代數(shù)據(jù)保護(hù)挑戰(zhàn)的新范式
- 2025年網(wǎng)絡(luò)安全主要趨勢(shì)
- 2025年值得關(guān)注的數(shù)據(jù)中心可持續(xù)發(fā)展趨勢(shì)
- 量子計(jì)算火熱,投資者又在大舉尋找“量子概念股”
- 從量子威脅到人工智能防御:2025年網(wǎng)絡(luò)安全將如何發(fā)展
- 后人工智能時(shí)代:2025年,在紛擾中重塑數(shù)據(jù)、洞察和行動(dòng)
免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書(shū)面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。