- 自然语言工具包教程
- 自然语言工具包 - 首页
- 自然语言工具包 - 简介
- 自然语言工具包 - 入门
- 自然语言工具包 - 文本标记化
- 训练标记器和过滤停用词
- 在WordNet中查找单词
- 词干提取和词形还原
- 自然语言工具包 - 单词替换
- 同义词和反义词替换
- 语料库读取器和自定义语料库
- 词性标注基础
- 自然语言工具包 - 单词标注器
- 自然语言工具包 - 组合标注器
- 自然语言工具包 - 更多NLTK标注器
- 自然语言工具包 - 解析
- 分块和信息提取
- 自然语言工具包 - 转换分块
- 自然语言工具包 - 转换树
- 自然语言工具包 - 文本分类
- 自然语言工具包资源
- 自然语言工具包 - 快速指南
- 自然语言工具包 - 有用资源
- 自然语言工具包 - 讨论
同义词和反义词替换
用常见的同义词替换单词
在使用自然语言处理时,尤其是在频率分析和文本索引的情况下,压缩词汇量而不丢失含义总是很有益的,因为它节省了大量的内存。为了实现这一点,我们必须定义一个单词到其同义词的映射。在下面的示例中,我们将创建一个名为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']