基於方言之間的預測相似度進行方言聚類

語言: CN / TW / HK

問題

去年,我在 基於自編碼器的方言祖語音系嵌入 中嘗試根據某個字在多個方言點中的讀音對字進行聚類,實際上,由於這些讀音構成了以字為行、以方言點為列的矩陣,一個自然的推廣就是用類似的方法對方言點也進行聚類,藉助聚類的結果輔助考察方言之間的親緣關係。

但是方言點和字音不同的是,方言之間相似不一定藴含方言字音之間相同或相似。舉個極端的情況,如果 a 方言讀 x 的字在 b 方言無例外都讀 y,同時 a 方言讀 y 的字在 b 方言無例外都讀 x,從表面的音值看 a、b 兩種方言是截然相反的,但是在音類上卻極其相似,因為兩者可以通過非常簡單的規則相互推導出來。

甚至有時這種音值的差異不是方言語音本身造成的,而僅僅是不同來源的材料處理的偏好不同造成的。比如廣州和湛江的方言相當接近,兩者都有一套噝音,這套噝音在不同的人、不同的條件有不同的變體,由於記音寬嚴的差別,或者由於其他音系以外的因素,《珠江三角洲方言調查報告》把廣州的噝音記成 s,而《粵西湛茂地區粵語語音研究》把湛江對應的噝音記成 ʃ。如果不加處理地直接對比原始字音,其結果就是大量的字音不同,從而得出廣州和湛江的方言差異很大的結論。這是比較方法以外的、材料層面的因素對分析結果造成的影響,必須先行消除。

數學描述

方言比較關心的是音類而非音值的相關性。具體地説,一個方言的 音類 可以表示成由若干個等價類構成的集合

每個等價類 是字的集合,同類的所有字都同音。 所謂同音,是指方言的字音可以表示為從字集合到音節集合的映射

或寫成函數的形式

其中 為所有方言字的集合, 為方言所有音節的集合。如 。一組字在某個方言的同音關係上構成等價類,是指這些字通過該方言的上述映射函數都映射到相同音節

這些等價類構成了對方言字集合 的一個 劃分 ,只與映射函數的關係有關,而與映射結果的具體值無關。如果方言 a 的所有音類劃分和方言 b 相同, ,則説 a 音類和 b 音類相同,方言的具體音值不影響比較結果。

需要説明的是上文的描述及下文的討論中提到的 並不是指字符層面的漢字,而是指隱含在漢字表面下的不可拆分的字音單位,對漢語來説,通常對應於一個單音節語素。之所以需要做這麼細微的區分是因為存在一字多音的情況,有些多音字對應了不同的義項,這些是大部分方言共有的,還有一些方言中的一字多音是由於存在多個語音層次造成的。確定 a 方言的某個字某個音對應於 b 方言的哪個字哪個音,或簡單地稱之為字音對齊,是一項極其繁瑣的工作,這裏不再展開。

相似度計算方法

上文通過字音映射函數以及集合劃分定義了方言音類,在此基礎上,在 的情況下,怎樣度量 的相似性呢?一種角度是概率分佈的觀點。在概率觀點下,音值 作為隨機變量形成了一個離散的分佈,其概率函數為

其中 取平均分佈

對於確定的字音映射函數來説

在上述模型下,方言 a 和 b 音類的相似度表現為音值的條件分佈,極端情況下,如果 a 方言的 x 總是對應 b 方言的 y,則 ,反之亦然。 最簡單的方法是使用 的共現頻率來估計條件概率。

條件熵

@王贇 Maigo 在 9978 方言音系/韻母“存古度”的一種定量描述 中提出了一種使用條件熵來度量方言之間的這種分佈相似度的方法。 條件熵(conditional entropy) 量化了隨機變量 的出現為隨機變量 提供了多少確定性。

越小, 預測 的能力越強。

條件熵是單向的,即 。這很好理解,a 方言能推導 b 方言,反過來不一定成立。為了得到對稱性,使用

