Храните записи с испанскими акцентами в базе данных, используя Python - PullRequest
0 голосов
/ 30 мая 2018

Мне нужно очистить базу данных на испанском языке, но требуется, чтобы я оставил отметки ударения.

Например, если БД содержит «Administración» и «Administracion», я должен идентифицировать их как равные, но оставить тот, на котором стоит знак акцента.После некоторых исследований каждое решение, например, переключение Unicode в ASCII или использование PyEnchant, оставляет решение без знака акцента.

Существует ли какая-либо библиотека (для Python 3.5) или способ определить правильное и сохранить его?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Что вы думаете об индексации запросов к вашей базе данных в формате dict по их эквивалентности ascii?Предполагая, что существует только одна форма ключа 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']

0 голосов
/ 01 июля 2018

Предостережения

В зависимости от содержимого базы данных, это вполне может быть нетривиальной задачей, поскольку, хотя могут быть и орфографические ошибки:

  • *administracion administración

Есть также много пар слов на испанском языке, которые отличаются только акцентом, но оба являются допустимыми словами:

  • ejército ejercito ejercitó |tu

Если вы рассматриваете только существительные, это число значительно уменьшается, в основном до иностранных заимствований с различными ударениями:

  • beisbol béisbol

и несколько родных слов несколько написаний :

  • período periodo |reúma reuma

Запрос

Если вы вряд ли столкнетесь с такими случаями, вы можете использовать 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

Это вернет все пары слов, где появляются акцентированные и без акцентов формы.Вы можете адаптировать это для редактирования / удаления / очистки записей по мере необходимости.


Пример

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"
...