Remplacement des synonymes et des antonymes

Remplacement de mots par des synonymes courants

En travaillant avec la PNL, en particulier dans le cas de l'analyse fréquentielle et de l'indexation de texte, il est toujours avantageux de compresser le vocabulaire sans perdre de sens car cela économise beaucoup de mémoire. Pour y parvenir, nous devons définir la mise en correspondance d'un mot avec ses synonymes. Dans l'exemple ci-dessous, nous allons créer une classe nomméeword_syn_replacer qui peut être utilisé pour remplacer les mots par leurs synonymes communs.

Exemple

Tout d'abord, importez le package nécessaire re pour travailler avec des expressions régulières.

import re
from nltk.corpus import wordnet

Ensuite, créez la classe qui prend un mappage de remplacement de mot -

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)

Enregistrez ce programme python (disons replacesyn.py) et exécutez-le à partir de l'invite de commande python. Après l'avoir exécuté, importezword_syn_replacerclasse lorsque vous souhaitez remplacer des mots par des synonymes courants. Voyons comment.

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

Production

'birthday'

Exemple d'implémentation complet

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)

Maintenant, une fois que vous avez enregistré le programme ci-dessus et que vous l'avez exécuté, vous pouvez importer la classe et l'utiliser comme suit -

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

Production

'birthday'

L'inconvénient de la méthode ci-dessus est que nous devrions avoir à coder en dur les synonymes dans un dictionnaire Python. Nous avons deux meilleures alternatives sous la forme de fichiers CSV et YAML. Nous pouvons enregistrer notre vocabulaire de synonymes dans l'un des fichiers mentionnés ci-dessus et pouvons construireword_mapdictionnaire d'eux. Comprenons le concept à l'aide d'exemples.

Utilisation du fichier CSV

Afin d'utiliser le fichier CSV à cette fin, le fichier doit avoir deux colonnes, la première colonne se compose de mot et la deuxième colonne comprend les synonymes destinés à le remplacer. Sauvegardons ce fichier soussyn.csv. Dans l'exemple ci-dessous, nous allons créer une classe nommée CSVword_syn_replacer qui s'étendra word_syn_replacer dans replacesyn.py fichier et sera utilisé pour construire le word_map dictionnaire de syn.csv fichier.

Exemple

Tout d'abord, importez les packages nécessaires.

import csv

Ensuite, créez la classe qui prend un mappage de remplacement de mot -

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)

Après l'avoir exécuté, importez CSVword_syn_replacerclasse lorsque vous souhaitez remplacer des mots par des synonymes courants. Voyons comment?

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

Production

'birthday'

Exemple d'implémentation complet

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)

Maintenant, une fois que vous avez enregistré le programme ci-dessus et que vous l'avez exécuté, vous pouvez importer la classe et l'utiliser comme suit -

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

Production

'birthday'

Utilisation du fichier YAML

Comme nous avons utilisé le fichier CSV, nous pouvons également utiliser le fichier YAML pour cela (nous devons avoir installé PyYAML). Sauvegardons le fichier soussyn.yaml. Dans l'exemple ci-dessous, nous allons créer une classe nommée YAMLword_syn_replacer qui s'étendra word_syn_replacer dans replacesyn.py fichier et sera utilisé pour construire le word_map dictionnaire de syn.yaml fichier.

Exemple

Tout d'abord, importez les packages nécessaires.

import yaml

Ensuite, créez la classe qui prend un mappage de remplacement de mot -

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

Après l'avoir exécuté, importez YAMLword_syn_replacerclasse lorsque vous souhaitez remplacer des mots par des synonymes courants. Voyons comment?

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

Production

'birthday'

Exemple d'implémentation complet

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)

Maintenant, une fois que vous avez enregistré le programme ci-dessus et que vous l'avez exécuté, vous pouvez importer la classe et l'utiliser comme suit -

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

Production

'birthday'

Remplacement d'Antonyme

Comme nous savons qu'un antonyme est un mot ayant une signification opposée à un autre mot, et l'opposé du remplacement de synonyme est appelé remplacement d'antonyme. Dans cette section, nous traiterons du remplacement des antonymes, c'est-à-dire du remplacement des mots par des antonymes non ambigus en utilisant WordNet. Dans l'exemple ci-dessous, nous allons créer une classe nomméeword_antonym_replacer qui ont deux méthodes, l'une pour remplacer le mot et l'autre pour supprimer les négations.

Exemple

Tout d'abord, importez les packages nécessaires.

from nltk.corpus import wordnet

Ensuite, créez la classe nommée 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

Enregistrez ce programme python (disons replaceantonym.py) et exécutez-le à partir de l'invite de commande python. Après l'avoir exécuté, importezword_antonym_replacerclasse lorsque vous souhaitez remplacer des mots par leurs antonymes non ambigus. Voyons comment.

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

Production

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

Production

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

Exemple d'implémentation complet

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

Maintenant, une fois que vous avez enregistré le programme ci-dessus et que vous l'avez exécuté, vous pouvez importer la classe et l'utiliser comme suit -

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)

Production

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