文本可視化(一)——《今生今世》詞云生成與小說(shuō)分析

大數(shù)據(jù)

作者: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)的人名和地名。

大數(shù)據(jù)

下面主要來(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)詞云了。

大數(shù)據(jù)

生成詞云

接下來(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)灣—>日本

極客網(wǎng)企業(yè)會(huì)員

免責(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)鏈接。

2017-10-23
文本可視化(一)——《今生今世》詞云生成與小說(shuō)分析
作者:Sinte-Beuve 好的數(shù)據(jù)可視化,可以使得數(shù)據(jù)分析的結(jié)果更通俗易懂?!霸~云”就是數(shù)據(jù)可視化的一種形式。給出一段文本的關(guān)鍵詞,根據(jù)關(guān)鍵詞的出現(xiàn)頻率而

長(zhǎng)按掃碼 閱讀全文