abydos icon indicating copy to clipboard operation
abydos copied to clipboard

add Rosenfelder's English phoneticization

Open chrislit opened this issue 5 years ago • 0 comments

http://www.zompist.com/spell.html

partial implementation: `

def rosenfelder(word): """Calculate Mark Rosenfelder's English pronunciation of a word.

This is based on the rule set/algorithm presented at
http://www.zompist.com/spell.html
"""
# define constants
orth_vowels = {'a', 'e', 'i', 'o', 'u'}
vowels = {'@', 'u', 'ù', 'o', 'ë', 'ê', 'û', 'i', 'ä', 'â', 'ô', 'ö', 'e',
          'ï', 'ü', 'î', 'a', 'ò'}
long_vowels = {'a': 'ä', 'e': 'ë', 'i': 'ï', 'o': 'ö', 'u': 'ü', 'ä': 'ä',
               'ë': 'ë', 'ï': 'ï', 'ö': 'ö', 'ü': 'ü', 'â': 'ä', 'ê': 'ë',
               'î': 'ï', 'ô': 'ö', 'û': 'ü', 'ù': 'ù', 'ò': 'ò', '@': '@'}
short_vowels = {'a': 'â', 'e': 'ê', 'i': 'î', 'o': 'ô', 'u': 'û', 'ä': 'â',
                'ë': 'ê', 'ï': 'î', 'ö': 'ô', 'ü': 'û', 'â': 'â', 'ê': 'ê',
                'î': 'î', 'ô': 'ô', 'û': 'û', 'ù': 'ù', 'ò': 'ò', '@': '@'}
a_vowels = {'a', 'â', 'ä'}
e_vowels = {'e', 'ê', 'ë'}
i_vowels = {'i', 'î', 'ï'}
o_vowels = {'o', 'ô', 'ö'}
non_a_vowels = {'e', 'i', 'o', 'u'}
front_vowels = {'e', 'i', 'y', 'ê', 'î'}
letters = {'l', 'y', 'w', 'ä', 'â', 'ô', 'e', 'ï', 'a', 'b', 'm', 'ç', 'f',
           'ù', 'ê', 'ö', 'î', 'ñ', 'c', 'k', 'v', 'u', 'ë', 'û', 'p', 'x',
           'z', 'j', 't', 's', 'ü', '$', 'ò', '@', 'n', 'o', 'r', 'i', 'q',
           'd', 'g', 'h', '+'}
consonants = {'l', 'y', 'w', 'b', 'm', 'ç', 'f', 'ñ', 'c', 'k', 'v', 'p',
              'x', 'z', 'j', 't', 's', '$', 'n', 'r', 'q', 'd', 'g', 'h',
              '+'}
dental_stops = {'+', 'd', 't'}
liquids = {'l', 'r'}
nasals = {'m', 'n', 'ñ'}
dentals = {'+', 'd', 'n', 's', 't'}
p_cons = {'k', 'p', 't'}
b_cons = {'b', 'd', 'g'}
s_cons = {'$', '+', 'f', 's'}
z_cons = {'#', '+', 'v', 'z'}

# rule 1
for src, tar  in [('ch', 'ç'), ('sh', '$'), ('ph', 'f'), ('th', '+'),
                  ('qu', 'kw'), ('wr', 'r'), ('who', 'ho'), ('wh', 'w'),
                  ('xh', 'x')]:
    word = word.replace(src, tar)

if word[:2] == 'rh':
    word = 'r'+word[2:]

# rule 2
if word[:2] == 'ex' and word[2:3] in vowels:
    word = 'egz'+word[2:]
word = word.replace('x', 'ks')

# rule 3
word = word.replace("'", '')

# rules 4-8
nxch = word.find('gh')
while nxch != -1:
    if word[nxch+2:nxch+3] in vowels:
        word = word[:nxch]+'g'+word[nxch+2:]
    elif word[nxch-2:nxch-1] in consonants and word[nxch-1:nxch] in vowels:
        word = word[:nxch-1]+long_vowels[word[nxch-1:nxch]]+word[nxch+2:]
    elif word[nxch-2:nxch+3] in {'aught', 'ought'}:
        word = word[:nxch-2]+'òt'+word[nxch+3:]
    elif word[nxch-2:nxch+2] == 'ough':
        word = word[:nxch-2]+'ö'+word[nxch+2:]
    else:
        word = word[:nxch]+word[nxch+2:]
    nxch = word.find('gh')

# rule 9
if word[:2] in {'gn', 'kn', 'mn', 'pt', 'ps', 'tm'}:
    word = word[1:]

# rule 10
if word[-1:] == 'y' and all(_ in consonants for _ in word[:-1]):
    word = word[:-1]+'ï'

# rule 11
for src, tar in [('ey', 'ë'), ('ay', 'ä'), ('oy', 'öy')]:
    word = word.replace(src, tar)

# rule 12
nxch = word.find('y')
while nxch != -1:
    if word[nxch-1:nxch] not in vowels and word[nxch+1:nxch+2] not in vowels:
        word = word[:nxch]+'i'+word[nxch+1:]
    nxch = word.find('y', nxch+1)

# rule 13
if word[-1:] in vowels and word[-4:-1] == 'stl':
    word = word[:-3]+word[-2:]

# rule 14
nxch = word.find('ci')
while nxch != -1:
    if word[nxch+2:nxch+3] in vowels:
        word = word[:nxch]+'$'+word[nxch+2:]
    nxch = word.find('ci', nxch)

nxch = word.find('ti')
while nxch != -1:
    if word[nxch+2:nxch+3] in vowels:
        word = word[:nxch]+'$'+word[nxch+2:]
    nxch = word.find('ti', nxch+1)

# rule 15
nxch = word.find('tu')
while nxch != -1:
    if word[nxch+2:nxch+3] in vowels or (word[nxch+2:nxch+3] in {'r', 'l'}
                                         and
                                         word[nxch+3:nxch+4] in vowels):
        word = word[:nxch]+'çu'+word[nxch+2:]
    nxch = word.find('tu', nxch+2)

# rule 16
nxch = word.find('s')
while nxch != -1:
    if

return word

`

chrislit avatar Sep 12 '18 03:09 chrislit