Kit de herramientas de lenguaje natural: reemplazo de palabras

La derivación y la lematización pueden considerarse como una especie de compresión lingüística. En el mismo sentido, el reemplazo de palabras se puede considerar como normalización de texto o corrección de errores.

Pero, ¿por qué necesitamos el reemplazo de palabras? Supongamos que si hablamos de tokenización, entonces tiene problemas con las contracciones (como no puedo, no lo haré, etc.). Entonces, para manejar estos problemas, necesitamos reemplazo de palabras. Por ejemplo, podemos reemplazar las contracciones con sus formas expandidas.

Reemplazo de palabras usando expresión regular

Primero, reemplazaremos palabras que coincidan con la expresión regular. Pero para esto debemos tener una comprensión básica de las expresiones regulares, así como del módulo python re. En el siguiente ejemplo, reemplazaremos la contracción con sus formas expandidas (por ejemplo, "no puedo" será reemplazado por "no puede"), todo eso usando expresiones regulares.

Ejemplo

Primero, importe el paquete necesario re para trabajar con expresiones regulares.

import re
from nltk.corpus import wordnet

A continuación, defina los patrones de reemplazo de su elección de la siguiente manera:

R_patterns = [
   (r'won\'t', 'will not'),
   (r'can\'t', 'cannot'),
   (r'i\'m', 'i am'),
   r'(\w+)\'ll', '\g<1> will'),
   (r'(\w+)n\'t', '\g<1> not'),
   (r'(\w+)\'ve', '\g<1> have'),
   (r'(\w+)\'s', '\g<1> is'),
   (r'(\w+)\'re', '\g<1> are'),
]

Ahora, cree una clase que pueda usarse para reemplazar palabras:

class REReplacer(object):
   def __init__(self, pattern = R_patterns):
      self.pattern = [(re.compile(regex), repl) for (regex, repl) in patterns]
   def replace(self, text):
      s = text
      for (pattern, repl) in self.pattern:
         s = re.sub(pattern, repl, s)
      return s

Guarde este programa de Python (digamos repRE.py) y ejecútelo desde el símbolo del sistema de Python. Después de ejecutarlo, importe la clase REReplacer cuando desee reemplazar palabras. Veamos cómo.

from repRE import REReplacer
rep_word = REReplacer()
rep_word.replace("I won't do it")
Output:
'I will not do it'
rep_word.replace("I can’t do it")
Output:
'I cannot do it'

Ejemplo de implementación completo

import re
from nltk.corpus import wordnet
R_patterns = [
   (r'won\'t', 'will not'),
   (r'can\'t', 'cannot'),
   (r'i\'m', 'i am'),
   r'(\w+)\'ll', '\g<1> will'),
   (r'(\w+)n\'t', '\g<1> not'),
   (r'(\w+)\'ve', '\g<1> have'),
   (r'(\w+)\'s', '\g<1> is'),
   (r'(\w+)\'re', '\g<1> are'),
]
class REReplacer(object):
def __init__(self, patterns=R_patterns):
   self.patterns = [(re.compile(regex), repl) for (regex, repl) in patterns]
def replace(self, text):
   s = text
   for (pattern, repl) in self.patterns:
      s = re.sub(pattern, repl, s)
   return s

Ahora, una vez que haya guardado el programa anterior y lo haya ejecutado, puede importar la clase y usarla de la siguiente manera:

from replacerRE import REReplacer
rep_word = REReplacer()
rep_word.replace("I won't do it")

Salida

'I will not do it'

Reemplazo antes del procesamiento de texto

Una de las prácticas comunes al trabajar con procesamiento de lenguaje natural (PNL) es limpiar el texto antes de procesarlo. En esta preocupación también podemos utilizar nuestroREReplacer clase creada anteriormente en el ejemplo anterior, como paso preliminar antes del procesamiento de texto, es decir, la tokenización.

Ejemplo

from nltk.tokenize import word_tokenize
from replacerRE import REReplacer
rep_word = REReplacer()
word_tokenize("I won't be able to do this now")
Output:
['I', 'wo', "n't", 'be', 'able', 'to', 'do', 'this', 'now']
word_tokenize(rep_word.replace("I won't be able to do this now"))
Output:
['I', 'will', 'not', 'be', 'able', 'to', 'do', 'this', 'now']

En la receta de Python anterior, podemos entender fácilmente la diferencia entre la salida del tokenizador de palabras sin y con el uso de reemplazo de expresiones regulares.

Eliminación de caracteres repetidos

¿Somos estrictamente gramaticales en nuestro lenguaje cotidiano? No lo estamos. Por ejemplo, a veces escribimos 'Hiiiiiiiiiiii Mohan' para enfatizar la palabra 'Hola'. Pero el sistema informático no sabe que "Hiiiiiiiiiiii" es una variación de la palabra "Hola". En el siguiente ejemplo, crearemos una clase llamadarep_word_removal que se puede utilizar para eliminar las palabras repetidas.

Ejemplo

Primero, importe el paquete necesario re para trabajar con expresiones regulares

import re
from nltk.corpus import wordnet

Ahora, cree una clase que se pueda usar para eliminar las palabras repetidas:

class Rep_word_removal(object):
   def __init__(self):
      self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
      self.repl = r'\1\2\3'
   def replace(self, word):
      if wordnet.synsets(word):
      return word
   repl_word = self.repeat_regexp.sub(self.repl, word)
   if repl_word != word:
      return self.replace(repl_word)
   else:
      return repl_word

Guarde este programa de Python (por ejemplo, removerepeat.py) y ejecútelo desde el símbolo del sistema de Python. Después de ejecutarlo, importeRep_word_removalclass cuando desee eliminar las palabras repetidas. ¿Veamos cómo?

from removalrepeat import Rep_word_removal
rep_word = Rep_word_removal()
rep_word.replace ("Hiiiiiiiiiiiiiiiiiiiii")
Output:
'Hi'
rep_word.replace("Hellooooooooooooooo")
Output:
'Hello'

Ejemplo de implementación completo

import re
from nltk.corpus import wordnet
class Rep_word_removal(object):
   def __init__(self):
      self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
      self.repl = r'\1\2\3'
   def replace(self, word):
      if wordnet.synsets(word):
         return word
   replace_word = self.repeat_regexp.sub(self.repl, word)
   if replace_word != word:
      return self.replace(replace_word)
   else:
      return replace_word

Ahora, una vez que haya guardado el programa anterior y lo haya ejecutado, puede importar la clase y usarla de la siguiente manera:

from removalrepeat import Rep_word_removal
rep_word = Rep_word_removal()
rep_word.replace ("Hiiiiiiiiiiiiiiiiiiiii")

Salida

'Hi'