近期恒大主席許家印的報導很多 (Bloomberg, 2022a),但不懂中文的讀者相信一定在網上搜尋遇到不少問題,不但是姓氏排先 (last name first),更有多種不同的英文拼音。譬如在Google Translate輸入「許家印」,翻譯的英文是 Xǔjiāyìn,但若在彭博社十億富豪榜(Bloomberg Billionaires Index,Bloomberg, 2022b)裡找尋 Xu Jiayin,卻從頭到尾也找不到,原因是彭博社用香港獨有的中文名字廣東話羅馬拼音系統的拼音(港式拼音),許家印在排名榜中的英文名字為 Hui Ka Yan,最新排名第431 (圖1)。

圖1 彭博社十億富豪榜排名431的Hui Ka Yan,Bloomberg (29 January 2022) https://www.bloomberg.com/billionaires/

圖1 彭博社十億富豪榜排名431的Hui Ka Yan,Bloomberg (29 January 2022) https://www.bloomberg.com/billionaires/

誠然,讀者只要查查維基百科便可知道他的兩個英文拼音,但對自動識別人名系統而言,卻會帶來不少難題。傳統的解決辦法大多會建立一套中文名字在不同地區的拼音系統對照表,如圖2所示,以姓陳為例,內地拼音為Chen,香港拼音是Chan,新加坡則可以是Tan,韓文可變成Jin等。由於名字可以千變萬化,若要建立一套完整的資料庫,並持續維護,所需資源不少。

圖2 中文名字在不同地區的拼音例子。來源:Cheung, Chan, Li & Yiu (2021)

圖2 中文名字在不同地區的拼音例子。來源:Cheung, Chan, Li & Yiu (2021)

因此,有專家利用人工智能的機器學習中的RNN (遞迴神經網路RNN,Recurrent Neural Network) 開發出一套簡單易用的辨識中文名字的羅馬拼音地域的程式,最近我們 (Cheung, Chan, Li & Yiu, 2021) 利用這套《中文名字辨識系統》 (Chinese Names Classifer,CNC) 就內地和香港買家在香港樓市的價格差異進行研究,文章發表於風險及財務管理期刊 (JRFM) 的上期專題:機器學習在財經領域的應用 (Special Issue - Machine Learning Applications in Finance) 中,詳細內容可下載全文參考。本文集中介紹如何在Google Colab平台上使用RNN的神經網路辨識港式拼音。

甚麼是RNN

機器學習的主要系統是ANN人工神經網路,但對於有前紋後理的資料,ANN因為沒有記憶迴路設定而有所不足,RNN (遞迴神經網路,Recurrent Neural Network) 針對這一要求,在ANN加入記憶迴路,有助辨識有前紋後理的資料串,如名字、文章、樂章等等。(圖3)

圖3 RNN 遞迴神經網路。https://morioh.com/p/1bc305d7dbd

圖3 RNN 遞迴神經網路。https://morioh.com/p/1bc305d7dbd

中文名字拼音辨識系統 (Chinese Names Classifer)

首先,有關的RNN程式主要來自研究團隊的Chan (2022) 的Github開放程式,我把它改編到Colab平台使用,原來的程式可以辨識不同國家的名字或公司名,但需要自行提供資料訓練機器。本文只示範利用03_Example中的香港和內地兩套拼音辨識,有關的訓練資料也有提供。

1.下載訓練資料

首先,大家可在Chan (2022) 的Github中的Model中下載以下三個訓練資料檔案到你的Google Drive:

le.pkl

m1.h5

tokenizer.pkl

舉例,我在Google Drive中開了個Colab Notebooks/model/的Directory,把三個檔案存到這個Directory,以便以下的編程使用。

2.輸入各類程式單元

首先,請到https://colab.research.google.com/開啟一項新Colab Notebook,輸入以下程式單元的編碼,這些都是一些常用於機器學習的程式單元,不作詳解:

import pandas as pd
import tensorflow as tf
from sklearn import preprocessing
from tensorflow.python.client import device_lib
from keras.layers import Activation, Dense, Dropout, Input, Embedding, CuDNNLSTM, CuDNNGRU,  GlobalMaxPooling1D, GlobalAveragePooling1D, Reshape, Conv1D, MaxPooling1D
import sklearn.model_selection
from sklearn.model_selection  import train_test_split
import keras
import numpy as np
import os
import keras
import pickle

3.安裝Google Drive及GPU

輸入以下編碼,主要是安裝Drive及keras model,另請安裝GPU (用Edit - Notebook Settings - Hardware Accelerator):

from google.colab import drive

drive.mount('/content/drive')

with open('/content/drive/My Drive/Colab Notebooks/model/tokenizer.pkl' , 'rb') as f:

tokenizer = pickle.load(f)

GRU_model = keras.models.load_model('/content/drive/My Drive/Colab Notebooks/model/m1.h5')

with open('/content/drive/My Drive/Colab Notebooks/model/le.pkl' , 'rb') as f:

le = pickle.load(f)

4.進行訓練

import numpy as np
def proc_x(x, tokenizer):
   tensor = tokenizer.texts_to_sequences(x)
   tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor,padding='post',maxlen=50)
   return tensor


def predict_name(name, model, tokenizer,le, max_len=50):
   fit = le.classes_[np.argmax(model.predict( proc_x(name, tokenizer) ), axis=1)]
   return pd.DataFrame({'name':name, 'prediction':fit})

5.使用

以下輸入Hui Ka Yan 和 Xu Jiayin測試程式能否辨識出那一個名字是港式拼音:

predict_name(["HUI KA YAN","XU JIAYIN"], GRU_model, tokenizer, le, max_len=50)

6.結果

|0|HUI KA YAN|HK|

|1|XU JIAYIN|ML|

程式能自動辨識出Hui Ka Yan 是港式拼音,而Xu Jia Yin 是內地拼音,大家可以試試輸入不同的港式(HK)和內地(ML)拼音,測試系統的準確性。當然,也有些名字拼音是兩地皆可,程式未必能夠分辨出來。譬如當輸入Mei Mei,程式辨識為內地拼音,但也有可能是港式拼音。

若在編程時遇到困難,可參考以下的Youtube短片,逐步試驗。

參考:

Chan, T.K. (2022) Chinese Names Classifier, Github, 15 January. https://github.com/ctszkin/Chinese-names-classifier

Cheung, K.S., Chan, J.T., Li, S. & Yiu, C.Y. (2021) Anchoring and Asymmetric Information in the Real Estate Market: A Machine Learning Approach, Journal of Risk and Financial Management, 14(9), 423. https://doi.org/10.3390/jrfm14090423

Bloomberg (2022a) How Evergrande Became China’s Biggest Financial Headache, Youtube, Jan. 28. https://youtu.be/OABQT3gyYmA

Bloomberg (2022b) Bloomberg Billionaires Index, 29 January. https://www.bloomberg.com/billionaires