python红楼梦词频统计_用 Python 分析《红楼梦》(2)-阿里云开发者社区
6 詞頻統(tǒng)計(jì)
完成分詞以后,詞頻統(tǒng)計(jì)就非常簡單了。我們只需要根據(jù)分詞結(jié)果把片段切分開,去掉長度為一的片段(也就是單字),然后數(shù)一下每一種片段的個(gè)數(shù)就可以了。
這是出現(xiàn)次數(shù)排名前 20 的單詞:
(括號(hào)內(nèi)為頻數(shù))
可以跟之前只統(tǒng)計(jì)出現(xiàn)次數(shù),不考慮切分問題的排名做個(gè)對(duì)比:
(括號(hào)內(nèi)為頻數(shù))
通過分詞后的詞頻,我們發(fā)現(xiàn)《紅樓夢》中的人物戲份由多到少依次是寶玉、鳳姐、賈母、襲人、黛玉、王夫人和寶釵。然而,這個(gè)排名是有問題的,因?yàn)椤绷主煊瘛边@個(gè)詞的出現(xiàn)次數(shù)還有 267 次,需要加到黛玉的戲份里,所以其實(shí)黛玉的戲份比襲人多。同理,“老太太”一般是指賈母,所以賈母的戲份加起來應(yīng)該比鳳姐多。正確的排名應(yīng)該是寶玉、賈母、鳳姐、黛玉、襲人、王夫人和寶釵。
此外,我們還發(fā)現(xiàn)《紅樓夢》中的人物很愛笑,因?yàn)槌巳嗣酝獬霈F(xiàn)次數(shù)最多的單詞就是“笑道” : )
我把完整的詞頻表做成了一個(gè)網(wǎng)頁,感興趣的話可以去看一下:紅樓詞表 第二版
最后,我隨機(jī)選擇了詞頻表中的 200 項(xiàng)條目,用來估計(jì)其中有多少是真正的單詞。其中有 82 條是單詞:
而 118 條不是單詞:
也就是說,單詞的正確率只有 41 %。這比字典的準(zhǔn)確率還低,并沒有因?yàn)椴捎昧朔衷~算法而提高了正確率。不過這也可以理解,因?yàn)樯勺值涞臅r(shí)候我只考慮了出現(xiàn)次數(shù)大于 5 的片段,而分詞的時(shí)候有些單詞只出現(xiàn)了一次,所以難度確實(shí)應(yīng)該更大一些。
詞頻表中總計(jì)有 3.99 萬個(gè)條目。根據(jù)估算的詞頻表中正確單詞的比例,我估計(jì)《紅樓夢》的詞匯量大約是 1.6 萬。有人用其他程序估計(jì)《紅樓夢》的詞匯量是 0.45 萬(http://bbs.creaders.net/politics/bbsviewer.php?trd_id=344894),不過作者沒有描述詳細(xì)的統(tǒng)計(jì)方法,所以我對(duì)其結(jié)果非常懷疑,因?yàn)椤都t樓夢》中的單字就有 0.35 萬種了。
7 篩選特征詞
終于做完了分詞,又離目標(biāo)靠近了一大步。現(xiàn)在,我可以用之前看到的那篇文章里提到的 PCA 算法來分析章回之間的差異了。不過在此之前,我想先反思一下,到底應(yīng)該用哪些詞的詞頻來進(jìn)行分析?
在很多用 PCA 分析《紅樓夢》的博文里,大家都是用出現(xiàn)頻率最高的詞來分析的。然而問題是,萬一頻率最高的詞是和情節(jié)變化相關(guān)的呢?為了剔除情節(jié)變化的影響,我決定選出詞頻隨情節(jié)變化最小的單詞來作為每一章的特征。而我衡量詞頻變化的方法就是統(tǒng)計(jì)單詞在每一回的詞頻,然后計(jì)算標(biāo)準(zhǔn)方差。為了消除單詞的常用程度對(duì)標(biāo)準(zhǔn)方差的影響,我把標(biāo)準(zhǔn)方差除以該單詞在每一回的平均頻數(shù),得到修正后的方差,然后利用這個(gè)標(biāo)準(zhǔn)來篩選特征詞。
按照這個(gè)標(biāo)準(zhǔn),與情節(jié)最無關(guān)的 20 個(gè)詞是:
(括號(hào)內(nèi)為修正后的方差)
有趣的是,處在排名末尾的詞,也就是詞頻變化最大的詞,大部分都是人名:
可見這個(gè)篩選方法確實(shí)能去掉我們不想要的特征詞。
最終,我選擇了詞頻變化最小的 50 個(gè)詞作為特征,每個(gè)詞的修正后標(biāo)準(zhǔn)方差都小于 0.85。這 50 個(gè)詞如下:
8 主成份分析(PCA)
理論上,有了特征之后,我們就可以比較各個(gè)章節(jié)的相似性了。然而問題是,現(xiàn)在我們有 50 個(gè)特征,也就是說現(xiàn)在的數(shù)據(jù)空間是 50 維的,這對(duì)于想象四維空間都難的人類來說是很難可視化的。對(duì)于高維數(shù)據(jù)的可視化問題來說,PCA 是一個(gè)很好用的數(shù)學(xué)工具。
9.1 何謂是主成份分析
因?yàn)楦呔S的數(shù)據(jù)空間很難想象,所以我們可以先想象一下低維的情況。比如說,假設(shè)下圖中的每個(gè)點(diǎn)都是一個(gè)數(shù)據(jù),橫坐標(biāo)和縱坐標(biāo)分別代表兩個(gè)特征的值:
現(xiàn)在,如果我們讓 PCA 程序把這兩個(gè)特征壓縮成一個(gè)特征的話,算法就會(huì)尋找一條直線,使得數(shù)據(jù)點(diǎn)都投影到這條直線上后損失的信息最少(如果投影不好理解的話,可以想象用兩塊平行于直線的板子把數(shù)據(jù)點(diǎn)都擠壓到一條線上)。在這個(gè)例子中,這條線損失信息最少的線就是圖中較長的那個(gè)箭頭。這樣,如果我們知道了一個(gè)數(shù)據(jù)點(diǎn)在直線上投影的位置,我們就能大致知道數(shù)據(jù)點(diǎn)在壓縮之前的二維空間的位置了(比如是在左上角還是右下角)。
以上是把二維數(shù)據(jù)空間壓縮到一維的情況。三維壓縮到二維的情況也是類似的:尋找一個(gè)二維平面,使得數(shù)據(jù)點(diǎn)投影到平面后損失的信息最少,然后把所有數(shù)據(jù)點(diǎn)投影到這個(gè)平面上去。三維壓縮到一維就是把尋找平面改成尋找直線。更高維度的情況以此類推,雖然難以想象,但是在數(shù)學(xué)上是一樣的。
至于算法如何找到損失信息最少的二維平面(或者直線、三維平面等等),這會(huì)涉及到一些數(shù)學(xué)知識(shí),感興趣的同學(xué)可以去查找一下相關(guān)的數(shù)學(xué)公式和證明。這里只要把這個(gè)算法當(dāng)成一個(gè)黑箱就可以了。
9.2 重大發(fā)現(xiàn)?
現(xiàn)在我們可以利用 PCA,把五十個(gè)詞的詞頻所構(gòu)成的五十個(gè)維度壓縮到二維平面上了。我把壓縮后的數(shù)據(jù)點(diǎn)畫出來,發(fā)現(xiàn)是這個(gè)樣子的:
(圖中每個(gè)圓圈代表一個(gè)回目。圓圈內(nèi)是回目編號(hào),從 1 開始計(jì)數(shù)。紅色圓圈是 1-40 回,綠色圓圈是 41-80回,藍(lán)色圓圈是 81-120 回。)
80 回以后的內(nèi)容(藍(lán)色)大部分都集中在左下角的一條狹長的區(qū)域內(nèi),很明顯地和其他章回區(qū)分開來了!莫非《紅樓夢》的最后 40 回真的不是同一個(gè)作者寫的?!
別著急,分析還沒結(jié)束。PCA 的一個(gè)很重要的優(yōu)點(diǎn)就是,它的分析結(jié)果具有很強(qiáng)的可解釋性,因?yàn)槲覀兛梢灾烂恳粋€(gè)原始特征在壓縮后的特征(或者說成分)中的權(quán)重。從上圖中可以看到,后 40 回的主要區(qū)別在于成分二(component 2)的數(shù)值。因此我們可以看一看每一個(gè)詞的詞頻在成分 2 中的權(quán)重排名:
(括號(hào)內(nèi)為權(quán)重)
我發(fā)現(xiàn),“笑道”這個(gè)詞不僅是除了人名以外出現(xiàn)次數(shù)最多的單詞,而且在 PCA 結(jié)果中的權(quán)重也異常地高(0.88),甚至超過了“寶玉”的權(quán)重的絕對(duì)值(0.31)!為了搞明白這個(gè)詞為什么有這么大的權(quán)重,我把“笑道”的詞頻變化畫了出來:
(圖中橫坐標(biāo)是章回編號(hào),縱坐標(biāo)是“笑道”的詞頻)
可以發(fā)現(xiàn),“笑道”的詞頻是先增加再減少的,這不禁讓我聯(lián)想到了賈府興衰的過程。莫非“笑道”的詞頻和賈府的發(fā)展?fàn)顩r有關(guān)?有趣的是,“笑道”的詞頻頂峰出現(xiàn)在第 50 回左右,而有些人從劇情的角度分析認(rèn)為賈府的鼎盛時(shí)期開始于第 48、49 回,恰好重合:
《紅樓夢》之“釵黛合一”帶來大觀園鼎盛風(fēng)之子9881198198新浪博客
[轉(zhuǎn)載]白坤峰講紅樓夢(172)賈府鼎盛:該來的都來了史鼎說紅樓新浪博客
也許“笑道”這一看似平常的詞匯確實(shí)側(cè)面反應(yīng)了賈府的興衰史呢。雖然因果關(guān)系有待考證,不過想想也有一點(diǎn)道理,畢竟只有日子過的好的時(shí)候人們才會(huì)愛笑。
原文發(fā)布時(shí)間為:2017-09-22
本文作者:樓宇
本文來自云棲社區(qū)合作伙伴“Python中文社區(qū)”,了解相關(guān)信息可以關(guān)注“Python中文社區(qū)”微信公眾號(hào)
總結(jié)
以上是生活随笔為你收集整理的python红楼梦词频统计_用 Python 分析《红楼梦》(2)-阿里云开发者社区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 传智播客javascript视频教程(杨
- 下一篇: python123添加列表元素_Pyth