-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathipa.py
215 lines (200 loc) · 44.7 KB
/
ipa.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# -*- coding: UTF-8 -*-
import re
# Feature system taken from Hayes 2008 (pp. 95-98)
ipa_to_features = {}
abbreviations = {'cons': 'consonantal', 'son': 'sonorant', 'cont': 'continuant', 'del.rel': 'delayed.release', 'approx': 'approximant', 'nas': 'nasal', 'voi': 'voice', 'lab': 'labial', 'rnd': 'round', 'cor': 'coronal', 'ant': 'anterior', 'dist': 'distributed', 'strid': 'strident', 'lat': 'lateral', 'dor': 'dorsal'}
##############
# Consonants #
##############
consonant_features = ['consonantal', 'sonorant', 'continuant', 'delayed.release', 'approximant', 'tap', 'trill', 'nasal', 'voice', 'spread.gl', 'constr.gl', 'labial', 'round', 'labiodental', 'coronal', 'anterior', 'distributed', 'strident', 'lateral', 'dorsal', 'high', 'low', 'front', 'back', 'tense']
# bilabial
ipa_to_features[u'p'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'b'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɸ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'β'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'm'] = {'consonantal': True, 'sonorant': True, 'continuant': False, 'delayed.release': None, 'approximant': False, 'tap': False, 'trill': False, 'nasal': True, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʙ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': True, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
# labiodental
ipa_to_features[u'p͡f'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': True, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'f'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': True, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'v'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': True, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɱ'] = {'consonantal': True, 'sonorant': True, 'continuant': False, 'delayed.release': None, 'approximant': False, 'tap': False, 'trill': False, 'nasal': True, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': True, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʋ'] = {'consonantal': False, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': True, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
# dental
ipa_to_features[u't̪'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'd̪'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'θ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ð'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
# alveolar
ipa_to_features[u't'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'd'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʦ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʣ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u't͡s'] = ipa_to_features[u'ʦ']
ipa_to_features[u'd͡z'] = ipa_to_features[u'ʣ']
ipa_to_features[u't͡ɬ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': True, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u's'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'z'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'n'] = {'consonantal': True, 'sonorant': True, 'continuant': False, 'delayed.release': None, 'approximant': False, 'tap': False, 'trill': False, 'nasal': True, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'l'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': True, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɬ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': True, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɮ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': True, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɾ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': True, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɺ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': True, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': True, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'r'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': True, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
# palato-alveolar
ipa_to_features[u'ʧ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʤ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u't͡ʃ'] = ipa_to_features[u'ʧ']
ipa_to_features[u'd͡ʒ'] = ipa_to_features[u'ʤ']
ipa_to_features[u'ʃ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʒ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɹ'] = {'consonantal': False, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
# retroflex
ipa_to_features[u'ʈ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɖ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʂ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ʐ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': True, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɳ'] = {'consonantal': True, 'sonorant': True, 'continuant': False, 'delayed.release': None, 'approximant': False, 'tap': False, 'trill': False, 'nasal': True, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɭ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': False, 'lateral': True, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɽ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': True, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɻ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': False, 'strident': False, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
# fronted velar
ipa_to_features[u'k̟̟'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'g̟'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'x̟'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'j'] = {'consonantal': False, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': True}
# velar
ipa_to_features[u'k'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'g'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ŋ'] = {'consonantal': True, 'sonorant': True, 'continuant': False, 'delayed.release': None, 'approximant': False, 'tap': False, 'trill': False, 'nasal': True, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'k͡x'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'x'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɣ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None} # note: incorrectly +lateral in Hayes
ipa_to_features[u'ʟ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': True, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None} # note: incorrectly -lateral in Hayes
# back velar
ipa_to_features[u'k̠'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': False, 'back': True, 'tense': None} # note: incorrectly +lateral in Hayes
ipa_to_features[u'g̠'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'x̠'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'ɣ̠'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': False, 'back': True, 'tense': None}
# uvular
ipa_to_features[u'q'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': False, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'ɢ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': False, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'χ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': False, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'ʁ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': False, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'ɴ'] = {'consonantal': True, 'sonorant': True, 'continuant': False, 'delayed.release': None, 'approximant': False, 'tap': False, 'trill': False, 'nasal': True, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': False, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'ʀ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': True, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': False, 'front': False, 'back': True, 'tense': None}
# pharyngeal
ipa_to_features[u'ħ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': True, 'front': False, 'back': True, 'tense': None}
ipa_to_features[u'ʕ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': False, 'low': True, 'front': False, 'back': True, 'tense': None} # note: incorrectly -delayed.release in Hayes
# glottal
ipa_to_features[u'ʔ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': True, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'h'] = {'consonantal': False, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': True, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'ɦ'] = {'consonantal': False, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': True, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': False, 'high': None, 'low': None, 'front': None, 'back': None, 'tense': None}
# labial back velar
ipa_to_features[u'w'] = {'consonantal': False, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': True, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': False, 'back': True, 'tense': True}
ipa_to_features[u'ʍ'] = {'consonantal': False, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': True, 'constr.gl': False, 'labial': True, 'round': True, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': False, 'back': True, 'tense': True}
# labial velar
ipa_to_features[u'k͡p'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None}
ipa_to_features[u'g͡b'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': False, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': None, 'back': None, 'tense': None}
# labial front velar
ipa_to_features[u'ɥ'] = {'consonantal': False, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': True, 'round': True, 'labiodental': False, 'coronal': False, 'anterior': None, 'distributed': None, 'strident': None, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': True}
# alveolopalatal
ipa_to_features[u'ʨ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'ʥ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u't͡ɕ'] = ipa_to_features[u'ʨ']
ipa_to_features[u'd͡ʑ'] = ipa_to_features[u'ʥ']
ipa_to_features[u'ɕ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'ʑ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': True, 'distributed': True, 'strident': True, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
# palatal
ipa_to_features[u'c'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'ɟ'] = {'consonantal': True, 'sonorant': False, 'continuant': False, 'delayed.release': False, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'ç'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': False, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'ʝ'] = {'consonantal': True, 'sonorant': False, 'continuant': True, 'delayed.release': True, 'approximant': False, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'ɲ'] = {'consonantal': True, 'sonorant': True, 'continuant': False, 'delayed.release': None, 'approximant': False, 'tap': False, 'trill': False, 'nasal': True, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': False, 'lateral': False, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
ipa_to_features[u'ʎ'] = {'consonantal': True, 'sonorant': True, 'continuant': True, 'delayed.release': None, 'approximant': True, 'tap': False, 'trill': False, 'nasal': False, 'voice': True, 'spread.gl': False, 'constr.gl': False, 'labial': False, 'round': False, 'labiodental': False, 'coronal': True, 'anterior': False, 'distributed': True, 'strident': False, 'lateral': True, 'dorsal': True, 'high': True, 'low': False, 'front': True, 'back': False, 'tense': None}
##########
# Vowels #
##########
vowel_features = ['high', 'low', 'tense', 'front', 'back', 'round']
# high tense
ipa_to_features[u'i'] = {'high': True, 'low': False, 'tense': True, 'front': True, 'back': False, 'round': False}
ipa_to_features[u'y'] = {'high': True, 'low': False, 'tense': True, 'front': True, 'back': False, 'round': True}
ipa_to_features[u'ɨ'] = {'high': True, 'low': False, 'tense': True, 'front': False, 'back': False, 'round': False}
ipa_to_features[u'ʉ'] = {'high': True, 'low': False, 'tense': True, 'front': False, 'back': False, 'round': True}
ipa_to_features[u'ɯ'] = {'high': True, 'low': False, 'tense': True, 'front': False, 'back': True, 'round': False}
ipa_to_features[u'u'] = {'high': True, 'low': False, 'tense': True, 'front': False, 'back': True, 'round': True}
# high lax
ipa_to_features[u'ɪ'] = {'high': True, 'low': False, 'tense': False, 'front': True, 'back': False, 'round': False}
ipa_to_features[u'ʏ'] = {'high': True, 'low': False, 'tense': False, 'front': True, 'back': False, 'round': True}
ipa_to_features[u'ʊ'] = {'high': True, 'low': False, 'tense': False, 'front': False, 'back': True, 'round': True}
# mid tense
ipa_to_features[u'e'] = {'high': False, 'low': False, 'tense': True, 'front': True, 'back': False, 'round': False}
ipa_to_features[u'ø'] = {'high': False, 'low': False, 'tense': True, 'front': True, 'back': False, 'round': True}
ipa_to_features[u'ɘ'] = {'high': False, 'low': False, 'tense': True, 'front': False, 'back': False, 'round': False}
ipa_to_features[u'ɜ'] = {'high': False, 'low': False, 'tense': True, 'front': False, 'back': False, 'round': False} # not in Hayes, but given the same representation as 'ɘ'
ipa_to_features[u'ɵ'] = {'high': False, 'low': False, 'tense': True, 'front': False, 'back': False, 'round': True}
ipa_to_features[u'ɤ'] = {'high': False, 'low': False, 'tense': True, 'front': False, 'back': True, 'round': False}
ipa_to_features[u'o'] = {'high': False, 'low': False, 'tense': True, 'front': False, 'back': True, 'round': True}
# mid lax
ipa_to_features[u'ɛ'] = {'high': False, 'low': False, 'tense': False, 'front': True, 'back': False, 'round': False}
ipa_to_features[u'œ'] = {'high': False, 'low': False, 'tense': False, 'front': True, 'back': False, 'round': True}
ipa_to_features[u'ə'] = {'high': False, 'low': False, 'tense': False, 'front': False, 'back': False, 'round': False}
ipa_to_features[u'ɞ'] = {'high': False, 'low': False, 'tense': False, 'front': False, 'back': False, 'round': True}
ipa_to_features[u'ʌ'] = {'high': False, 'low': False, 'tense': False, 'front': False, 'back': True, 'round': False}
ipa_to_features[u'ɔ'] = {'high': False, 'low': False, 'tense': False, 'front': False, 'back': True, 'round': True}
# low
ipa_to_features[u'æ'] = {'high': False, 'low': True, 'tense': None, 'front': True, 'back': False, 'round': False}
ipa_to_features[u'ɶ'] = {'high': False, 'low': True, 'tense': None, 'front': True, 'back': False, 'round': True}
ipa_to_features[u'a'] = {'high': False, 'low': True, 'tense': None, 'front': False, 'back': False, 'round': False}
ipa_to_features[u'ɑ'] = {'high': False, 'low': True, 'tense': None, 'front': False, 'back': True, 'round': False}
ipa_to_features[u'ɒ'] = {'high': False, 'low': True, 'tense': None, 'front': False, 'back': True, 'round': True}
all_features = set(consonant_features + vowel_features)
value_map = {'+': True, '-': False, '0': None}
reverse_value_map = {True: '+', False: '-', None: '0'}
# Split a combined feature and value into separate parts
# E.g. "+sonorant" -> ("sonorant", True)
def split_feature_and_value(feature):
if len(feature) < 1:
return None
value = feature[0]
if value not in value_map:
return None
value = value_map[value]
feature = feature[1:]
if feature not in all_features:
return None
return (feature, value)
# combine a feature and a value into one representation
# E.g. ("sonorant", True) -> "+sonorant"
def combine_feature_and_value(feature, value):
if value not in reverse_value_map:
return None
return reverse_value_map[value] + feature
# Note: this may need to change if the feature system is modified
def is_vowel(phoneme):
return 'consonantal' not in ipa_to_features[phoneme]
def is_consonant(phoneme):
return not is_vowel(phoneme)
def phoneme_feature_string(phoneme):
if phoneme not in ipa_to_features:
return None
features = vowel_features if is_vowel(phoneme) else consonant_features
feature_value_pairs = [(feature, ipa_to_features[phoneme][feature]) for feature in features]
return ", ".join([combine_feature_and_value(feature, value) for feature, value in feature_value_pairs if value != None])
def get_natural_class(features):
features = re.findall('\s*([^\s]+)\s*', features, re.UNICODE)
result = set(ipa_to_features.keys())
for feature in features:
matches = set()
split = split_feature_and_value(feature)
if split == None:
print "Invalid feature: " + feature
return set()
feature, value = split
for phoneme in ipa_to_features:
feature_values = ipa_to_features[phoneme]
if feature in feature_values and feature_values[feature] == value:
matches.add(phoneme)
result = result.intersection(matches)
return result