Saturday, March 12, 2022

發夢喺連登語料度抽出粵語詞

發夢夢到最近(二月中)有人 crawl 咗連登,所以我喺夢裡面就 download 咗啲 data 嚟玩。

因為發夢開發緊一部粵語詞典,所以就想睇下究竟仲有冇詞語漏咗未收錄。

話說官話(aka. 標準漢語)就好興雙字詞語嘅,好多「本身單字」嘅詞,官話都傾向配多隻字變成雙字詞語。例如:「玩」會變「玩耍」、「菜」會變「蔬菜」,甚至配唔到都會加返個「子」字,好似「肚」會變「肚子」。但粵語就比較多單字詞,喺語料庫發掘新詞,要判斷究竟係兩個單字詞咁啱黐埋一齊,定係一個雙字詞嚟。

呢樣嘢有時好難判斷,例如「偷圖」咁,係一個詞嚟,定係只不過係「偷+圖」?「初段」、「判罰」、「勝率」、「團長」呢? 呢啲係冇解嘅問題,基本上係靠主觀判斷。

咁,點樣由連登語料度發現新詞呢?最基本嘅方法,就係搵晒所有 bigram (兩個連接嘅單字),然後逐個去睇。香港中文常用字大概幾千個,所以所有 bigram 嘅可能性都唔算好多,一千萬左右啦。

好在實際上喺連登見到嘅 bigram 冇咁多,六百萬左右啦 :)

然後,你會發現,通用嘅詞彙唔會淨係出現一兩次,所以篩走啲極少出現嘅詞語之後,就淨返「只有」幾十萬個 bigram 要考慮 :) 



之後點算好呢?

有人可能會諗,不如淨係睇啲出現率高嘅 bigram 啦!

得唔得呢?睇下會係啲咩嚟:

實際上我哋搵到嘅詞彙係有幾高出現率呢?




(至於點解發夢會有 cap 圖?話說我有少少通靈能力,高科技問米呢家嘢⋯ [下刪千字])
(另外,乜呢啲唔係標準中文都有嘅詞嚟咩? 係呀,不過粵語或粵文會用到嘅都照樣收錄。)

所以一個通用嘅粵語詞語,喺連登度可能每個月只係見過幾次。單係用 frequency 基本上只係可以將潛在詞語降到幾十萬個 bigram,再篩就會開始將真詞都篩走埋。

咁仲有咩方法呢?

我哋留意到,frequency 最高嘅 bigram (見上圖) 大部份都係涉及極常見嘅單字,例如「係」、「唔」之類。直觀(intuitively)噉諗,一個 bigram 就算出現率高都未必係詞語,因為可能只係因為構成佢嘅單字本身出現率好高;反相,就算一個 bigram 出現率唔高,只要佢由出現率唔高嘅單字構成,都可能係真嘅詞彙嚟。

只要計算bigram 同佢所構成嘅單字嘅相對頻率,就可以知道佢係隨機結合,定係兩字之間有特別關連。

另一個觀察就係:有啲詞語會因為時間變遷而明顯變動。例如「大訴」呢個 bigram 嘅頻率,喺 2019 年忽然爆升。(至於點解?我呢個夢唔包呢啲嘢㗎,不如問下其他發夢嘅朋友?)但,唔止呢啲。最恐怖嘅係,連「女朋友」呢啲詞語都有 trend:


呢個現像真係「細思極恐」(按:內地潮語)。不過大家「看圖作文」之前,最好順手解釋埋呢個現像:



點解連登仔忽然正字正確?我到而家都唔明。

言歸正傳。我哋見到,有特定意思嘅 bigram,可能會因時間而變化。相反,唔係隨機黐埋嘅 bigram,理論上出現頻率都係隨機嘅,喺時間軸上大幅變動嘅機會較細。所以呢,睇埋bigram喺時間軸嘅標準差(standard deviation),可能會有啲用。

所以,我哋而家有呢啲關於 bigram 嘅數據:

  • mean / overall frequency
  • frequency standard deviation
  • left character mean frequency
  • right character mean frequency

如果我哋相信上面提及嘅 intuition 可以幫我哋判斷 bigram 係咪粵語詞,理論上我哋可以用上面啲數據砌一條公式出嚟,去估下某 bigram 係粵語詞嘅機率。由於粵典本身收錄咗三萬左右嘅雙字詞語,所以我哋可以睇住「答案」去砌公式嘅。

好!




⋯⋯ 其實,呢啲高深嘅數學,我平時清醒嗰陣都唔識,發緊夢點可能會識⋯⋯

所以!我決定搵幫手!




上面呢堆嘢,我發緊夢,都唔係好知係咩嚟。不過佢話我聽,有 ~80% 準確度。信不信由你啦,反正都係夢境嚟。 (按: fake_words 要小心咁抽幾萬個出嚟,有助提升「真.準確度」。自己諗點做啦,反正我都唔敢肯定我嘅做法最好。另外仲有以下口訣:mean value 要 take log,stdev 要除 mean)

話時話,之後我仲發咗個夢,夢裡面粵典提供埋單字嘅詞性。我喺每個 bigram 每種詞性變成 0.0 或 1.0 ,加埋落去 input vector 度,再 run 多次。準確度多咗幾 %。

攞住呢個 model,我就人手 validate 嘞 (input data 得三萬x2個咁珍貴,你唔撚係攞去做 validation 呀?!不要問,只要信!)。之前咪有幾十萬個 bigram 嘅?我將佢塞晒落去呢個 model 度,將 model 認為有 60+% 機會嘅 bigram 攞出嚟,再人手判斷佢哋係咪粵語詞。 (當然,已經收錄咗喺粵典嘅 bigram 就唔使再睇)

最後呢個 list 大概有一萬幾千個 bigram。

話說粵典本身收錄嘅詞都幾齊,尤其係有呢堆連登 data 之前,我就已經喺唔知邊度攞咗一份陳年連登corpus ( 真係唔知邊度嚟,搵唔返 source )。當時我用咗一啲超級 labour intensive 嘅方法去搵粵語詞,基本上只係比睇晒嗰幾十萬個 bigram 聰明少少。呢一年嚟斷斷續續夾埋做咗幾十(百?)小時,都補咗幾百個詞。所以,就算 model 話有 80% 準確度,gen 出嚟個 list 都有 99% 係 false positive。

我哋⋯ 真係搵緊滄海遺珠架。

去到最後,我睇晒嗰一萬幾千個 bigram,好似掘到百幾個粵語雙字詞出嚟。我一瞓醒,即刻去粵典 (words.hk) 加返搵到嘅詞彙!

我覺得呢場夢真係好有趣呀!你話係唔係?


題外話:啲專有名詞例如人名、地名、公司名,都排得好高㗎。對我哋嚟講係雜訊,不過可能對其他人嚟講,係好有用呢?