作者:Sinte-Beuve
好的數(shù)據(jù)可視化,可以使得數(shù)據(jù)分析的結果更通俗易懂。“詞云”就是數(shù)據(jù)可視化的一種形式。給出一段文本的關鍵詞,根據(jù)關鍵詞的出現(xiàn)頻率而生成的一幅圖像,人們只要掃一眼就能夠明白文章主旨。
最近在知乎、以及各大媒體上經??梢钥吹竭@個詞云,剛好前段之間讀了胡蘭成的《今生今世》,所以就嘗試著自己通過python來實現(xiàn)圖云。碰巧的是,今天剛好也是張愛玲的誕辰。下面是最終生成的結果。圖一為全詞的圖生成,背景是張愛玲的肖像,圖二圖三分別是散文集中出現(xiàn)的人名和地名。
下面主要來介紹一下詞云生成的過程。順便一提的是,現(xiàn)在也有很多在線的網(wǎng)站是可以直接生成詞云的,只要把文字貼進去就可以了,例如圖悅。但是,由于我選取的是二十世紀中期的作品,分析和提取關鍵詞的過程有一定的復雜性,所以還是通過python來處理。
需要的工具matplotlib
matplotlib,不用多講,用python學習過機器學習的人都知道,是一個繪圖庫,最終詞云的繪制需要用到它。jieba
jieba,最好用的開源中文分詞工具。他最主要的兩個功能是分詞和關鍵詞的抽取。在詞云的生成過程中都需要用到。wordcloud
wordcloud是一個詞云生成器,只要進行相關的配置就能生成相應的詞云。
以上三個工具具體的使用方法,我會在參考文獻中貼出來,這里就不花篇幅單獨講了,直接看《今生今世》的例子。
實現(xiàn)過程
實現(xiàn)的過程簡單來講,兩步走,1. 提取關鍵詞,2. 生成詞云。
提取關鍵詞
在使用jieba來提取關鍵詞之前,我們需要考慮幾個問題。比如說,
jieba是否能準確提取我們散文集中的關鍵詞(人名、地名)?散文中會存在例如“我們”、“覺得”、“這樣”這一類的詞,這類詞的出現(xiàn)導致了,散文集中真正的關鍵詞無法被提取出來。散文中會存在例如“汪先生”,而jieba分詞,將其分成“汪先生”和“先生”兩個詞,從而導致“先生”的頻率遠大于“汪先生”,從而對結果產生影響。正是由于中文的復雜性,所以對關鍵詞的提取帶來了難度,好在jieba基本能夠將上述問題解決。那么下面就是代碼實現(xiàn)的過程了。
1. 解決問題1和問題3
jieba有內置詞庫,一些常見的人名地名,他是能夠自己分辨出來了的。一些比較生僻的詞可以通過自定義詞庫來添加進去,保證識別率。詞典格式和dict.txt一樣,一個詞占一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒。file_name 若為路徑或二進制方式打開的文件,則文件必須為 UTF-8 編碼。例如,
應英娣 10 nr英娣 10 nr應小姐 10 nr范秀美 10 nr白相人 9 nr俞傅家 8 ns俞傅村 8 ns俞家 8 ns斯家 8 ns蕙蘭中學 8 ns蕙蘭 8 ns靜安寺路 8 ns胡村 8 ns大楚報 6 nt苦竹 6 nt
自定義詞典的詞頻一般在10左右,或者>10都可以。
然后在代碼中通過代碼引入即可。
jieba.load_userdict("namedict.txt")
2. 解決問題2
“我們”、“覺得”、“這樣”這一類詞語叫做停頓詞,需要先處理。我們可以先去網(wǎng)上下載各大機構的停用詞詞庫,然后應用到散文集中,由于停用詞詞庫大多使用的是現(xiàn)在的文法,而《今生今世》創(chuàng)作時間比較早,有些可能還需要人為添加停頓詞。
下面是去除停頓詞的代碼。
def clean_using_stopword(text): """ 去除停頓詞,利用常見停頓詞表+自建詞庫 :param text: :return: """ mywordlist = [] # 用精確模式來分詞 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)
經過以上兩步的操作,就生成了一個新的文檔,去除了停頓詞。接下來就是提取關鍵詞的時候了。
def extract_keywords(): """ 利用jieba來進行中文分詞。 analyse.extract_tags采用TF-IDF算法進行關鍵詞的提取。 :return: """ # 抽取1000個關鍵詞,帶權重,后面需要根據(jù)權重來生成詞云 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()方法就是用來提取關鍵詞的,參數(shù)依次為(文本,抽取關鍵詞的數(shù)量,返回結果是否帶權重,提取關鍵詞的詞性)。由于詞云是需要根據(jù)權重來生成的因此withWeight為true。得到結果如下,對TF-IDF算法有了解的,應該知道這里的權重就是tf-idf。
汪先生---0.037881愛玲---0.032921這樣---0.030461愛珍---0.025920日本---0.025699只覺---0.019628太太---0.019364
allowPOS=allow_pos可以提取指定詞性的關鍵詞,“nr”為人物名詞,“ns”為地點名詞。這樣就可以生成散文集的人名詞云和地點詞云了。
生成詞云
接下來就輪到wordcloud登場了。過程很簡單,依次是
初始化WordCloud生成詞云。直接給出代碼,
def draw_wordcloud(): """ 生成詞云。1.配置WordCloud。2.plt進行顯示 :return: """ back_coloring = plt.imread(bg_image_path) # 設置背景圖片 # 設置詞云屬性 wc = WordCloud(font_path=font_path, # 設置字體 background_color="white", # 背景顏色 max_words=2000, # 詞云顯示的最大詞數(shù) mask=back_coloring, # 設置背景圖片 ) # 根據(jù)頻率生成詞云 wc.generate_from_frequencies(extract_keywords()) # 顯示圖片 plt.figure() plt.imshow(wc) plt.axis("off") plt.show() # 保存到本地 wc.to_file("wordcloud.jpg")
這里需要注意的,WordCloud默認生成的詞云為矩形的,如果需要自定義詞云的形狀,需要提供一張二值化的圖片,生成的詞會填充圖的黑色部分。
wordcloud對中文的支持不太好,需要自己設置字體,自己文件在項目中。ttf的字體可以去系統(tǒng)中提取。
完整的代碼實現(xiàn)
代碼可見我的github
# -*- coding: utf-8 -*-from __future__ import print_functionimport jieba.analyseimport matplotlib.pyplot as pltfrom wordcloud import WordCloudjieba.load_userdict("namedict.txt")# 設置相關的文件路徑bg_image_path = "pic/image2.jpg" # 二值化圖片text_path = 'jsjs.txt' # 《今生今世》文本font_path = 'msyh.ttf' # 字體stopwords_path = 'stopword.txt'# 函數(shù)體見上文def clean_using_stopword(text)def preprocessing(): """ 文本預處理 :return: """ with open(text_path) as f: content = f.read() return clean_using_stopword(content) return content # 函數(shù)體見上文def extract_keywords():if __name__ == '__main__': draw_wordcloud()
提取的算法原理
jieba的jieba.analyse.extract_tags()用到的是自然語言處理當中非常常見的一個算法——TF-IDF(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率)算法。原理也比較容易看懂,有興趣了解的,可以看下面的博客。
TF-IDF原理及使用TF-IDF與余弦相似性的應用(一):自動提取關鍵詞散文的分析
顯然,愛玲是詞云中最大的一個詞,這就提現(xiàn)了,胡蘭成是愛張愛玲的嗎?或許也不見得吧,畢竟胡蘭成總共有8個老婆,張只是其中之一。
小說三要素,人物、情節(jié)、環(huán)境。
人物,詞云上基本已經可以很好的體現(xiàn)。最大的無疑是他的愛人和他的上司。其中貫穿了兩條主線——政治和愛情。政治線上。汪精衛(wèi)、李士群、周佛海提到的最多,都是大漢奸;愛情線上,胡蘭成的8個老婆當中,有6個在詞云上,玉鳳、愛玲、秀美、一枝、愛珍、小周。
環(huán)境,這里就弱化成地名吧。最大的是胡村,他的出生地;日本,他了結余生的地方。當然也能梳理出一條他作為漢奸最后逃亡的路線。胡村—>杭州—>諸暨—>溫州—>香港—>臺灣—>日本
- 蜜度索驥:以跨模態(tài)檢索技術助力“企宣”向上生長
- 后人工智能時代:2025年,在紛擾中重塑數(shù)據(jù)、洞察和行動
- 2025年展望:人工智能推動IT整合
- 量子計算:商業(yè)世界的新前沿與設計思維的融合
- IDC:三季度全球以太網(wǎng)交換機收入同比下降7.9%、環(huán)比增長6.6%
- Fortinet李宏凱:2025年在中國大陸啟動SASE PoP節(jié)點部署 助力企業(yè)出海
- Fortinet李宏凱:2024年Fortinet全球客戶已超80萬
- 央國企采購管理升級,合合信息旗下啟信慧眼以科技破局難點
- Apache Struts重大漏洞被黑客利用,遠程代碼執(zhí)行風險加劇
- Crunchbase:2024年AI網(wǎng)絡安全行業(yè)風險投資超過26億美元
- 調查報告:AI與云重塑IT格局,77%的IT領導者視網(wǎng)絡安全為首要挑戰(zhàn)
免責聲明:本網(wǎng)站內容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內容可能涉嫌侵犯其知識產權或存在不實內容時,應及時向本網(wǎng)站提出書面權利通知或不實情況說明,并提供身份證明、權屬證明及詳細侵權或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關文章源頭核實,溝通刪除相關內容或斷開相關鏈接。