miércoles, 29 de agosto de 2018

Funcion fonetica para faltas ortograficas


La siguiente función reemplaza letras con similitud fonética en idioma español. Esto para reducir la vectorización de texto en escenarios de documentos con faltas ortográficas (como texto de redes sociales).

Para otras técnicas ver:
How to Write a Spelling Corrector, by Peter Norvin
Fuzzy matching (Soundex, NYSIIS, Metaphone)



script python:
import re 

def clean_fonetic(xtext, py='py3'):
  xtext = str(xtext)
  xtext = xtext.lower()
  
  xtext = re.sub('w', 'u', xtext)

  xtext = re.sub('np', 'mp', xtext) 
  xtext = re.sub('nb', 'mb', xtext)

  xtext = re.sub('ce', 'se', xtext)
  xtext = re.sub('ci', 'si', xtext)

  xtext = re.sub('v', 'b', xtext) 

  xtext = re.sub('z', 's', xtext) 

  xtext = re.sub('lla', 'ya', xtext)
  xtext = re.sub('lle', 'ye', xtext)
  xtext = re.sub('lli', 'yi', xtext)
  xtext = re.sub('llo', 'yo', xtext)
  xtext = re.sub('llu', 'yu', xtext)

  xtext = re.sub('ka', 'ca', xtext)
  xtext = re.sub(r'\bk\b', 'que', xtext)  
  xtext = re.sub(r'\bq\b', 'que', xtext)  
  xtext = re.sub('ke', 'que', xtext)
  xtext = re.sub('ki', 'qui', xtext)
  xtext = re.sub('ko', 'co', xtext)
  xtext = re.sub('ku', 'cu', xtext)

  xtext = re.sub('kra', 'cra', xtext)
  xtext = re.sub('kre', 'cre', xtext)
  xtext = re.sub('kri', 'cri', xtext)
  xtext = re.sub('kro', 'cro', xtext)
  xtext = re.sub('kru', 'cru', xtext)

  xtext = re.sub('ga', 'ga', xtext)
  xtext = re.sub('ge', 'je', xtext)
  xtext = re.sub('gi', 'ji', xtext)
  xtext = re.sub('go', 'go', xtext)
  xtext = re.sub('gu', 'gu', xtext)

  xtext = re.sub(r'\bha', 'a', xtext)
  xtext = re.sub(r'\bhe', 'e', xtext)
  xtext = re.sub(r'\bhi', 'i', xtext)
  xtext = re.sub(r'\bho', 'o', xtext)
  xtext = re.sub(r'\bhu', 'u', xtext)

  xtext = re.sub(r'\bexp', 'esp', xtext)
  xtext = re.sub(r'\bexc', 'ese', xtext)
  xtext = re.sub(r'\bexs', 'ese', xtext)
  xtext = re.sub(r'\bext', 'est', xtext)
  # empiezan por ex+[vocal]
  xtext = re.sub(r'\bexa', 'esa', xtext)
  xtext = re.sub(r'\bexe', 'ese', xtext)
  xtext = re.sub(r'\bexi', 'esi', xtext)
  xtext = re.sub(r'\bexo', 'eso', xtext)
  xtext = re.sub(r'\bexu', 'esu', xtext)
  # termian en exion ixion 
  xtext = re.sub(r'exion\b', 'esion', xtext)
  xtext = re.sub(r'ixion\b', 'ision', xtext)
  xtext = re.sub(r'axion\b', 'asion', xtext)

  xtext = re.sub(r'\be\b', 'y', xtext)
  xtext = re.sub(r'\bi\b', 'y', xtext)
  xtext = re.sub(r'\bu\b', 'o', xtext)

  xtext = re.sub(r'\bx\b', 'por', xtext)

  xtext = re.sub(r'([a-z])\1+', r'\1', xtext) 

  return unicode(xtext) if py=='py2' else str(xtext)

txt = 'verguenza, berguenza, berguensa, berrrrrguensaaa'
clean_fonetic(txt)
# berguensa, berguensa, berguensa, berguensa

No hay comentarios:

Publicar un comentario