作為 a、b 方言之間的距離。對此直觀的解釋是,如果 a 方言可以預測 b 方言,同時 b 方言也可以預測 a 方言,那麼這兩種方言是相似的。條件熵作為距離有一個很好的性質

即任一方言到它自己的距離為0。

在實際操作中,統計的粒度細到音節會使統頻率數據過於稀疏,降低結果可信度,比如説某個音節轄字極少,其中某個字由於偶然的原因讀音不規則,或者僅僅由於使用的材料沒有收錄某個字的讀音,都會大大影響統計出的概率。為了提高結果健壯性,對條件熵 切分為聲母、韻母、聲調作一些近似,把 拆分成聲母、韻母、聲調的三元組 分別計算條件熵。

上式最後一步的近似的考慮為,存在這樣一種情況,a 方言的聲母不能預測 b 方言的聲母,但是 a 方言的聲母加韻母、或者聲母加聲調能預測 b 方言的聲母,只統計聲母之間的條件熵會這種預測能力抹殺掉。例如廣州的 p 對應上海的 p、b,單獨根據廣州的 p 不能預測上海是 p 還是 b,但是再增加考慮聲調是陰調還是陽調其實是可以預測的。基於這一點,分別統計 a 方言聲母和韻母、聲母和聲調聯合分佈對 b 方言聲母的條件熵,取其中較小者。

為例

其中 分別表示字到聲母、韻母的映射函數。上式的條件概率可以通過統計樣本的頻率估算得到。

卡方檢驗

本質上,上述方法中的互信息量度量的是方言之間預測的能力,因此可以嘗試使用其他度量指標來代替,比如説特徵選擇中用的比較多的 卡方檢驗(chi-square test) 。卡方檢驗的思路是假設 是獨立隨機變量,由此它們分組統計共現得到的 統計量符合自由度為 的卡方分佈

其中 表示每組期望出現的頻次,一般通過統計頻率估計, 表示實際觀察到的頻次,自由度 由分組數量得到。然後根據卡方分佈的累積分佈函數計算 對應的剩餘概率 , 越大, 越小,説明實際情況偏離假設越多, 越不可能相互獨立,或者反過來説, 越相關。

理論上説,由於不同方言對的自由度 不同,在進行方言之間相似度比較時,應該比較置信度 而不是直接比較 值。但由於方言之間的相關性足夠顯著,即使差別很大的方言之間也是如此,統計出來的 值普遍很大,導致對應的 值下溢為0,無法使用。另一方面這些 的自由度 也足夠大,根據卡方分佈的定義及中心極限定理,當 趨向正無窮時, 趨向於高斯分佈

標準化之後

從而允許比較 值的大小,方言之間的 值越大,表明越相似。

為了降低統計數據的稀疏性,採用和條件熵類似的、 分聲母、韻母、聲調統計 $\chi^2$ 的處理方法。所不同的是,卡方檢驗對於 是對稱的。為了保持這種對稱性,在拆分統計共現矩陣的時候對 的處理也是對稱的,即統計 a 方言的聲母韻母組合、和 b 方言的聲母韻母組合的共現矩陣的 值,如此類推。最後取所有 值的平均。

由此,方言兩兩之間的 值組成了方言之間的相似度矩陣 ,該矩陣經過一定的變換可以得到和條件熵相似的距離矩陣。

數據

以下統計分析使用 中國語言資源保護工程採錄展示平台 的漢語方言字音數據,使用其中的方言老男單字音。共1287個方言點,每點收錄1000個單字音,有些點一個字有多個音,有些點個別字缺數據。

數據概覽:

方言點數 單字數 記錄數
1287 1004 1341693

廣州的數據樣例:

iid finals initial tone name
0001 ɔ t 53
0002 ɔ th 53
0003 ai t 22
0004 ɔ l 21
0005 ɔ 35

