Sostituzione di sinonimi e contrari
Sostituzione di parole con sinonimi comuni
Mentre si lavora con la PNL, soprattutto nel caso dell'analisi della frequenza e dell'indicizzazione del testo, è sempre utile comprimere il vocabolario senza perdere significato perché consente di risparmiare molta memoria. Per ottenere ciò, dobbiamo definire la mappatura di una parola sui suoi sinonimi. Nell'esempio seguente, creeremo una classe denominataword_syn_replacer che può essere utilizzato per sostituire le parole con i loro sinonimi comuni.
Esempio
Innanzitutto, importa il pacchetto necessario re lavorare con le espressioni regolari.
import re
from nltk.corpus import wordnet
Quindi, crea la classe che accetta una mappatura di sostituzione delle parole -
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)
Salva questo programma python (diciamo replacesyn.py) ed eseguilo dal prompt dei comandi di python. Dopo averlo eseguito, importaword_syn_replacerclasse quando si desidera sostituire le parole con sinonimi comuni. Vediamo come.
from replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)
Produzione
'birthday'
Esempio di implementazione 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)
Ora, una volta salvato il programma sopra ed eseguito, puoi importare la classe e usarla come segue:
from replacesyn import word_syn_replacer
rep_syn = word_syn_replacer ({‘bday’: ‘birthday’)
rep_syn.replace(‘bday’)
Produzione
'birthday'
Lo svantaggio del metodo sopra è che dovremmo codificare i sinonimi in un dizionario Python. Abbiamo due alternative migliori sotto forma di file CSV e YAML. Possiamo salvare il nostro vocabolario dei sinonimi in uno qualsiasi dei file sopra menzionati e possiamo costruireword_mapdizionario da loro. Cerchiamo di capire il concetto con l'aiuto di esempi.
Utilizzando il file CSV
Per utilizzare il file CSV a questo scopo, il file deve avere due colonne, la prima colonna è composta da parole e la seconda colonna è composta dai sinonimi destinati a sostituirla. Salviamo questo file comesyn.csv. Nell'esempio seguente, creeremo una classe denominata CSVword_syn_replacer che si estenderà word_syn_replacer in replacesyn.py file e verrà utilizzato per costruire il file word_map dizionario da syn.csv file.
Esempio
Innanzitutto, importa i pacchetti necessari.
import csv
Quindi, crea la classe che accetta una mappatura di sostituzione delle parole -
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)
Dopo averlo eseguito, importa CSVword_syn_replacerclasse quando si desidera sostituire le parole con sinonimi comuni. Vediamo come?
from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)
Produzione
'birthday'
Esempio di implementazione 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)
Ora, una volta salvato il programma sopra ed eseguito, puoi importare la classe e usarla come segue:
from replacesyn import CSVword_syn_replacer
rep_syn = CSVword_syn_replacer (‘syn.csv’)
rep_syn.replace(‘bday’)
Produzione
'birthday'
Utilizzando il file YAML
Poiché abbiamo utilizzato il file CSV, possiamo anche utilizzare il file YAML per questo scopo (dobbiamo avere PyYAML installato). Salviamo il file comesyn.yaml. Nell'esempio seguente, creeremo una classe denominata YAMLword_syn_replacer che si estenderà word_syn_replacer in replacesyn.py file e verrà utilizzato per costruire il file word_map dizionario da syn.yaml file.
Esempio
Innanzitutto, importa i pacchetti necessari.
import yaml
Quindi, crea la classe che accetta una mappatura di sostituzione delle parole -
class YAMLword_syn_replacer(word_syn_replacer):
def __init__(self, fname):
word_map = yaml.load(open(fname))
super(YamlWordReplacer, self).__init__(word_map)
Dopo averlo eseguito, importa YAMLword_syn_replacerclasse quando si desidera sostituire le parole con sinonimi comuni. Vediamo come?
from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)
Produzione
'birthday'
Esempio di implementazione 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)
Ora, una volta salvato il programma sopra ed eseguito, puoi importare la classe e usarla come segue:
from replacesyn import YAMLword_syn_replacer
rep_syn = YAMLword_syn_replacer (‘syn.yaml’)
rep_syn.replace(‘bday’)
Produzione
'birthday'
Sostituzione di Antonym
Come sappiamo che un antonimo è una parola che ha il significato opposto di un'altra parola, e l'opposto della sostituzione del sinonimo è chiamato sostituzione dell'antonimo. In questa sezione, tratteremo la sostituzione degli antonimi, ovvero la sostituzione di parole con contrari non ambigui utilizzando WordNet. Nell'esempio seguente, creeremo una classe denominataword_antonym_replacer che hanno due metodi, uno per sostituire la parola e l'altro per rimuovere le negazioni.
Esempio
Innanzitutto, importa i pacchetti necessari.
from nltk.corpus import wordnet
Quindi, crea la classe denominata 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
Salva questo programma python (ad esempio replaceantonym.py) ed eseguilo dal prompt dei comandi di python. Dopo averlo eseguito, importaword_antonym_replacerclass quando si desidera sostituire le parole con i loro contrari inequivocabili. Vediamo come.
from replacerantonym import word_antonym_replacer
rep_antonym = word_antonym_replacer ()
rep_antonym.replace(‘uglify’)
Produzione
['beautify'']
sentence = ["Let us", 'not', 'uglify', 'our', 'country']
rep_antonym.replace _negations(sentence)
Produzione
["Let us", 'beautify', 'our', 'country']
Esempio di implementazione 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
Ora, una volta salvato il programma sopra ed eseguito, puoi importare la classe e usarla come segue:
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)
Produzione
["Let us", 'beautify', 'our', 'country']