Substituição de Sinônimo e Antônimo

Substituindo palavras por sinônimos comuns

Ao trabalhar com PNL, especialmente no caso de análise de frequência e indexação de texto, é sempre benéfico compactar o vocabulário sem perder o significado, pois isso economiza muita memória. Para conseguir isso, devemos definir o mapeamento de uma palavra para seus sinônimos. No exemplo abaixo, estaremos criando uma classe chamadaword_syn_replacer que pode ser usado para substituir as palavras por seus sinônimos comuns.

Exemplo

Primeiro, importe o pacote necessário re para trabalhar com expressões regulares.

import re
from nltk.corpus import wordnet

Em seguida, crie a classe que usa um mapeamento de substituição de palavras -

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)

Salve este programa python (digamos, replacesyn.py) e execute-o no prompt de comando python. Depois de executá-lo, importeword_syn_replacerclasse quando você deseja substituir palavras por sinônimos comuns. Vamos ver como.

from replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)

Resultado

'birthday'

Exemplo de implementação 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)

Agora, depois de salvar o programa acima e executá-lo, você pode importar a classe e usá-la da seguinte maneira -

from replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)

Resultado

'birthday'

A desvantagem do método acima é que devemos codificar os sinônimos em um dicionário Python. Temos duas alternativas melhores na forma de arquivo CSV e YAML. Podemos salvar nosso vocabulário de sinônimos em qualquer um dos arquivos mencionados acima e podemos construirword_mapdicionário deles. Vamos entender o conceito com a ajuda de exemplos.

Usando arquivo CSV

Para utilizar o arquivo CSV para esse fim, o arquivo deve ter duas colunas, a primeira coluna consiste em palavra e a segunda coluna consiste nos sinônimos destinados a substituí-la. Vamos salvar este arquivo comosyn.csv. No exemplo abaixo, estaremos criando uma classe chamada CSVword_syn_replacer que irá estender word_syn_replacer dentro replacesyn.py arquivo e será usado para construir o word_map dicionário de syn.csv Arquivo.

Exemplo

Primeiro, importe os pacotes necessários.

import csv

Em seguida, crie a classe que usa um mapeamento de substituição de palavras -

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)

Depois de executá-lo, importe CSVword_syn_replacerclasse quando você deseja substituir palavras por sinônimos comuns. Vamos ver como?

from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)

Resultado

'birthday'

Exemplo de implementação 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)

Agora, depois de salvar o programa acima e executá-lo, você pode importar a classe e usá-la da seguinte maneira -

from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)

Resultado

'birthday'

Usando o arquivo YAML

Como usamos o arquivo CSV, também podemos usar o arquivo YAML para esse fim (devemos ter o PyYAML instalado). Vamos salvar o arquivo comosyn.yaml. No exemplo abaixo, estaremos criando uma classe chamada YAMLword_syn_replacer que irá estender word_syn_replacer dentro replacesyn.py arquivo e será usado para construir o word_map dicionário de syn.yaml Arquivo.

Exemplo

Primeiro, importe os pacotes necessários.

import yaml

Em seguida, crie a classe que usa um mapeamento de substituição de palavras -

class YAMLword_syn_replacer(word_syn_replacer):
   def __init__(self, fname):
   word_map = yaml.load(open(fname))
   super(YamlWordReplacer, self).__init__(word_map)

Depois de executá-lo, importe YAMLword_syn_replacerclasse quando você deseja substituir palavras por sinônimos comuns. Vamos ver como?

from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)

Resultado

'birthday'

Exemplo de implementação 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)

Agora, depois de salvar o programa acima e executá-lo, você pode importar a classe e usá-la da seguinte maneira -

from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)

Resultado

'birthday'

Substituto do antônimo

Como sabemos, um antônimo é uma palavra com significado oposto a outra palavra, e o oposto de substituição de sinônimo é chamado de substituição de antônimo. Nesta seção, estaremos lidando com a substituição de antônimos, ou seja, substituindo palavras com antônimos inequívocos usando o WordNet. No exemplo abaixo, estaremos criando uma classe chamadaword_antonym_replacer que possuem dois métodos, um para substituir a palavra e outro para remover as negações.

Exemplo

Primeiro, importe os pacotes necessários.

from nltk.corpus import wordnet

Em seguida, crie a classe chamada 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

Salve este programa python (por exemplo, replaceeantonym.py) e execute-o no prompt de comando do python. Depois de executá-lo, importeword_antonym_replacerclasse quando você deseja substituir palavras por seus antônimos inequívocos. Vamos ver como.

from replacerantonym import word_antonym_replacer
rep_antonym = word_antonym_replacer ()
rep_antonym.replace(‘uglify’)

Resultado

['beautify'']
sentence = ["Let us", 'not', 'uglify', 'our', 'country']
rep_antonym.replace _negations(sentence)

Resultado

["Let us", 'beautify', 'our', 'country']

Exemplo de implementação 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

Agora, depois de salvar o programa acima e executá-lo, você pode importar a classe e usá-la da seguinte maneira -

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)

Resultado

["Let us", 'beautify', 'our', 'country']