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']