"""
List of similar chars
useful for suggestion mechanism
"""
dDistanceBetweenChars = {
# - with Damerau-Levenshtein, values / 10 (between 0 and 1: 0.1, 0.2 ... 0.9)
# - with Jaro-Winkler, values between 1 and 10
# voyelles
"a": { "a": 0, "á": .1, "à": .1, "â": .1, "ã": .1 },
"á": { "a": .1, "á": 0, "à": .1, "â": .1, "ã": .1 },
"à": { "a": .1, "á": .1, "à": 0, "â": .1, "ã": .1 },
"â": { "a": .1, "á": .1, "à": .1, "â": 0, "ã": .1 },
"ã": { "a": .1, "á": .1, "à": .1, "â": .1, "ã": 0 },
"e": { "e": 0, "é": .1, "è": .1, "ê": .1, "ẽ": .1 },
"é": { "e": .1, "é": 0, "è": .1, "ê": .1, "ẽ": .1 },
"è": { "e": .1, "é": .1, "è": 0, "ê": .1, "ẽ": .1 },
"ê": { "e": .1, "é": .1, "è": .1, "ê": 0, "ẽ": .1 },
"ẽ": { "e": .1, "é": .1, "è": .1, "ê": .1, "ẽ": 0 },
"i": { "i": 0, "í": .1, "ì": .1, "î": .1, "ĩ": .1 },
"í": { "i": .1, "í": 0, "ì": .1, "î": .1, "ĩ": .1 },
"ì": { "i": .1, "í": .1, "ì": 0, "î": .1, "ĩ": .1 },
"î": { "i": .1, "í": .1, "ì": .1, "î": 0, "ĩ": .1 },
"ĩ": { "i": .1, "í": .1, "ì": .1, "î": .1, "ĩ": 0 },
"o": { "o": 0, "ó": .1, "ò": .1, "ô": .1, "õ": .1 },
"ó": { "o": .1, "ó": 0, "ò": .1, "ô": .1, "õ": .1 },
"ò": { "o": .1, "ó": .1, "ò": 0, "ô": .1, "õ": .1 },
"ô": { "o": .1, "ó": .1, "ò": .1, "ô": 0, "õ": .1 },
"õ": { "o": .1, "ó": .1, "ò": .1, "ô": .1, "õ": 0 },
"u": { "u": 0, "ú": .1, "ù": .1, "û": .1, "ũ": .1 },
"ú": { "u": .1, "ú": 0, "ù": .1, "û": .1, "ũ": .1 },
"ù": { "u": .1, "ú": .1, "ù": 0, "û": .1, "ũ": .1 },
"û": { "u": .1, "ú": .1, "ù": .1, "û": 0, "ũ": .1 },
"ũ": { "u": .1, "ú": .1, "ù": .1, "û": .1, "ũ": 0 },
"y": { "y": 0, "ý": .1, "ỳ": .1, "ŷ": .1, "ỹ": .1 },
"ý": { "y": .1, "ý": 0, "ỳ": .1, "ŷ": .1, "ỹ": .1 },
"ỳ": { "y": .1, "ý": .1, "ỳ": 0, "ŷ": .1, "ỹ": .1 },
"ŷ": { "y": .1, "ý": .1, "ỳ": .1, "ŷ": 0, "ỹ": .1 },
"ỹ": { "y": .1, "ý": .1, "ỳ": .1, "ŷ": .1, "ỹ": 0 },
## consonnes
"b": { "b": 0, "d": .8, "h": .9 },
"c": { "c": 0, "ç": .1, "k": .5, "q": .5, "s": .5, "x": .5, "z": .8 },
"ç": { "c": .1, "ç": 0, "k": .5, "q": .5, "s": .5, "x": .5, "z": .8 },
"d": { "d": 0, "b": .8 },
"f": { "f": 0, "v": .8 },
"g": { "g": 0, "j": .5, "q": .8 },
"h": { "h": 0, "b": .9 },
"j": { "j": 0, "g": .5, "i": .8 },
"k": { "k": 0, "c": .5, "q": .1, "x": .5 },
"l": { "l": 0, "i": .8 },
"m": { "m": 0, "n": .6 },
"n": { "n": 0, "ñ": .1, "m": .6, "r": .8 },
"p": { "p": 0, "q": .8 },
"q": { "q": 0, "c": .5, "k": .1, "p": .8, "g": .8 },
"r": { "r": 0, "n": .8, "j": .9 },
"s": { "s": 0, "c": .5, "ç": .1, "x": .5, "z": .5 },
"t": { "t": 0, "d": .9 },
"v": { "v": 0, "f": .8, "w": .2 },
"w": { "w": 0, "v": .2 },
"x": { "x": 0, "c": .5, "k": .5, "q": .5, "s": .5 },
"z": { "z": 0, "s": .5 }
}
def distanceBetweenChars (c1, c2):
"returns a float between 0 and 1"
if c1 == c2:
return 0
if c1 not in dDistanceBetweenChars:
return 1
return dDistanceBetweenChars[c1].get(c2, 1)
aVowel = set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ")
aConsonant = set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ")
aDouble = set("bcdfjklmnprstzBCDFJKLMNPRSTZ") # letters that may be used twice successively
# Similar chars
d1to1 = {
"'": "'’", # U+0027: apostrophe droite
"’": "’", # U+2019: apostrophe typographique (sera utilisée par défaut)
"ʼ": "ʼ’", # U+02BC: Lettre modificative apostrophe
"‘": "‘’", # U+2018: guillemet-apostrophe culbuté
"‛": "‛’", # U+201B: guillemet-virgule supérieur culbuté
"´": "´’", # U+00B4: accent aigu
"`": "`’", # U+0060: accent grave
"′": "′’", # U+2032: prime
"‵": "‵’", # U+2035: prime réfléchi
"՚": "՚’", # U+055A: apostrophe arménienne
"ꞌ": "ꞌ’", # U+A78C: latin minuscule saltillo
"Ꞌ": "Ꞌ’", # U+A78B: latin majuscule saltillo
"1": "1₁liîLIÎ",
"2": "2₂zZ",
"3": "3₃eéèêEÉÈÊ",
"4": "4₄aàâAÀÂ",
"5": "5₅sgSG",
"6": "6₆bdgBDG",
"7": "7₇ltLT",
"8": "8₈bB",
"9": "9₉gbdGBD",
"0": "0₀oôOÔ",
"a": "aAàÀâÂáÁäÄāĀæÆ",
"A": "AaÀàÂâÁáÄäĀ⯿",
"à": "aAàÀâÂáÁäÄāĀæÆ",
"À": "AaÀàÂâÁáÄäĀ⯿",
"â": "aAàÀâÂáÁäÄāĀæÆ",
"Â": "AaÀàÂâÁáÄäĀ⯿",
"á": "aAàÀâÂáÁäÄāĀæÆ",
"Á": "AaÀàÂâÁáÄäĀ⯿",
"ä": "aAàÀâÂáÁäÄāĀæÆ",
"Ä": "AaÀàÂâÁáÄäĀ⯿",
"æ": "æÆéÉaA",
"Æ": "ÆæÉéAa",
"b": "bB",
"B": "Bb",
"c": "cCçÇsSkKqQśŚŝŜ",
"C": "CcÇçSsKkQqŚśŜŝ",
"ç": "cCçÇsSkKqQśŚŝŜ",
"Ç": "CcÇçSsKkQqŚśŜŝ",
"d": "dDðÐ",
"D": "DdÐð",
"e": "eEéÉèÈêÊëËēĒœŒ",
"E": "EeÉéÈèÊêËëĒēŒœ",
"é": "eEéÉèÈêÊëËēĒœŒ",
"É": "EeÉéÈèÊêËëĒēŒœ",
"ê": "eEéÉèÈêÊëËēĒœŒ",
"Ê": "EeÉéÈèÊêËëĒēŒœ",
"è": "eEéÉèÈêÊëËēĒœŒ",
"È": "EeÉéÈèÊêËëĒēŒœ",
"ë": "eEéÉèÈêÊëËēĒœŒ",
"Ë": "EeÉéÈèÊêËëĒēŒœ",
"f": "fF",
"F": "Ff",
"g": "gGjJĵĴ",
"G": "GgJjĴĵ",
"h": "hH",
"H": "Hh",
"i": "iIîÎïÏyYíÍìÌīĪÿŸ",
"I": "IiÎîÏïYyÍíÌìĪīŸÿ",
"î": "iIîÎïÏyYíÍìÌīĪÿŸ",
"Î": "IiÎîÏïYyÍíÌìĪīŸÿ",
"ï": "iIîÎïÏyYíÍìÌīĪÿŸ",
"Ï": "IiÎîÏïYyÍíÌìĪīŸÿ",
"í": "iIîÎïÏyYíÍìÌīĪÿŸ",
"Í": "IiÎîÏïYyÍíÌìĪīŸÿ",
"ì": "iIîÎïÏyYíÍìÌīĪÿŸ",
"Ì": "IiÎîÏïYyÍíÌìĪīŸÿ",
"j": "jJgGĵĴ",
"J": "JjGgĴĵ",
"k": "kKcCqQ",
"K": "KkCcQq",
"l": "lLłŁ",
"L": "LlŁł",
"m": "mMḿḾ",
"M": "MmḾḿ",
"n": "nNñÑńŃǹǸ",
"N": "NnÑñŃńǸǹ",
"o": "oOôÔóÓòÒöÖōŌœŒ",
"O": "OoÔôÓóÒòÖöŌōŒœ",
"ô": "oOôÔóÓòÒöÖōŌœŒ",
"Ô": "OoÔôÓóÒòÖöŌōŒœ",
"ó": "oOôÔóÓòÒöÖōŌœŒ",
"Ó": "OoÔôÓóÒòÖöŌōŒœ",
"ò": "oOôÔóÓòÒöÖōŌœŒ",
"Ò": "OoÔôÓóÒòÖöŌōŒœ",
"ö": "oOôÔóÓòÒöÖōŌœŒ",
"Ö": "OoÔôÓóÒòÖöŌōŒœ",
"œ": "œŒoOôÔeEéÉèÈêÊëË",
"Œ": "ŒœOoÔôEeÉéÈèÊêËë",
"p": "pPṕṔ",
"P": "PpṔṕ",
"q": "qQcCkK",
"Q": "QqCcKk",
"r": "rRŕŔ",
"R": "RrŔŕ",
"s": "sScCçÇśŚŝŜ",
"S": "SsCcÇ猜Ŝŝ",
"ś": "sScCçÇśŚŝŜ",
"Ś": "SsCcÇ猜Ŝŝ",
"ŝ": "sScCçÇśŚŝŜ",
"Ŝ": "SsCcÇ猜Ŝŝ",
"t": "tT",
"T": "Tt",
"u": "uUûÛùÙüÜúÚūŪ",
"U": "UuÛûÙùÜüÚúŪū",
"û": "uUûÛùÙüÜúÚūŪ",
"Û": "UuÛûÙùÜüÚúŪū",
"ù": "uUûÛùÙüÜúÚūŪ",
"Ù": "UuÛûÙùÜüÚúŪū",
"ü": "uUûÛùÙüÜúÚūŪ",
"Ü": "UuÛûÙùÜüÚúŪū",
"ú": "uUûÛùÙüÜúÚūŪ",
"Ú": "UuÛûÙùÜüÚúŪū",
"v": "vVwW",
"V": "VvWw",
"w": "wWvV",
"W": "WwVv",
"x": "xXcCkK",
"X": "XxCcKk",
"y": "yYiIîÎÿŸŷŶýÝỳỲȳȲ",
"Y": "YyIiÎîŸÿŶŷÝýỲỳȲȳ",
"ÿ": "yYiIîÎÿŸŷŶýÝỳỲȳȲ",
"Ÿ": "YyIiÎîŸÿŶŷÝýỲỳȲȳ",
"ŷ": "yYiIîÎÿŸŷŶýÝỳỲȳȲ",
"Ŷ": "YyIiÎîŸÿŶŷÝýỲỳȲȳ",
"ý": "yYiIîÎÿŸŷŶýÝỳỲȳȲ",
"Ý": "YyIiÎîŸÿŶŷÝýỲỳȲȳ",
"ỳ": "yYiIîÎÿŸŷŶýÝỳỲȳȲ",
"Ỳ": "YyIiÎîŸÿŶŷÝýỲỳȲȳ",
"z": "zZsSẑẐźŹ",
"Z": "ZzSsẐẑŹź",
}
d1toX = {
"æ": ("ae",),
"Æ": ("AE",),
"b": ("bb",),
"B": ("BB",),
"c": ("cc", "ss", "qu", "ch"),
"C": ("CC", "SS", "QU", "CH"),
"d": ("dd",),
"D": ("DD",),
"é": ("ai", "ei"),
"É": ("AI", "EI"),
"f": ("ff", "ph"),
"F": ("FF", "PH"),
"g": ("gu", "ge", "gg", "gh"),
"G": ("GU", "GE", "GG", "GH"),
"j": ("jj", "dj"),
"J": ("JJ", "DJ"),
"k": ("qu", "ck", "ch", "cu", "kk", "kh"),
"K": ("QU", "CK", "CH", "CU", "KK", "KH"),
"l": ("ll",),
"L": ("LL",),
"m": ("mm", "mn"),
"M": ("MM", "MN"),
"n": ("nn", "nm", "mn"),
"N": ("NN", "NM", "MN"),
"o": ("au", "eau"),
"O": ("AU", "EAU"),
"œ": ("oe", "eu"),
"Œ": ("OE", "EU"),
"p": ("pp", "ph"),
"P": ("PP", "PH"),
"q": ("qu", "ch", "cq", "ck", "kk"),
"Q": ("QU", "CH", "CQ", "CK", "KK"),
"r": ("rr",),
"R": ("RR",),
"s": ("ss", "sh"),
"S": ("SS", "SH"),
"t": ("tt", "th"),
"T": ("TT", "TH"),
"x": ("cc", "ct", "xx"),
"X": ("CC", "CT", "XX"),
"z": ("ss", "zh"),
"Z": ("SS", "ZH"),
}
def get1toXReplacement (cPrev, cCur, cNext):
"return tuple of replacements for <cCur>"
if cCur in aConsonant and (cPrev in aConsonant or cNext in aConsonant):
return ()
return d1toX.get(cCur, ())
d2toX = {
"am": ("an", "en", "em"),
"AM": ("AN", "EN", "EM"),
"an": ("am", "en", "em"),
"AN": ("AM", "EN", "EM"),
"au": ("eau", "o", "ô"),
"AU": ("EAU", "O", "Ô"),
"em": ("an", "am", "en"),
"EM": ("AN", "AM", "EN"),
"en": ("an", "am", "em"),
"EN": ("AN", "AM", "EM"),
"ae": ("æ", "é"),
"AE": ("Æ", "É"),
"ai": ("ei", "é", "è", "ê", "ë"),
"AI": ("EI", "É", "È", "Ê", "Ë"),
"ei": ("ai", "é", "è", "ê", "ë"),
"EI": ("AI", "É", "È", "Ê", "Ë"),
"ch": ("sh", "c", "ss"),
"CH": ("SH", "C", "SS"),
"ck": ("qu", "q"),
"CK": ("QU", "Q"),
"ct": ("x", "cc"),
"CT": ("X", "CC"),
"gg": ("gu",),
"GG": ("GU",),
"gu": ("gg",),
"GU": ("GG",),
"oa": ("oi",),
"OA": ("OI",),
"oe": ("œ",),
"OE": ("Œ",),
"oi": ("oa", "oie"),
"OI": ("OA", "OIE"),
"ph": ("f",),
"PH": ("F",),
"qu": ("q", "cq", "ck", "c", "k"),
"QU": ("Q", "CQ", "CK", "C", "K"),
"ss": ("c", "ç"),
"SS": ("C", "Ç"),
"un": ("ein",),
"UN": ("EIN",),
}
# End of word
dFinal1 = {
"a": ("as", "at", "ant", "ah"),
"A": ("AS", "AT", "ANT", "AH"),
"c": ("ch", "que"),
"C": ("CH", "QUE"),
"e": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait", "ent", "eh"),
"E": ("ET", "ER", "ETS", "ÉE", "EZ", "AI", "AIS", "AIT", "ENT", "EH"),
"é": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
"É": ("ET", "ER", "ETS", "ÉE", "EZ", "AI", "AIS", "AIT"),
"è": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
"È": ("ET", "ER", "ETS", "ÉE", "EZ", "AI", "AIS", "AIT"),
"ê": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
"Ê": ("ET", "ER", "ETS", "ÉE", "EZ", "AI", "AIS", "AIT"),
"ë": ("et", "er", "ets", "ée", "ez", "ai", "ais", "ait"),
"Ë": ("ET", "ER", "ETS", "ÉE", "EZ", "AI", "AIS", "AIT"),
"g": ("gh",),
"G": ("GH",),
"i": ("is", "it", "ie", "in"),
"I": ("IS", "IT", "IE", "IN"),
"k": ("que",),
"K": ("QUE",),
"n": ("nt", "nd", "ns", "nh"),
"N": ("NT", "ND", "NS", "NH"),
"o": ("aut", "ot", "os"),
"O": ("AUT", "OT", "OS"),
"ô": ("aut", "ot", "os"),
"Ô": ("AUT", "OT", "OS"),
"ö": ("aut", "ot", "os"),
"Ö": ("AUT", "OT", "OS"),
"p": ("ph",),
"P": ("PH",),
"s": ("sh",),
"S": ("SH",),
"t": ("th",),
"T": ("TH",),
"u": ("ut", "us", "uh"),
"U": ("UT", "US", "UH"),
}
dFinal2 = {
"ai": ("aient", "ais", "et"),
"AI": ("AIENT", "AIS", "ET"),
"an": ("ant", "ent"),
"AN": ("ANT", "ENT"),
"en": ("ent", "ant", "ène", "enne"),
"EN": ("ENT", "ANT", "ÈNE", "ENNE"),
"ei": ("ait", "ais"),
"EI": ("AIT", "AIS"),
"on": ("ons", "ont"),
"ON": ("ONS", "ONT"),
"oi": ("ois", "oit", "oix"),
"OI": ("OIS", "OIT", "OIX"),
}