使用 Python 在数据库中保留带有西班牙口音的记录

Keep records with Spanish accents in Database using Python

我需要清除一个西班牙语数据库,但要求我必须保留重音符号。

例如,如果数据库包含 "Administración" 和 "Administracion",我必须将它们标识为相等但保留带有重音符号的那个。经过一些研究,每一个解决方案,比如将 Unicode 转换为 ASCII 或使用 PyEnchant,保留没有重音符号的那个。

是否有任何库(对于 Python 3.5)或确定正确的库并保留它的方法?

注意事项

根据数据库的内容,这可能是一项艰巨的任务,因为尽管可能存在拼写错误:

  • *administracion administración

西班牙语中还有许多单词对,它们只是口音不同,但都是有效单词:

  • ejército ejercito ejercitó | tu

如果你只考虑名词,这个数字会减少很多,主要是 foreign loanwords 不同的重音:

  • beisbol béisbol

和一些母语单词multiple spellings:

  • período periodo | reúmareuma

查询

如果您不太可能遇到这种情况,您可以按照以下行使用 sql 查询:

SELECT a.word AS "Good word", b.word AS "Bad word"
FROM   spanish_db AS a
JOIN   spanish_db AS b

--Spanish words have at most one accent so can safely nest REPLACE
ON     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(a.word, "á", "a"), 
                                                       "é", "e"), 
                                                       "í", "i"), 
                                                       "ó", "o"), 
                                                       "u", "u") = b.word

--So as not to match identical words
AND    a.word != b.word

这将 return 所有出现重音和非重音形式的单词对。您可以根据需要将其适应 edit/delete/cleanse 条目。


例子

Good word       Bad word
"acedía"        "acedia"
"aeróbic"       "aerobic"
"aeróstato"     "aerostato"
"afrodisíaco"   "afrodisiaco"
"alcalá"        "alcala"
"alvéolo"       "alveolo"
"alérgeno"      "alergeno"
"amoníaco"      "amoniaco"
"anémona"       "anemona"
"arcén"         "arcen"

您如何看待通过 ascii 等价物在 dict 中为您的数据库查询编制索引?假设只有一种形式的 ascii 密钥:

def ascii_word(word):
   accents=(("á","a"), ("é","e"), ("í","i"), ("ó","o"), ("ú","u"), ("ü","u"), ("ñ","n"))
   for acc in accents: word=word.replace(acc[0],acc[1])
   return word

query_result = ["Administración", "Administracion", "si", "sí", "hola"]
filtered_dict={}

for s in query_result:
   ascii=ascii_word(s)
   if ascii in filtered_dict.keys(): 
      if s!=ascii: filtered_dict[ascii] = s
  else:
      filtered_dict[ascii] = s

  result=list(filtered_dict.values())
  print(result)

这会打印到 ['Administración', 'sí', 'hola']