📅  最后修改于: 2020-10-14 09:14:51             🧑  作者: Mango
在使用NLP时,尤其是在频率分析和文本索引的情况下,压缩词汇表总是有好处的,因为它节省了大量内存,因此不会失去意义。为此,我们必须定义一个单词到其同义词的映射。在下面的示例中,我们将创建一个名为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文件,该文件应具有两列,第一列包含word,第二列包含用于替换它的同义词。让我们将此文件另存为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'
因为我们使用了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']