對於方言中一字多音的情況,只取每個字在該方言的第一個讀音,由於語保的數據格式規範,實際通過字 ID 做了字級別的對齊,而且往往把白讀排在文讀的前面,這樣簡單處理對結果的影響較小。

相似度結果

條件熵

對上述方言兩兩一對使用上述卡方統計計算相似性,得到1278 × 1278的相似度矩陣和距離矩陣。對歸一化的相似度矩陣分別使用 SVD、spectral embedding 和 t-SNE 降維,結果如下圖所示,方言點在圖中的距離越近表示越相似。

漢語方言條件熵降維散點圖

下圖是從中抽樣100個方言點的距離矩陣熱度圖。

抽樣100方言條件熵相似度距離熱度圖

把上述 spectral embedding 降維的結果映射到 CIE L*a*b 色度,然後標註在地圖上,就得到方言相似度地圖,方言點的顏色越接近表示越相似。

漢語方言相似度地圖條件熵

卡方相似度

漢語方言卡方相似度降維散點圖
抽樣100方言卡方距離熱度圖

方言聚類

得到方言點之間的相似度或距離矩陣之後,就可以對該矩陣實施各種聚類算法。由於矩陣不代表方言點在歐氏空間中的位置,因此常用的 K-means 算法不適用。但是可以把該矩陣看成圖的鄰接矩陣,因此可以應用各種針對圖的聚類算法。

下文主要描述根據條件熵計算的聚類結果,只在結果差異較大的時候,適當補充一些根據卡方相似度聚類的結果。需要説明的是,統計的方法受數據擾動影響較大,由於對原始方言讀音數據進行了一次較大的清洗修正,部分聚類的結果對比之前放出的版本有較大不同。

條件熵

AP 聚類

首先嚐試對原始的相似度矩陣實施 AP 聚類(affinity propagation) ,但效果不理想,結果就不放出來了。

譜聚類

譜聚類(spectral clustering) 的思想是先把相似度矩陣表示的樣本間相似度分解到低維的向量空間,再針對降維後的樣本應用 K-means 等基於樣本座標的聚類算法。 使用歸一化的相似度矩陣進行譜聚類,設置聚類數量為10,所得結果在不同的降維方法下表示如下圖。

漢語方言譜聚類降維散點圖條件熵10類

聚類的結果在地圖上的分佈如下圖。

漢語方言譜聚類地圖條件熵10類

從圖中可以看到,聚類的結果總體體現了主流意見對漢語方言的分類,幾大方言區的邊界大致都落在聚類的邊界上。在劃分方言區的同一層級也劃分了官話的大區,一些邊界也和主流的劃分一致。所不同的有以下幾點:

  1. 雷瓊閩語單獨分為一類,其他閩語為另一類
  2. 贛語和客家話合為一類
  3. 長江中游的湘語、一部分西南官話、一部分江淮官話、以及一部分贛語組成一個大類
  4. 晉語從北方官話分出,但又和江淮官話合併了,少量應該是保留入聲的西南官話也歸這一類
  5. 北方官話分為兩類,一類大致就是中原官話加藍銀官話,另一類包含了北京官話、東北官話、冀魯官話和膠遼官話,但兩類的邊界不完全和傳統分區重合

一些更細微的觀察:

  1. 無論桂南平話還是桂北平話都沒有分立,歸入粵語同一類
  2. 湘南粵北土話大部分歸入湘語一類,一部分歸客家話,少數歸粵語
  3. 通泰歸北吳

層次聚類

從傳統觀點來看,方言之間的親緣關係是樹狀的,因此更適合使用層次聚類。 層次聚類(hierarchical clustering) 每次按樣本的距離和計算子樹間距離的方法,取距離最小的兩棵子樹合併,直到所有樣本合併為一類。由此生成的結果是樹狀圖,樹狀圖可以直觀地表示出方言在什麼層級被分開到不同的子樹。層次聚類和樹狀圖的不便之處是當方言數量很多的時候樹狀圖會非常龐大,而且通常各個分支下面的方言數量會非常懸殊,不便於查看。

