6 詞頻統計
完成分詞以后,詞頻統計就非常簡單了。我們只需要根據分詞結果把片段切分開,去掉長度為一的片段(也就是單字),然后數一下每一種片段的個數就可以了。
這是出現次數排名前 20 的單詞:
(括號內為頻數)
可以跟之前只統計出現次數,不考慮切分問題的排名做個對比:
(括號內為頻數)
通過分詞后的詞頻,我們發現《紅樓夢》中的人物戲份由多到少依次是寶玉、鳳姐、賈母、襲人、黛玉、王夫人和寶釵。然而,這個排名是有問題的,因為”林黛玉”這個詞的出現次數還有 267 次,需要加到黛玉的戲份里,所以其實黛玉的戲份比襲人多。同理,“老太太”一般是指賈母,所以賈母的戲份加起來應該比鳳姐多。正確的排名應該是寶玉、賈母、鳳姐、黛玉、襲人、王夫人和寶釵。
此外,我們還發現《紅樓夢》中的人物很愛笑,因為除了人名以外出現次數最多的單詞就是“笑道” : )
我把完整的詞頻表做成了一個網頁,感興趣的話可以去看一下:紅樓詞表 第二版
最后,我隨機選擇了詞頻表中的 200 項條目,用來估計其中有多少是真正的單詞。其中有 82 條是單詞:
而 118 條不是單詞:
也就是說,單詞的正確率只有 41 %。這比字典的準確率還低,并沒有因為采用了分詞算法而提高了正確率。不過這也可以理解,因為生成字典的時候我只考慮了出現次數大于 5 的片段,而分詞的時候有些單詞只出現了一次,所以難度確實應該更大一些。
詞頻表中總計有 3.99 萬個條目。根據估算的詞頻表中正確單詞的比例,我估計《紅樓夢》的詞匯量大約是 1.6 萬。有人用其他程序估計《紅樓夢》的詞匯量是 0.45 萬(http://bbs.creaders.net/politics/bbsviewer.php?trd_id=344894),不過作者沒有描述詳細的統計方法,所以我對其結果非常懷疑,因為《紅樓夢》中的單字就有 0.35 萬種了。
7 篩選特征詞
終于做完了分詞,又離目標靠近了一大步。現在,我可以用之前看到的那篇文章里提到的 PCA 算法來分析章回之間的差異了。不過在此之前,我想先反思一下,到底應該用哪些詞的詞頻來進行分析?
在很多用 PCA 分析《紅樓夢》的博文里,大家都是用出現頻率最高的詞來分析的。然而問題是,萬一頻率最高的詞是和情節變化相關的呢?為了剔除情節變化的影響,我決定選出詞頻隨情節變化最小的單詞來作為每一章的特征。而我衡量詞頻變化的方法就是統計單詞在每一回的詞頻,然后計算標準方差。為了消除單詞的常用程度對標準方差的影響,我把標準方差除以該單詞在每一回的平均頻數,得到修正后的方差,然后利用這個標準來篩選特征詞。
按照這個標準,與情節最無關的 20 個詞是:
(括號內為修正后的方差)
有趣的是,處在排名末尾的詞,也就是詞頻變化最大的詞,大部分都是人名:
可見這個篩選方法確實能去掉我們不想要的特征詞。
最終,我選擇了詞頻變化最小的 50 個詞作為特征,每個詞的修正后標準方差都小于 0.85。這 50 個詞如下:
8 主成份分析(PCA)
理論上,有了特征之后,我們就可以比較各個章節的相似性了。然而問題是,現在我們有 50 個特征,也就是說現在的數據空間是 50 維的,這對于想象四維空間都難的人類來說是很難可視化的。對于高維數據的可視化問題來說,PCA 是一個很好用的數學工具。
9.1 何謂是主成份分析
因為高維的數據空間很難想象,所以我們可以先想象一下低維的情況。比如說,假設下圖中的每個點都是一個數據,橫坐標和縱坐標分別代表兩個特征的值:
現在,如果我們讓 PCA 程序把這兩個特征壓縮成一個特征的話,算法就會尋找一條直線,使得數據點都投影到這條直線上后損失的信息最少(如果投影不好理解的話,可以想象用兩塊平行于直線的板子把數據點都擠壓到一條線上)。在這個例子中,這條線損失信息最少的線就是圖中較長的那個箭頭。這樣,如果我們知道了一個數據點在直線上投影的位置,我們就能大致知道數據點在壓縮之前的二維空間的位置了(比如是在左上角還是右下角)。
以上是把二維數據空間壓縮到一維的情況。三維壓縮到二維的情況也是類似的:尋找一個二維平面,使得數據點投影到平面后損失的信息最少,然后把所有數據點投影到這個平面上去。三維壓縮到一維就是把尋找平面改成尋找直線。更高維度的情況以此類推,雖然難以想象,但是在數學上是一樣的。
至于算法如何找到損失信息最少的二維平面(或者直線、三維平面等等),這會涉及到一些數學知識,感興趣的同學可以去查找一下相關的數學公式和證明。這里只要把這個算法當成一個黑箱就可以了。
9.2 重大發現?
現在我們可以利用 PCA,把五十個詞的詞頻所構成的五十個維度壓縮到二維平面上了。我把壓縮后的數據點畫出來,發現是這個樣子的:
(圖中每個圓圈代表一個回目。圓圈內是回目編號,從 1 開始計數。紅色圓圈是 1-40 回,綠色圓圈是 41-80回,藍色圓圈是 81-120 回。)
80 回以后的內容(藍色)大部分都集中在左下角的一條狹長的區域內,很明顯地和其他章回區分開來了!莫非《紅樓夢》的最后 40 回真的不是同一個作者寫的?!
別著急,分析還沒結束。PCA 的一個很重要的優點就是,它的分析結果具有很強的可解釋性,因為我們可以知道每一個原始特征在壓縮后的特征(或者說成分)中的權重。從上圖中可以看到,后 40 回的主要區別在于成分二(component 2)的數值。因此我們可以看一看每一個詞的詞頻在成分 2 中的權重排名:
(括號內為權重)
我發現,“笑道”這個詞不僅是除了人名以外出現次數最多的單詞,而且在 PCA 結果中的權重也異常地高(0.88),甚至超過了“寶玉”的權重的絕對值(0.31)!為了搞明白這個詞為什么有這么大的權重,我把“笑道”的詞頻變化畫了出來:
(圖中橫坐標是章回編號,縱坐標是“笑道”的詞頻)
可以發現,“笑道”的詞頻是先增加再減少的,這不禁讓我聯想到了賈府興衰的過程。莫非“笑道”的詞頻和賈府的發展狀況有關?有趣的是,“笑道”的詞頻頂峰出現在第 50 回左右,而有些人從劇情的角度分析認為賈府的鼎盛時期開始于第 48、49 回,恰好重合:
《紅樓夢》之“釵黛合一”帶來大觀園鼎盛風之子9881198198新浪博客
[轉載]白坤峰講紅樓夢(172)賈府鼎盛:該來的都來了史鼎說紅樓新浪博客
也許“笑道”這一看似平常的詞匯確實側面反應了賈府的興衰史呢。雖然因果關系有待考證,不過想想也有一點道理,畢竟只有日子過的好的時候人們才會愛笑。
原文發布時間為:2017-09-22
本文作者:樓宇
本文來自云棲社區合作伙伴“Python中文社區”,了解相關信息可以關注“Python中文社區”微信公眾號