Python在數據分析中愈來愈受歡迎,已經達到了統計學家對R的喜好程度,Python的擁護者們固然不會落後於R,開發了一個個好玩的數據分析工具,下面咱們來看看如何使用Python,來讀紅樓夢,繪製小說中的詞雲。python
首先固然要導入咱們須要用到的包,下面import進來的包,都是咱們將在接下來的程序中使用到的包,若是你們尚未安裝它們,那麼儘快安裝它們吧。微信
import jiebaapp
import numpy工具
import codecs學習
import pandas編碼
import matplotlib.pyplot as pltcode
from wordcloud import WordCloudblog
接着,要分析詞頻,就要讀取咱們的《紅樓夢》的文本數據,讀取文本,我建議使用codecs包,它能夠先經過設置文件的編碼,對文件進行讀入,這樣子就不用邊讀遍轉碼了,很是實用。utf-8
file = codecs.open("D:\\紅樓夢.txt", 'r', 'utf-8')開發
content = file.read()
file.close()
而後,咱們就來分詞了,中文分詞,固然要用大名鼎鼎的jieba包,下面就是分詞的方法。
這裏咱們須要注意兩點:
一、爲了提升分詞的準確度,咱們最好尋找咱們分詞的詞庫,這裏我下載到了紅樓夢的分詞庫,加載如jieba中,而後再進行分詞。
二、對於小說中,一個字的詞,基本上算是無用的詞,或者說是標點符號,所以這裏我直接拋棄了。
jieba.load_userdict('D:\\紅樓夢詞庫.txt');
segments = []
segs = jieba.cut(content)
for seg in segs:
if len(seg)>1:
segments.append(seg);
爲了方便統計詞頻,咱們把結果保存在pandas的DataFrame中。
segmentDF = pandas.DataFrame({'segment':segments})
接着咱們來移除停用詞,停用詞包括咱們平常的停用詞和文言文中的停用詞兩部分,以下所示:
#移除停用詞
stopwords = pandas.read_csv(
"D:\\StopwordsCN.txt",
encoding='utf8',
index_col=False,
quoting=3,
sep="\t"
)
segmentDF = segmentDF[~segmentDF.segment.isin(stopwords.stopword)]
wyStopWords = pandas.Series([
# 42 個文言虛詞
'之', '其', '或', '亦', '方', '於', '即', '皆', '因', '仍', '故',
'尚', '呢', '了', '的', '着', '一', '不', '乃', '呀', '嗎', '咧',
'啊', '把', '讓', '向', '往', '是', '在', '越', '再', '更', '比',
'很', '偏', '別', '好', '可', '便', '就', '但', '兒',
# 高頻副詞
'又', '也', '都', '要',
# 高頻代詞
'這', '那', '你', '我', '他',
#高頻動詞
'來', '去', '道', '笑', '說',
#空格
' ', ''
]);
segmentDF = segmentDF[~segmentDF.segment.isin(wyStopWords)]
從上面的代碼咱們能夠看到,pandas對數據的處理,真的是很是方便,更加方便的還在下面,咱們接着來對詞頻進行統計。
segStat = segmentDF.groupby(
by=["segment"]
)["segment"].agg({
"計數":numpy.size
}).reset_index().sort(
columns=["計數"],
ascending=False
);
segStat.head(100)
到這裏,咱們基本上能夠獲得詞頻了,觀察一下下面的詞頻,賈寶玉固然當之無愧是主角,出現次數基本和換行符一致,哈哈,可是出乎意料的是,賈母,居然是第二,其實這也難怪,紅樓夢,哪一個場景沒有涉及到賈母的?賈寶玉玩完後,都說要到賈母那裏請安或者吃飯的,情理之中。有此可見,最佳女配角,非賈母莫屬了。
細心的讀者可能也發現了,林黛玉出現的次數,居然還排在了襲人的後面,其實筆者仔細一想,一點也不奇怪。
首先第一個,林黛玉掛得早,掛得早,出現的次數天然就沒有那麼多了。
還有另一個緣由,不知道看官們注意到不,賈寶玉和女生滾牀單,第一個就是襲人(固然秦可卿是不算的,那純屬是賈寶玉本身夢中YY的),所以,大家懂的。若是你們對賈寶玉的私生活感興趣,能夠看這篇文章《賈寶玉到底和多少人發生過性關係?》
最後要告訴你們的是,黛玉只是林黛玉的暱稱,加上妹妹(只是不知道賈寶玉有多少個妹妹咯)和連名帶姓的林黛玉的詞頻,也是超越了襲人的,所以,紅樓夢符合廣電總局的規定——小三是不能上位的。
segment 計數
{{14760:0}} 寶玉 3762
{{35682:0}} 賈母 1272
7738 鳳姐 1192
{{34168:0}} 襲人 1134
{{40972:0}} 黛玉 1029
{{27448:0}} 王夫人 1015
{{13833:0}} 現在 1002
{{35130:0}} 說道 978
{{31820:0}} 老太太 974
{{29301:0}} 知道 973
{{36077:0}} 起來 955
{{14062:0}} 姑娘 949
7858 出來 932
4769 衆人 872
821 一面 828
{{13305:0}} 太太 825
{{13686:0}} 奶奶 810
{{10094:0}} 只見 791
{{14774:0}} 寶釵 789
2211 兩個 771
{{25441:0}} 沒有 767
1737 不是 743
1828 不知 702
{{10940:0}} 聽見 692
{{35734:0}} 賈璉 689
{{37195:0}} 進來 632
{{11053:0}} 告訴 605
2151 東西 603
{{16508:0}} 平兒 590
... ... ...
{{15894:0}} 屋裏 286
{{37827:0}} 邢夫人 286
{{23866:0}} 林黛玉 278
{{15735:0}} 尤氏 277
{{39074:0}} 問道 275
{{28961:0}} 看見 271
{{14016:0}} 妹妹 270
1800 不用 265
9373 原來 258
{{40507:0}} 香菱 256
200 一句 255
{{15032:0}} 家裏 254
1646 不得 254
248 一聲 253
{{33649:0}} 薛蟠 253
{{14223:0}} 媳婦 249
8269 到底 247
{{36880:0}} 這會子 246
{{37178:0}} 進去 246
{{14033:0}} 姊妹 243
8129 別人 240
{{11753:0}} 回去 237
{{36611:0}} 過去 236
{{22448:0}} 明兒 236
{{21774:0}} 方纔 233
{{40871:0}} 麝月 233
2446 丫環 233
{{37290:0}} 連忙 232
{{17554:0}} 心中 230
{{14200:0}} 婆子 225
爲了更加方便地觀察數據,咱們使用詞雲的工具,來繪製詞雲,經過詞雲,咱們能夠更加方便簡單地查看詞頻。
#繪畫詞雲
wordcloud = WordCloud(
font_path='D:\\simhei.ttf',
background_color="black"
)
plt.figure(num=None, figsize=(1000, 600), dpi=800, facecolor='w', edgecolor='k')
wordcloud = wordcloud.fit_words(segStat.head(1000).itertuples(index=False))
plt.imshow(wordcloud)
plt.close()
好了,這個就是用Python繪製紅樓夢詞雲的結果,你發現了什麼玄機沒有?我有一個微信公衆號,常常會分享一些python技術相關的乾貨;若是你喜歡個人分享,能夠用微信搜索「python語言學習」
關注。歡迎你們加入千人交流答疑裙:699+749+852