需要注意的是層次聚類的結果不能直接等同於方言譜系樹,層次聚類的依據是方言之間的距離而不是歷史上的親緣關係。雖然在計算方言相似度和距離時謹慎地消除了具體音值的影響,但方言音類相似度和親緣關係之間的相關性還沒經過嚴格檢驗,特別是存在方言接觸產生的影響,使得相似度計算的結果和真實的親緣關係不相稱。因此在檢驗了具體方言的音類細節之前,層次聚類的結果只是作為參考。

對距離矩陣實施層次聚類,最開始分出來的是湘西南、桂東北的一些很小的分支,以及零星的單點方言,第一次分離的大分支是閩語和非閩語。截取樹狀圖的最根部如下圖:

漢語方言樹狀圖條件熵

較早區分閩語和非閩語這一點符合部分學者認為閩語和其他方言關係較遠的觀點。然後非閩語在分出了徽語等較小的分支之後,其主體部分分成了南北兩大支,南支包含吳語、大部分贛語、客家話、粵語和平話,另一支則依次分出一小部分贛語、湘語、一小部分江淮官話,最終官話的主體和晉語,超過樣本半數的方言點,全部擠在剩餘的一個末端分支上。

下面是根據樹狀圖分成64類的降維散點圖和地圖,在這個層級上,各大類大致沿着傳統分區的邊界劃分,官話和晉語為一類,贛語、客家話、粵語、平話為一類,吳語為一類,而閩語已經細分到方言片一級了。

漢語方言層次聚類降維散點圖條件熵64類
漢語方言層次聚類地圖條件熵64類

舉其中方言數較少而分支比較豐富的閩語為例,下圖是閩語方言之間的距離熱度圖:

漢語方言距離熱度圖條件熵閩語

閩南語和閩東語分別構成了兩個大聚類中心,閩南內部的潮汕、漳州又構成了次一級的中心。而內陸閩語和雷瓊閩語雖然數量也不少,但是和其他閩語的距離較遠,內部相互也不集中。

下面的樹狀圖和聚類地圖也反映了這種情況,在樹狀圖上,雷瓊閩語很早就分出來,然後依次是閩中和莆仙。剩餘的主體分成閩南和閩東兩大支,閩南語中比較大的子羣有泉州和廈門、漳州、潮汕。較低層級的大子羣大致對應了歷史上大的行政中心,比如福州、泉州、漳州、潮州。

漢語方言樹狀圖條件熵閩語

下圖是上述樹狀圖分成10類的地圖,可見在總的樹狀圖較小的分支上,仍然表現出了馬太效應,在其他閩語已經分得比較細碎的層級上,閩南、閩東和莆仙還沒有從沿海閩語分出來。

漢語方言層次聚類地圖條件熵閩語10類

再舉規模較大的官話為例,官話的雛形分出來之後,又經過了很多層級的分化才顯得比較均衡的樣子,之前一直是一支獨大。這時南方官話、北方官話、較早就單獨分為一支的長江中游的官話、以及在不同層級分出來的幾支晉語在樹狀圖中才初具規模,而從樹根到這些分支的共組已經經過了6次分化,每次分為10類。

漢語方言樹狀圖條件熵官話

下圖是在官話主體的樹狀圖又往下一個層級分10類得到的地圖,這樣各類的數量才顯得均衡一點。

漢語方言層次聚類地圖條件熵官話10類

江淮官話除一部分已經在早前分出以外,剩餘的部分這時仍然和西南官話合為一類。北方除了一部分晉語已經先一步分出,剩餘的晉語也在這一層分出為一類,膠遼官話也單獨分為一類,剩餘包括傳統分區的北京官話、東北官話、冀魯官話、膠遼官話、中原官話、蘭銀官話,在這個層級仍然合在一大類。值得一提的是,此後又經過了4次、總共11次分化,北京官話和東北官話才開始分離,按本文的相似度度量方法來看,傳統分區在大區一級劃分北京官話和東北官話確實過分苛細了。

