Reemplazo de sinónimos y antónimos
Reemplazo de palabras con sinónimos comunes
Al trabajar con PNL, especialmente en el caso del análisis de frecuencia y la indexación de texto, siempre es beneficioso comprimir el vocabulario sin perder significado porque ahorra mucha memoria. Para lograr esto, debemos definir el mapeo de una palabra con sus sinónimos. En el siguiente ejemplo, crearemos una clase llamadaword_syn_replacer que se puede utilizar para reemplazar las palabras con sus sinónimos comunes.
Ejemplo
Primero, importe el paquete necesario re para trabajar con expresiones regulares.
import re
from nltk.corpus import wordnet
A continuación, cree la clase que toma una asignación de reemplazo de palabras:
class word_syn_replacer(object):
def __init__(self, word_map):
self.word_map = word_map
def replace(self, word):
return self.word_map.get(word, word)
Guarde este programa de Python (digamos replacesyn.py) y ejecútelo desde el símbolo del sistema de Python. Después de ejecutarlo, importeword_syn_replacerclass cuando desee reemplazar palabras con sinónimos comunes. Veamos cómo.
from replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)
Salida
'birthday'
Ejemplo de implementación completo
import re
from nltk.corpus import wordnet
class word_syn_replacer(object):
def __init__(self, word_map):
self.word_map = word_map
def replace(self, word):
return self.word_map.get(word, 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 replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)
Salida
'birthday'
La desventaja del método anterior es que deberíamos tener que codificar los sinónimos en un diccionario de Python. Tenemos dos mejores alternativas en forma de archivo CSV y YAML. Podemos guardar nuestro vocabulario de sinónimos en cualquiera de los archivos mencionados anteriormente y podemos construirword_mapdiccionario de ellos. Entendamos el concepto con la ayuda de ejemplos.
Usando archivo CSV
Para utilizar el archivo CSV para este propósito, el archivo debe tener dos columnas, la primera columna consta de una palabra y la segunda columna consta de los sinónimos destinados a reemplazarla. Guardemos este archivo comosyn.csv. En el siguiente ejemplo, crearemos una clase llamada CSVword_syn_replacer que se extiende word_syn_replacer en replacesyn.py archivo y se utilizará para construir el word_map diccionario de syn.csv archivo.
Ejemplo
Primero, importe los paquetes necesarios.
import csv
A continuación, cree la clase que toma una asignación de reemplazo de palabras:
class CSVword_syn_replacer(word_syn_replacer):
def __init__(self, fname):
word_map = {}
for line in csv.reader(open(fname)):
word, syn = line
word_map[word] = syn
super(Csvword_syn_replacer, self).__init__(word_map)
Después de ejecutarlo, importe CSVword_syn_replacerclass cuando desee reemplazar palabras con sinónimos comunes. ¿Veamos cómo?
from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)
Salida
'birthday'
Ejemplo de implementación completo
import csv
class CSVword_syn_replacer(word_syn_replacer):
def __init__(self, fname):
word_map = {}
for line in csv.reader(open(fname)):
word, syn = line
word_map[word] = syn
super(Csvword_syn_replacer, self).__init__(word_map)
Ahora, una vez que haya guardado el programa anterior y lo haya ejecutado, puede importar la clase y usarla de la siguiente manera:
from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)
Salida
'birthday'
Usando archivo YAML
Como hemos usado el archivo CSV, también podemos usar el archivo YAML para este propósito (debemos tener PyYAML instalado). Guardemos el archivo comosyn.yaml. En el siguiente ejemplo, crearemos una clase llamada YAMLword_syn_replacer que se extiende word_syn_replacer en replacesyn.py archivo y se utilizará para construir el word_map diccionario de syn.yaml archivo.
Ejemplo
Primero, importe los paquetes necesarios.
import yaml
A continuación, cree la clase que toma una asignación de reemplazo de palabras:
class YAMLword_syn_replacer(word_syn_replacer):
def __init__(self, fname):
word_map = yaml.load(open(fname))
super(YamlWordReplacer, self).__init__(word_map)
Después de ejecutarlo, importe YAMLword_syn_replacerclass cuando desee reemplazar palabras con sinónimos comunes. ¿Veamos cómo?
from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)
Salida
'birthday'
Ejemplo de implementación completo
import yaml
class YAMLword_syn_replacer(word_syn_replacer):
def __init__(self, fname):
word_map = yaml.load(open(fname))
super(YamlWordReplacer, self).__init__(word_map)
Ahora, una vez que haya guardado el programa anterior y lo haya ejecutado, puede importar la clase y usarla de la siguiente manera:
from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)
Salida
'birthday'
Reemplazo de antónimo
Como sabemos, un antónimo es una palabra que tiene el significado opuesto de otra palabra, y lo opuesto al reemplazo de sinónimos se llama reemplazo de antónimo. En esta sección, trataremos con el reemplazo de antónimos, es decir, reemplazando palabras con antónimos inequívocos usando WordNet. En el siguiente ejemplo, crearemos una clase llamadaword_antonym_replacer que tienen dos métodos, uno para reemplazar la palabra y otro para eliminar las negaciones.
Ejemplo
Primero, importe los paquetes necesarios.
from nltk.corpus import wordnet
A continuación, cree la clase llamada word_antonym_replacer -
class word_antonym_replacer(object):
def replace(self, word, pos=None):
antonyms = set()
for syn in wordnet.synsets(word, pos=pos):
for lemma in syn.lemmas():
for antonym in lemma.antonyms():
antonyms.add(antonym.name())
if len(antonyms) == 1:
return antonyms.pop()
else:
return None
def replace_negations(self, sent):
i, l = 0, len(sent)
words = []
while i < l:
word = sent[i]
if word == 'not' and i+1 < l:
ant = self.replace(sent[i+1])
if ant:
words.append(ant)
i += 2
continue
words.append(word)
i += 1
return words
Guarde este programa de Python (por ejemplo, replaceantonym.py) y ejecútelo desde el símbolo del sistema de Python. Después de ejecutarlo, importeword_antonym_replacerclass cuando desee reemplazar palabras con sus antónimos inequívocos. Veamos cómo.
from replacerantonym import word_antonym_replacer
rep_antonym = word_antonym_replacer ()
rep_antonym.replace(‘uglify’)
Salida
['beautify'']
sentence = ["Let us", 'not', 'uglify', 'our', 'country']
rep_antonym.replace _negations(sentence)
Salida
["Let us", 'beautify', 'our', 'country']
Ejemplo de implementación completo
nltk.corpus import wordnet
class word_antonym_replacer(object):
def replace(self, word, pos=None):
antonyms = set()
for syn in wordnet.synsets(word, pos=pos):
for lemma in syn.lemmas():
for antonym in lemma.antonyms():
antonyms.add(antonym.name())
if len(antonyms) == 1:
return antonyms.pop()
else:
return None
def replace_negations(self, sent):
i, l = 0, len(sent)
words = []
while i < l:
word = sent[i]
if word == 'not' and i+1 < l:
ant = self.replace(sent[i+1])
if ant:
words.append(ant)
i += 2
continue
words.append(word)
i += 1
return words
Ahora, una vez que haya guardado el programa anterior y lo haya ejecutado, puede importar la clase y usarla de la siguiente manera:
from replacerantonym import word_antonym_replacer
rep_antonym = word_antonym_replacer ()
rep_antonym.replace(‘uglify’)
sentence = ["Let us", 'not', 'uglify', 'our', 'country']
rep_antonym.replace _negations(sentence)
Salida
["Let us", 'beautify', 'our', 'country']