精品国产亚洲一区二区三区|亚洲国产精彩中文乱码AV|久久久久亚洲AV综合波多野结衣|漂亮少妇各种调教玩弄在线

<blockquote id="ixlwe"><option id="ixlwe"></option></blockquote>
  • <span id="ixlwe"></span>

  • <abbr id="ixlwe"></abbr>

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

    大數(shù)據(jù)

    作者:Sinte-Beuve

    好的數(shù)據(jù)可視化,可以使得數(shù)據(jù)分析的結果更通俗易懂。“詞云”就是數(shù)據(jù)可視化的一種形式。給出一段文本的關鍵詞,根據(jù)關鍵詞的出現(xiàn)頻率而生成的一幅圖像,人們只要掃一眼就能夠明白文章主旨。

    最近在知乎、以及各大媒體上經??梢钥吹竭@個詞云,剛好前段之間讀了胡蘭成的《今生今世》,所以就嘗試著自己通過python來實現(xiàn)圖云。碰巧的是,今天剛好也是張愛玲的誕辰。下面是最終生成的結果。圖一為全詞的圖生成,背景是張愛玲的肖像,圖二圖三分別是散文集中出現(xiàn)的人名和地名。

    大數(shù)據(jù)

    下面主要來介紹一下詞云生成的過程。順便一提的是,現(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”為地點名詞。這樣就可以生成散文集的人名詞云和地點詞云了。

    大數(shù)據(jù)

    生成詞云

    接下來就輪到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)境,這里就弱化成地名吧。最大的是胡村,他的出生地;日本,他了結余生的地方。當然也能梳理出一條他作為漢奸最后逃亡的路線。胡村—>杭州—>諸暨—>溫州—>香港—>臺灣—>日本

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

    免責聲明:本網(wǎng)站內容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內容可能涉嫌侵犯其知識產權或存在不實內容時,應及時向本網(wǎng)站提出書面權利通知或不實情況說明,并提供身份證明、權屬證明及詳細侵權或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關文章源頭核實,溝通刪除相關內容或斷開相關鏈接。

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

    長按掃碼 閱讀全文