最後是包含大多數南方漢語的一支,這一支作為一個整體較早從非閩語中分離,包括傳統的吳語、大部分贛語、客家話、粵語和平話。下圖是這一支的樹狀圖:

漢語方言樹狀圖條件熵吳贛客粵語

雖然樹狀圖顯示從這一支分離的順序依次為吳語、粵語,最後是贛語和客家話,但它們分離的節點非常接近,可以認為是相互非常獨立的分支。。粵語首先分出粵北的零星方言點和桂北平話,然後是四邑片,剩餘的主體部分分成兩支,一支是桂南平話和部分勾漏片,另一支包括大部分狹義的粵語。客家話首先分出四川、重慶等地的方言島,然後是江西、福建的幾支本地客家話,然後是東江本地話,剩餘的部分其主要分支即為核心客家話。

根據樹狀圖分10類得到的地圖反映出吳、贛客、粵平三分的情況。

漢語方言層次聚類地圖條件熵吳贛客粵語10類

卡方相似度

譜聚類

使用卡方相似度進行譜聚類的結果如下圖:

漢語方言譜聚類地圖卡方10類

和條件熵差別較大的地方有如下幾點:

  1. 北方官話和晉語合在一起分兩大類,西邊的一類包括晉語、中原官話西邊的部分、和蘭銀官話,東邊的一類包括北京官話、東北官話、冀魯官話、膠遼官話、和中原官話東邊的部分。
  2. 贛語、湘語、以及長江中游的一部分官話合併成了一個大類。

層次聚類

使用卡方距離的層次聚類倒是把沿海閩語和內陸閩語都歸在了一類,但內陸閩語仍然非常早就和沿海閩語分開,緊接着分出的是雷瓊閩語。從距離熱度圖也可以看出,這兩類和其他閩語的相似度非常低。

漢語方言距離熱度圖卡方閩語
漢語方言樹狀圖卡方閩語
漢語方言層次聚類地圖卡方閩語10類

官話上的層次聚類結果和條件熵差別較大,膠遼官話最先分出,然後是西北地區的一部分蘭銀官話。除此以外,在如下地圖的層級上,剩餘的北方官話更早地分成了東西兩大類,而南方官話還是合而不分。

漢語方言樹狀圖卡方官話
漢語方言層次聚類地圖卡方官話10類

不足及改進

相似度計算的不足

在計算方言之間相似度的時候,為了平衡數據準確性和平滑性,做了很多瑣碎的處理,這些處理還沒有得到嚴格的證明。更好的辦法是找到平滑的、最好是參數化的方法來估計 ,但是這樣通常會增加計算方言對的耗時。

在計算 時假設每個字的出現是等概率的,或者説每條樣本對期望的貢獻一樣大,實際情況不是這樣的。特別是在對比不同來源的材料時,不同材料調查記錄的字集可能會很不同,是否包含數量較多的非常用字會對統計結果有較大影響。處理這個問題的困難在於,反映方言用字頻率的語料非常稀缺。另一方面,在統計兩個方言相似度時,應該怎樣摺合兩個方言的字頻呢?

文章開頭已經提到了字音對齊的困難,即確定 a 方言的某個字某個音對應 b 方言的哪個字哪個音不是一件顯而易見的事情,這個問題不僅出現在一字多音的情況,而且出現在有音無字、或者不同方言用了不同俗字借字的情況。在進行詞彙級別的對比的時候就更是如此。本文通過簡單地取每個字的第一個讀音迴避了這個問題。改進思路是採用迭代的方法啟發式地尋找跨方言的字音對應,這是一項龐大的工作,做完這一步,所有方言的音變規律基本也都找到了。

聚類的不足

