Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
executable file 698 lines (687 sloc) 16.9 KB
#!/usr/bin/python
import sys
chinese_name_list = set([
'ba', 'pa',
'bo', 'po',
'bai', 'pai',
'bei', 'pei',
'bau', 'pao',
'ban', 'pan',
'ben', 'pen',
'bang', 'pang',
'beng', 'peng',
'bi', 'pi',
'bie', 'pie',
'biau', 'piao',
'bian', 'pien',
'bin', 'pin',
'bing', 'ping',
'bu', 'pu',
'pa', 'pa',
'po', 'po',
'pai', 'pai',
'pei', 'pei',
'pau', 'pao',
'pou', 'pou',
'pan', 'pan',
'pen', 'pen',
'pang', 'pang',
'peng', 'peng',
'pi', 'pi',
'pie', 'pieh',
'piau', 'piao',
'pian', 'pien',
'pin', 'pin',
'ping', 'ping',
'pu', 'pu',
'ma', 'ma',
'mo', 'mo',
'mai', 'mai',
'mei', 'mei',
'mau', 'mao',
'mou', 'mou',
'man', 'man',
'men', 'men',
'mang', 'mang',
'meng', 'meng',
'mi', 'mi',
'mie', 'mieh',
'miau', 'miao',
'miou', 'miu',
'mian', 'mien',
'min', 'min',
'ming', 'ming',
'mu', 'mu',
'fa', 'fa',
'fo', 'fo',
'fei', 'fei',
'fou', 'fou',
'fan', 'fan',
'fen', 'fen',
'fang', 'fang',
'feng', 'feng',
'fu', 'fu',
'da', 'ta',
'de', 'te',
'dai', 'tai',
'dei', 'tei',
'dau', 'tao',
'dou', 'tou',
'dan', 'tan',
'dang', 'tang',
'deng', 'teng',
'di', 'ti',
'die', 'tieh',
'diau', 'tiao',
'diou', 'tiu',
'dian', 'tien',
'ding', 'ting',
'du', 'tu',
'duo', 'to',
'duei', 'tui',
'duan', 'tuan',
'duen', 'tun',
'dung', 'tung',
'ta', 'ta',
'te', 'te',
'tai', 'tai',
'tau', 'tao',
'tou', 'tou',
'tan', 'tan',
'tang', 'tang',
'teng', 'teng',
'ti', 'ti',
'tie', 'tieh',
'tiau', 'tiao',
'tian', 'tien',
'ting', 'ting',
'tu', 'tu',
'tuo', 'to',
'tuei', 'tui',
'tuan', 'tuan',
'tuen', 'tun',
'tung', 'tung',
'na', 'na',
'nai', 'nai',
'nei', 'nei',
'nau', 'nao',
'nou', 'nou',
'nan', 'nan',
'nen', 'nen',
'nang', 'nang',
'neng', 'neng',
'ni', 'ni',
'nie', 'nieh',
'niau', 'niao',
'niou', 'niu',
'nian', 'nien',
'nin', 'nin',
'niang', 'niang',
'ning', 'ning',
'nu', 'nu',
'nuo', 'no',
'nuan', 'nuan',
'nuen', 'nun',
'nung', 'nung',
'niu', 'nu',
'niue', 'nueh',
'la', 'la',
'le', 'le',
'lai', 'lai',
'lei', 'lei',
'lau', 'lao',
'lou', 'lou',
'lan', 'lan',
'lang', 'lang',
'leng', 'leng',
'li', 'li',
'lia', 'lia',
'lie', 'lieh',
'liau', 'liao',
'liou', 'liu',
'lian', 'lien',
'lin', 'lin',
'liang', 'liang',
'ling', 'ling',
'lu', 'lu',
'luo', 'lo',
'luan', 'luan',
'luen', 'lun',
'lung', 'lung',
'liu', 'lu',
'liue', 'lueh',
'liuan', 'luan',
'ga', 'ka',
'ge', 'keko',
'gai', 'kai',
'gei', 'kei',
'gau', 'kao',
'gou', 'kou',
'gan', 'kan',
'gen', 'ken',
'gang', 'kang',
'geng', 'keng',
'gu', 'ku',
'gua', 'kua',
'guo', 'kuo',
'guai', 'kuai',
'guei', 'kuei',
'guan', 'kuan',
'guen', 'kun',
'guang', 'kuang',
'gung', 'kung',
'ka', 'ka',
'ke', 'keko',
'kai', 'kai',
'kau', 'kao',
'kou', 'kou',
'kan', 'kan',
'ken', 'ken',
'kang', 'kang',
'keng', 'keng',
'ku', 'ku',
'kua', 'kua',
'kuo', 'kuo',
'kuai', 'kuai',
'kuei', 'kuei',
'kuan', 'kuan',
'kuen', 'kun',
'kuang', 'kuang',
'kung', 'kung',
'ha', 'ha',
'he', 'heho',
'hai', 'hai',
'hei', 'hei',
'hau', 'hao',
'hou', 'hou',
'han', 'han',
'hen', 'hen',
'hang', 'hang',
'heng', 'heng',
'hu', 'hu',
'hua', 'hua',
'huo', 'huo',
'huai', 'huai',
'huei', 'hui',
'huan', 'huan',
'huan', 'hun',
'huang', 'huang',
'hung', 'hung',
'ji', 'chi',
'jia', 'chia',
'jie', 'chieh',
'jiau', 'chiao',
'jiou', 'chiu',
'jian', 'chien',
'jin', 'chin',
'jiang', 'chiang',
'jing', 'ching',
'jiu', 'chu',
'jiue', 'chueh',
'jiuan', 'chuan',
'jiun', 'chun',
'jiung', 'chiung',
'chi', 'chi',
'chia', 'chia',
'chie', 'chieh',
'chiau', 'chiao',
'chiou', 'chiu',
'chian', 'chien',
'chin', 'chin',
'chiang', 'chiang',
'ching', 'ching',
'chiu', 'chu',
'chiue', 'chueh',
'chiuan', 'chuan',
'chiun', 'chun',
'chiung', 'chiung',
'shi', 'hsi',
'shia', 'hsia',
'shie', 'hsieh',
'shiau', 'hsiao',
'shiou', 'hsiu',
'shian', 'hsien',
'shin', 'hsin',
'shiang', 'hsiang',
'shing', 'hsing',
'shiu', 'hsu',
'shiue', 'hsueh',
'shiuan', 'hsuan',
'shiun', 'hsun',
'shiung', 'hsiung',
'jr', 'chih',
'ja', 'cha',
'je', 'che',
'jai', 'chai',
'jei', 'chei',
'jau', 'chao',
'jou', 'chou',
'jan', 'chan',
'jen', 'chen',
'jang', 'chang',
'jeng', 'cheng',
'ju', 'chu',
'jua', 'chua',
'juo', 'cho',
'juai', 'chuai',
'juei', 'chui',
'juan', 'chuan',
'juen', 'chun',
'juang', 'chuang',
'jung', 'chung',
'chr', 'chih',
'cha', 'cha',
'che', 'che',
'chai', 'chai',
'chau', 'chao',
'chou', 'chou',
'chan', 'chan',
'chen', 'chen',
'chang', 'chang',
'cheng', 'cheng',
'chu', 'chu',
'chua', 'chua',
'chuo', 'cho',
'chuai', 'chuai',
'chuei', 'chui',
'chuan', 'chuan',
'chuen', 'chun',
'chuang', 'chuang',
'chung', 'chung',
'shr', 'shih',
'sha', 'sha',
'she', 'she',
'shai', 'shai',
'shei', 'shei',
'shau', 'shao',
'shou', 'shou',
'shan', 'shan',
'shen', 'shen',
'shang', 'shang',
'sheng', 'sheng',
'shu', 'shu',
'shua', 'shua',
'shuo', 'shuo',
'shuai', 'shuai',
'shuei', 'shui',
'shuan', 'shuan',
'shuen', 'shuen',
'shuang', 'shuang',
'r', 'jih',
'jih',
're', 'je',
'rau', 'jao',
'rou', 'jou',
'ran', 'jan',
'ren', 'jen',
'rang', 'jang',
'reng', 'jeng',
'ru', 'ju',
'ruo', 'jo',
'ruei', 'jui',
'ruan', 'juan',
'ruen', 'jun',
'rung', 'jung',
'tz', 'tzu',
'tza', 'tsa',
'tze', 'tse',
'tzai', 'tsai',
'tzei', 'tsei',
'tzau', 'tsao',
'tzou', 'tsou',
'tzan', 'tsan',
'tzen', 'tsen',
'tzang', 'tsang',
'tzeng', 'tseng',
'tzu', 'tsu',
'tzuo', 'tso',
'tzuei', 'tsui',
'tzuan', 'tsuan',
'tzuen', 'tsun',
'tzung', 'tsung',
'tsz', 'tzu',
'tsa', 'tsa',
'tse', 'tse',
'tsai', 'tsai',
'tsau', 'tsao',
'tsou', 'tsou',
'tsan', 'tsan',
'tsen', 'tsen',
'tsang', 'tsang',
'tseng', 'tseng',
'tsu', 'tsu',
'tsuo', 'tso',
'tsuei', 'tsui',
'tsuan', 'tsuan',
'tsuen', 'tsun',
'tsung', 'tsung',
'sz', 'ssu',
'sa', 'sa',
'se', 'se',
'sai', 'sai',
'sau', 'sao',
'sou', 'sou',
'san', 'san',
'sen', 'sen',
'sang', 'sang',
'seng', 'seng',
'su', 'su',
'suo', 'so',
'suei', 'sui',
'suan', 'suan',
'suen', 'sun',
'sung', 'sung',
'a', 'a',
'e', 'eo',
'eo',
'ai', 'ai',
'au', 'ao',
'ou', 'ou',
'an', 'an',
'en', 'en',
'ang', 'ang',
'er', 'erh',
'yi', 'yii',
'ya', 'ya',
'ya', 'yeh',
'yai', 'yai',
'yau', 'yao',
'you', 'yu',
'yan', 'yen',
'yin', 'yin',
'yang', 'yang',
'ying', 'ying',
'wu', 'wu',
'wa', 'wa',
'wo', 'wo',
'wai', 'wai',
'wei', 'wei',
'wan', 'wan',
'wen', 'wen',
'wang', 'wang',
'weng', 'weng',
'yu', 'yu',
'yue', 'yueh',
'yuan', 'yuan',
'yun', 'yun',
'yung', 'yung',
'xu', 'ye', 'ho', 'bao', 'ro',
'wu', 'wu', 'ng', 'ng', 'goh', 'oh', 'ng', 'goh',
'ngo', 'ngu',
'wang', 'wang', 'wong', 'vong', 'wong', 'ong', 'wong', 'wang', 'ong', 'ng',
'wong', 'wang',
'bong', 'heng',
'wu', 'wu', 'ng', 'ng', 'ng', 'ng', 'ngo',
'ngoh', 'wu',
'wuh', 'woo',
'huang', 'huang', 'wong', 'vong', 'wong', 'hwang', 'bong', 'boong',
'ng', 'ong',
'ooi', 'wong',
'wee',
'sun', 'sun', 'suen', 'sun', 'soon', 'son', 'soon', 'sun',
'shun', 'song',
'zheng', 'cheng', 'cheng', 'cheang', 'tay', 'jung', 'jeong',
'chung', 'cheong', 'ching', 'tang',
'tey', 'tay',
'tee', 'teh',
'cheng', 'chin',
'chang', 'chung',
'chiang',
'feng', 'feng', 'fung', 'fong', 'pung', 'foong', 'fung',
'fong',
'chen', 'chen', 'chan', 'chan', 'tan', 'chan',
'ting', 'jin', 'chin', 'chan', 'chin',
'chen', 'tan',
'tang', 'ting',
'ding', 'sin',
'jiang', 'chiang', 'cheung', 'cheong', 'jang', 'chang', 'chiang', 'cheong',
'chiong',
'han', 'han', 'hon', 'hon', 'han', 'hon', 'hong',
'yang', 'yang', 'yeung', 'ieong', 'yeo', 'yong', 'yang', 'yong', 'yeo',
'yeoh', 'eow',
'yeong', 'yew',
'qin', 'chin', 'chun', 'jin', 'chin', 'chin', 'ch', 'ng',
'zhang', 'chang', 'cheung', 'cheong', 'cheong', 'jang', 'chang', 'cheong', 'chong',
'teo', 'chang',
'teoh', 'tiong',
'kong', 'kung', 'hung', 'hong', 'gong', 'kong', 'kong', 'khong',
'kung',
'cao', 'tsao', 'cho', 'tso', 'chou', 'cho', 'jo', 'cheng', 'choo',
'cho', 'chu',
'chao',
'yan', 'yen', 'yim', 'im', 'im', 'yam', 'ngim',
'giam',
'jin', 'chin', 'kam', 'kam', 'kim', 'kim', 'king',
'wei', 'wei', 'ngai', 'ngai', 'goei', 'ui', 'oui',
'wi', 'wie',
'wee', 'ngui', 'gui', 'woi',
'jiang', 'chiang', 'keung', 'keong', 'kang', 'gang', 'khiang', 'kiang',
'tang', 'tang', 'tong',
'ao', 'ao', 'ngo',
'chang', 'chang', 'cheung',
'cong', 'tsung', 'chung', 'tsung',
'dongfang', 'tungfang', 'tungfong',
'dongguo', 'tungkuo', 'tungkwok',
'ngok',
'geng', 'keng', 'kang',
'geng', 'keng', 'kang',
'gong', 'kung', 'kung',
'gong', 'kung', 'kung',
'jing', 'ching', 'ching',
'kuang', 'kuang', 'kwong',
'neng', 'neng', 'nang', 'nang',
'ning', 'ning', 'ning',
'nangong', 'nankung', 'namkung',
'meng', 'meng', 'mung',
'murong', 'mujung', 'mouyung',
'leng', 'leng', 'lang',
'shang', 'shang', 'seung',
'shangguan', 'shangkuan', 'seungkoon',
'tong', 'tung', 'tung',
'teng', 'teng', 'tang',
'xing', 'hsing', 'ha',
'ying', 'ying', 'ying',
'ying', 'ying', 'ying',
'zang', 'tsang', 'chong',
'zhong', 'chung', 'chung',
'zhuang', 'chuang', 'chong',
'zhang', 'chang', 'cheung', 'cheong', 'chang', 'jang', 'cheong', 'chong',
'teo', 'tiong',
'tong',
'yun', 'yun', 'wan', 'wan', 'woon', 'wun',
'yun', 'yung',
'pan', 'pan', 'poon', 'pun', 'pun', 'phua', 'ban', 'phua', 'pan',
'pang', 'phang',
'fan', 'fan', 'fan', 'fan', 'bum', 'fung', 'fam',
'fang', 'hwang',
'peng', 'peng', 'pang', 'pang', 'pang', 'paeng', 'peng', 'pang',
'phang',
'lang', 'lang', 'long', 'long',
'chang', 'chang', 'cheung', 'cheong', 'cheong', 'chang',
'cang',
'feng', 'feng', 'fung', 'fong', 'fong',
'fang', 'fang', 'fong', 'fong', 'bang', 'pung', 'fang',
'fong', 'phun',
'huong',
'ren', 'jen', 'yam', 'iam', 'rim', 'yim', 'yam', 'ngam',
'yim', 'ngieng',
'ngiam',
'yuan', 'yuan', 'yuen', 'un', 'iun', 'won', 'yuan', 'yuen',
'ngen',
'feng', 'feng', 'fung', 'fong',
'tang', 'tang', 'tong', 'tong', 'thang', 'thong',
'tang', 'tong',
'thong',
'ni', 'ni', 'ngai', 'ngai', 'geh', 'nga', 'ngam',
'tang', 'tang', 'tong', 'tong', 'thong', 'tang',
'thang',
'teng', 'teng', 'tang', 'tang',
'yin', 'yin', 'yan', 'ian', 'yam', 'ngam',
'chang', 'chang', 'sheung', 'seong',
'kang', 'kang', 'hong', 'hong', 'gang', 'kang',
'meng', 'meng', 'mang', 'mang', 'maeng', 'mang', 'meng',
'ping', 'ping', 'ping', 'peng',
'wang', 'wang', 'wong', 'vong', 'wong', 'wang', 'wong',
'vang',
'ming', 'ming', 'ming', 'meng', 'myeong', 'myung',
'cheng', 'cheng', 'shing', 'sing', 'seng', 'sung', 'seong', 'sang', 'shang',
'tshan', 'tshang',
'song', 'sung', 'sung', 'song', 'song', 'song', 'shong', 'song',
'sung',
'pang', 'pang', 'pong', 'pong', 'phong', 'pong',
'pang',
'xiong', 'hsiung', 'hung', 'ha', 'hong', 'yoong', 'hiung',
'hung',
'xiang', 'hsiang', 'hong', 'hong',
'dong', 'tung', 'tung', 'tong', 'dong', 'thung', 'tong',
'tung', 'dung',
'thong',
'liang', 'liang', 'leung', 'leong', 'ryeong', 'liang', 'leong',
'neo', 'neoh',
'leo',
'ruan', 'juan', 'yuen', 'un', 'ngwan', 'goon',
'woon', 'won',
'lan', 'lan', 'lam', 'nam', 'lam', 'lam', 'ngam', 'lan',
'qiang', 'chiang', 'keung', 'keong',
'wei', 'wei', 'ngai', 'ngai',
'jiang', 'chiang', 'kong', 'kong', 'kang', 'kang', 'kong',
'khong', 'khang',
'tong', 'tung', 'tung', 'tong', 'tong', 'thong',
'tang',
'yan', 'yen', 'ngan', 'ngan', 'gan', 'ngan',
'ngam',
'sheng', 'sheng', 'shing', 'seng', 'cheng', 'shang',
'lin', 'lin', 'lam', 'lam', 'lim', 'lam', 'lim', 'im', 'lim', 'lin',
'lam', 'ling',
'zhong', 'chung', 'chung', 'chong', 'ch', 'ng', 'chong',
'cheng', 'chung',
'ling', 'ling', 'ling', 'leng', 'lin', 'ling',
'jing', 'ching', 'king', 'keng', 'gin',
'fang', 'fang', 'fong', 'fong', 'piong', 'fong',
'fang',
'ying', 'ying', 'ying', 'ieng',
'zong', 'tsung', 'chung', 'chong',
'ding', 'ting', 'ting', 'teng',
'deng', 'teng', 'tang', 'tang', 'tang', 'thien',
'ten', 'tan',
'hang', 'hang', 'hong', 'hong',
'hong', 'hung', 'hung', 'hong', 'ang', 'ong',
'hong', 'hung',
'gong', 'kung', 'kung', 'kong',
'cheng', 'cheng', 'ching', 'cheng', 'tiah', 'tiang',
'xing', 'hsing', 'ying', 'ieng',
'rong', 'jung', 'wing', 'veng',
'weng', 'weng', 'yung', 'iong', 'wong', 'yeong',
'vung',
'yang', 'yang', 'yeung', 'ieong', 'young',
'feng', 'feng', 'fung', 'fong',
'bing', 'ping',
'song', 'sung', 'chung', 'chong',
'jing', 'ching',
'gong', 'kung', 'kung', 'kong',
'peng', 'peng', 'pang', 'pang',
'yang', 'yang', 'yeung', 'ieong', 'young',
'zhong', 'chung', 'chung', 'chong',
'gong', 'kung', 'kung', 'kong',
'ning', 'ning', 'ning', 'neng',
'rong', 'jung', 'yung', 'iong',
'jing', 'ching', 'king', 'keng',
'long', 'lung', 'lung', 'long', 'leong', 'long',
'king',
'xing', 'hsing', 'hang', 'hang',
'cong', 'tsung', 'chung', 'chong',
'meng', 'meng', 'mung', 'mong', 'bang', 'mang',
'mung', 'mong',
'cang', 'tsang', 'chong', 'chong',
'shuang', 'shuang', 'sheung', 'seong',
'dang', 'tang', 'tong', 'tong',
'gong', 'kung', 'kung', 'kong',
'pang', 'pang', 'fung', 'fong',
'yong', 'yung', 'yung', 'iong',
'sang', 'sang', 'song', 'song',
'niu', 'niu', 'ngau', 'ngao',
'tong', 'tung', 'tung', 'tong',
'shang', 'shang', 'sheung', 'seong',
'nong', 'nung', 'nung', 'nong',
'wen', 'wen', 'wan', 'wen', 'wen', 'won',
'wan', 'bong',
'voon',
'zhuang', 'chuang', 'chong', 'chuang', 'ching',
'chin', 'ch', 'ng',
'chong', 'chung', 'chung', 'chong',
'lian', 'lien', 'lin', 'lin', 'leong',
'ai', 'ai', 'ngai', 'ngai',
'rong', 'jung', 'yung', 'iong',
'xiang', 'hsiang', 'heung', 'heong',
'zhong', 'chung', 'chung', 'chong',
'heng', 'heng',
'hong', 'hung', 'wung',
'kuang', 'kuang', 'hong', 'hong',
'guang', 'kuang', 'kwong', 'kuong',
'dong', 'tung', 'tung', 'dong', 'dong',
'long',
'rong',
'zeng', 'cheng', 'tseng', 'tsang', 'chang', 'tjan', 'tjan', 'chang',
'chan', 'chin',
'ouyang', 'ouyang', 'auyeung', 'aoieong',
'gongsun',
'linghu', 'yeongho',
'yue', 'yue', 'ngok', 'lee', 'haung', 'jong', 'xin', 'zhi'
])
both_list = set(['yu', 'ken', 'long', 'chu', 'ben', 'pin', 'kai', 'ran', 'ju', 'lau', 'dan', 'leo', 'a', 'e', 'r', 'jih', 'eo', 'ai', 'ian', 'jr', 'la', 'le', 'de', 'da', 'di', 'jan', 'bin', 'ma', 'han', 'juan', 'bo', 'fan'])
def is_chinese_name(name):
name = name.lower()
name = name.replace('-', ' ')
for word in name.split():
if word in chinese_name_list - both_list:
return True
return False
def split_chinese_concat_name(name):
if not is_chinese_name(name):
return name
split = name.split()
if len(split) >= 3:
return name
new_split = list()
for word in split:
new_split.append(split_chinese_concat_word(word))
return ' '.join(new_split)
def split_chinese_concat_word(word):
if word in chinese_name_list:
return word
if len(word) <= 3:
return word
for i in range(1,len(word)): # try all case of split
split = (word[:i], word[i:])
if split[0] in chinese_name_list and split[1] in chinese_name_list:
return ' '.join(split)
elif split[0] in chinese_name_list and split[1][:-1] in chinese_name_list:
return ' '.join((split[0], split[1][:-1]))
return word
def is_chinese_abbr(abbr_name, extend_name):
if len(abbr_name.split()) == 2:
if len(extend_name.split()) >= 3 and len([word for word in extend_name.split() if len(word) > 1]) != 2:
return False
elif is_two_word_name_the_same(abbr_name, extend_name): # Only deal with the case: 'chih lin' and 'lin chih' not the same. This is redundent because of the latter requirement
return False
# Deal with the case that abbr_name with length >= 3, e.g. 'chih jen lin'
for name in set(abbr_name.split()) & chinese_name_list - both_list:
if max([is_sameword(name, tname) for tname in set(extend_name.split())]) == False:
return False
return True
def is_two_word_name_the_same(abbr_name, extend_name):
aws = sorted([word for word in abbr_name.split() if len(word) > 1])
ews = sorted([word for word in extend_name.split() if len(word) > 1])
if len(aws) != 2 or len(ews) != 2:
return False
if not is_sameword(aws[0], ews[0]) or not is_sameword(aws[1], ews[1]):
return True
return False
def is_sameword(name, tname):
# allow one typo character in the end of the list
return tname == name or len(tname) - len(name) == 1 and name == tname[:-1] and tname[-1] not in set(['a', 'e', 'i', 'o', 'u', 'n', 'g']) or len(name) - len(tname) == 1 and tname == name[:-1] and name[-1] not in set(['a', 'e', 'i', 'o', 'u', 'n', 'g'])
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.stderr.write('Usage: %s name\n' % (sys.argv[0]))
exit(1)
print is_chinese_name(sys.argv[1])