同義詞和反義詞替換



用常見的同義詞替換單詞

在使用自然語言處理時,尤其是在頻率分析和文字索引的情況下,壓縮詞彙量而不丟失含義總是很有益的,因為它節省了大量的記憶體。為了實現這一點,我們必須定義一個單詞到其同義詞的對映。在下面的示例中,我們將建立一個名為word_syn_replacer的類,它可以用於用它們的常用同義詞替換單詞。

示例

首先,匯入必要的包re來處理正則表示式。

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)

儲存此Python程式(例如replacesyn.py)並從Python命令提示符執行它。執行後,當您想用常見同義詞替換單詞時,匯入word_syn_replacer類。讓我們看看如何操作。

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

輸出

'birthday'

完整的實現示例

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)

現在,一旦您儲存了上述程式並執行它,您就可以匯入該類並按如下方式使用它 -

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

輸出

'birthday'

上述方法的缺點是我們必須在Python字典中硬編碼同義詞。我們有兩種更好的替代方案,即CSV和YAML檔案。我們可以將我們的同義詞詞彙表儲存在上述任何一個檔案中,並可以從中構建word_map字典。讓我們藉助示例來理解這個概念。

使用CSV檔案

為了為此目的使用CSV檔案,該檔案應有兩列,第一列包含單詞,第二列包含用於替換它的同義詞。讓我們將此檔案儲存為syn.csv。在下面的示例中,我們將建立一個名為CSVword_syn_replacer的類,它將擴充套件replacesyn.py檔案中的word_syn_replacer,並將用於從syn.csv檔案中構建word_map字典。

示例

首先,匯入必要的包。

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)

執行後,當您想用常見同義詞替換單詞時,匯入CSVword_syn_replacer類。讓我們看看如何操作?

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

輸出

'birthday'

完整的實現示例

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)

現在,一旦您儲存了上述程式並執行它,您就可以匯入該類並按如下方式使用它 -

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

輸出

'birthday'

使用YAML檔案

就像我們使用CSV檔案一樣,我們也可以使用YAML檔案為此目的(我們必須安裝PyYAML)。讓我們將檔案儲存為syn.yaml。在下面的示例中,我們將建立一個名為YAMLword_syn_replacer的類,它將擴充套件replacesyn.py檔案中的word_syn_replacer,並將用於從syn.yaml檔案中構建word_map字典。

示例

首先,匯入必要的包。

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)

執行後,當您想用常見同義詞替換單詞時,匯入YAMLword_syn_replacer類。讓我們看看如何操作?

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

輸出

'birthday'

完整的實現示例

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)

現在,一旦您儲存了上述程式並執行它,您就可以匯入該類並按如下方式使用它 -

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

輸出

'birthday'

反義詞替換

眾所周知,反義詞是指與另一個單詞意思相反的單詞,同義詞替換的反面稱為反義詞替換。在本節中,我們將處理反義詞替換,即使用WordNet用明確的反義詞替換單詞。在下面的示例中,我們將建立一個名為word_antonym_replacer的類,它有兩個方法,一個用於替換單詞,另一個用於刪除否定。

示例

首先,匯入必要的包。

from nltk.corpus import wordnet

接下來,建立名為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

儲存此Python程式(例如replaceantonym.py)並從Python命令提示符執行它。執行後,當您想用明確的反義詞替換單詞時,匯入word_antonym_replacer類。讓我們看看如何操作。

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

輸出

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

輸出

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

完整的實現示例

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

現在,一旦您儲存了上述程式並執行它,您就可以匯入該類並按如下方式使用它 -

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)

輸出

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

© . All rights reserved.