上文已經指出聚類的結果不能等同於方言歷史上的發生關係,但是仍然希望聚類的結果對方言譜系樹有一定的啟示。當前的方法無論從理論還是從聚類結果顯示的一些情況來説,對這方面的支持還很欠缺。

本文使用的聚類方法只是沿用了常規算法對距離的簡單處理,並沒有對方言的生成過程建模。方言相似並不等於同源,在分析方言譜系的時候,一些方面的區別比另一些更加核心和本質,這些因素不一定能通過總體的相似度表現出來。例如羅傑瑞在《What is a Kejia Dialect?》中深有見地地指出,客家話鼻流音調類兩分,可以和閩語的表現關聯,應能追溯到共同祖語的清鼻流音。憑這一點,客家話應該很早就和贛語分開。但是這個特徵體現的字不夠多,被其他大量客家話和贛語的共同點所掩蓋,其結果是譜聚類把贛語和客家話分了在一類。

方言音類相似也可能是由共同存古造成的,另一方面,由於語言接觸引起的共同創新,和較小概率的音變巧合,音類相似在反映共同創新上也不太可靠。上面譜聚類的結果把晉語和江淮官話歸為一類,可能就是因為它們都存古保存了入聲,並且在入聲韻、調的簡併方面巧合了。層次聚類在處理晉語和官話的關係的時候,把通常認為的晉語分了三大批次從官話中分離出來,而不是作為一個整體一次分出,可能就是因為接觸趨同影響了方言之間的相似性,而不是因為通常認為的晉語在來源上真的不統一。

反之當語言接觸引起的借用深到一定程度,會造成邊界位置的方言距兩邊的距離都較遠,從而被層次聚類錯誤地安排在較頂層的分支。層次聚類最開始分出來的都是湘桂交界一帶的方言,每支都只有一兩個點,很難説每個方言都古老且獨立,也可能是周邊的方言以各種不同的方式借用混合,從而產生了多種多樣和周邊都不同的方言。

改進方向

本文度量方言相似度的方法只考慮了音類,音類在方言比較上很重要,但有時對比音值的相似性也是有意義的。鑑於音標代表的音值是離散值不便度量相似度或距離,因此首先要建立把音值映射到連續空間的方法。我在 基於自編碼器的方言祖語音系嵌入 中提出了一種音系 embedding 的方法,實際上,考慮音值的語音學特徵,應該能得到更有代表性的方法。獲得了音值的連續表示之後,度量方言之間音值的距離,以及根據音值距離聚類,可以參考上面的方法修改而來。

另一個方向是方言音類的連續表示。本文用非參數化的方法構造了方言之間的相似度矩陣 ,即隱含假設了一個方言音類的連續空間

方言音類矩陣 的行數為方言點數,每一行為該方言在連續空間的向量表示。SVD 降維結果是這個音類矩陣在低維的投影,spectral embedding 則是另一種非線性變換的投影。既然字和方言點分別是字音矩陣的行和列,既然字的 embedding 是可行的,那麼方言點的參數化 embedding 應該也是可行的。經過細緻設計和訓練,應該能找到一個非線性的矩陣分解映射函數 ,以及最優的字矩陣 、方言矩陣 ,使得

即通過字 embedding 和 方言 embedding 最大限度地還原字音矩陣。幸運的話,字 embedding 能表徵字的相似度,方言 embedding 能表徵方言的相似度,那麼, 和 就可以直接拿來比較和聚類。

另一個考慮的角度是相似度矩陣構成了一個圖的鄰接矩陣,原始的相似度對應於有向圖,規範化的相似度對應於無向圖。在此基礎上可以嘗試各種圖算法,特別是把圖的頂點或子圖映射到連續空間的 圖嵌入(graph embedding) 算法。

代碼

代碼託管在 GitHub,也備份了一份在 Gitee。所有分析過程和圖表都在其中的 Jupyter notebook,由於部分算法的隨機性,更新後的 notebook 內容主要是地圖配色和本文有細微差別,但本質是一樣的。