-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathverify.py
107 lines (102 loc) · 4.41 KB
/
verify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
def get共通音位(聲母, 韻母):
聲母字典 = {
'幫': 'p', '滂': 'pʰ', '明': 'm', '非': 'f', '微': 'ʋ',
'端': 't', '透': 'tʰ', '泥': 'n', '來': 'l',
'見': 'k', '溪': 'kʰ', '疑': 'ŋ', '曉': 'x', '影': '',
'照': 'tʂ', '穿': 'tʂʰ', '審': 'ʂ', '日': 'ɻ',
'精': 'ts', '清': 'tsʰ', '心': 's',
}
介音字典 = {
'開': '', '合': 'w',
'齊': 'j', '撮': 'jw',
}
韻基字典 = {
'魚模': 'u', '東鍾': 'uŋ',
'支思': 'ɨ', '庚青': 'ɨŋ', '齊微': 'ɨj', '真文': 'ɨn', '尤侯': 'ɨw', '侵尋': 'ɨm',
'家麻': 'a', '江陽': 'aŋ', '皆來': 'aj', '寒山': 'an', '蕭豪': 'aw', '監咸': 'am',
'車遮': 'ɛ', '先天': 'ɛn', '廉纖': 'ɛm',
'歌戈': 'ʌ', '桓歡': 'ʌn',
}
if 聲母 in '幫滂明非微':
介音字典['開'] = 'β' # 用于推導薛鳳生和寧繼福擬音
if 韻母[-1] == '一':
韻基字典['蕭豪'] = 'ɛw' if 韻母[2] == '齊' else 'ʌw'
聲母音 = 聲母字典[聲母]
韻母音 = 介音字典[韻母[2]] + 韻基字典[韻母[:2]]
韻母音 = 韻母音.replace('wu', 'u')
韻母音 = 韻母音.replace('ɥu', 'ju')
return 聲母音 + 韻母音
def get各家擬音(聲母, 韻母, 聲調):
共通音位 = get共通音位(聲母, 韻母)
韻部 = 韻母[:2]
is脣音 = 聲母 in '幫滂明非微'
is銳音 = 聲母 in '端透泥來照穿審日精清心'
轉換規則字典 = {
# 規則: (from, to, [condition, [else to]])
'unt(音位)': [
('β', ''),
('ʌw', 'waw', is脣音 and '入' not in 聲調, 'aw'),
('jaj', '(j)aj', '入' in 聲調),
],
'unt': [
('β', ''),
('jɨ', 'i'), ('ij', 'i'),
('jw', 'ɥ'),
('wɨ', 'u', 韻部 != '庚青'),
('ɥɨ', 'y', 韻部 != '庚青', 'ɥi'),
('ʌw', 'waw', is脣音 and '入' not in 聲調, 'aw'),
('wʌ', 'ɔ', is脣音 or is銳音 and 韻部 == '歌戈', 'wɔ'),
('ɥʌ', 'jɔ'),
('jaj', '(j)aj', '入' in 聲調),
],
'薛鳳生(音位)': [
('ʰ', 'h'), ('ʋ', 'v'), ('ʂ', 'sr'), ('ɻ', 'r'),
('ts', 'c'), ('x', 'h'),
('waw', 'ow'), ('β', 'w'),
('j', 'y'),
('ɨ', 'e', 韻部 == '庚青'), ('ɛ', 'e'),
('u', 'wɨ', 韻部 != '東鍾', 'wo'), ('ʌ', 'o'),
],
'楊耐思': [
('ʰ', 'ʻ'), ('ʋ', 'v'), ('ʂ', 'ʃ'), ('ɻ', 'ʒ'),
('β', ''),
('ɨ', 'ï', 韻部 == '支思', 'ə'),
('j', 'i'), ('w', 'u'),
('əi', 'ei'), ('iei', 'i'),
('uau', 'au'), ('ʌu', 'au'), ('iau', 'iɛu', is銳音),
('ʌ', 'o'), ('iuo', 'io'), ('uon', 'on'),
('ia', 'i̯a', 韻部 != '江陽'),
],
'寧繼福': [
('β', '', 共通音位[-1] in 'jw', 'w'),
('ʰ', 'ʻ'), ('ɻ', 'ɽ'),
('ɨ', 'ï', 韻部 == '支思', 'ə'),
('j', 'i'), ('w', 'u'),
('uəi', 'ui'), ('əi', 'ei'), ('iei', 'i'),
('uʌu', 'au'), ('ʌu', 'ɑu'),
('uau', 'au'), ('iau', 'au', 聲調[0] != '入'),
('iɛu', 'iau'),
('ʌ', 'ɔ'), ('iuɔ', 'iɔ'),
],
}
各家擬音 = {}
for 方案名, 規則列表 in 轉換規則字典.items():
擬音 = 共通音位
for 規則 in 規則列表:
if len(規則) == 2 or 規則[2]:
擬音 = 擬音.replace(規則[0], 規則[1])
elif len(規則) == 4:
擬音 = 擬音.replace(規則[0], 規則[3])
各家擬音[方案名] = 擬音
return 各家擬音
with open('中原音韻.tsv', 'r', encoding='utf-8') as f:
headers = f.readline().strip('\n').split()
for line in f:
line = line.strip('\n').split()
line = dict(zip(headers, line))
聲母, 韻母, 聲調 = [line[k] for k in ('聲母', '韻母', '聲調')]
各家擬音 = get各家擬音(聲母, 韻母, 聲調)
result = [f'{k}: {擬音} ≠ {line[k]}'
for k, 擬音 in 各家擬音.items() if 擬音 != line[k]]
if result:
print(聲母, 韻母, 聲調, '-', ', '.join(result))