- 自然语言工具包教程
- 自然语言工具包 - 首页
- 自然语言工具包 - 简介
- 自然语言工具包 - 入门
- 自然语言工具包 - 文本分词
- 训练分词器 & 过滤停用词
- 在Wordnet中查找单词
- 词干提取 & 词形还原
- 自然语言工具包 - 词语替换
- 同义词 & 反义词替换
- 语料库读取器和自定义语料库
- 词性标注基础
- 自然语言工具包 - 单词标注器
- 自然语言工具包 - 组合标注器
- 自然语言工具包 - 更多NLTK标注器
- 自然语言工具包 - 解析
- 词块提取 & 信息提取
- 自然语言工具包 - 变换词块
- 自然语言工具包 - 变换树
- 自然语言工具包 - 文本分类
- 自然语言工具包资源
- 自然语言工具包 - 快速指南
- 自然语言工具包 - 有用资源
- 自然语言工具包 - 讨论
自然语言工具包 - 变换词块
为什么变换词块?
到目前为止,我们已经从句子中获得了词块或短语,但我们应该如何处理它们呢?一项重要的任务是变换它们。但是为什么呢?这样做是为了实现以下目的:
- 语法校正以及
- 重新排列短语
过滤掉无关/无用的词语
假设您想判断一个短语的含义,那么有很多常用的词语,例如“the”、“a”,是无关紧要或无用的。例如,请看以下短语:
“这部电影很好”。
这里最重要的词语是“电影”和“好”。其他词语,“the”和“was”都是无用或无关紧要的。这是因为即使没有它们,我们也能理解短语的相同含义。“好电影”。
在下面的Python示例中,我们将学习如何借助词性标签去除无用/无关紧要的词语,并保留重要的词语。
示例
首先,通过查看treebank语料库中的停用词,我们需要确定哪些词性标签是重要的,哪些是不重要的。让我们看看以下无关词语和标签的表格:
单词 | 标签 |
---|---|
a | DT |
All | PDT |
An | DT |
And | CC |
Or | CC |
That | WDT |
The | DT |
从上表可以看出,除了CC之外,所有其他标签都以DT结尾,这意味着我们可以通过查看标签的后缀来过滤掉无关紧要的词语。
对于此示例,我们将使用一个名为filter()的函数,它接收一个词块并返回一个不包含任何无关标签词语的新词块。此函数过滤掉所有以DT或CC结尾的标签。
示例
import nltk def filter(chunk, tag_suffixes=['DT', 'CC']): significant = [] for word, tag in chunk: ok = True for suffix in tag_suffixes: if tag.endswith(suffix): ok = False break if ok: significant.append((word, tag)) return (significant)
现在,让我们在Python示例中使用此filter()函数来删除无关紧要的词语:
from chunk_parse import filter filter([('the', 'DT'),('good', 'JJ'),('movie', 'NN')])
输出
[('good', 'JJ'), ('movie', 'NN')]
动词校正
很多时候,在现实世界的语言中,我们会看到不正确的动词形式。例如,“is you fine?”是不正确的。此句中的动词形式不正确。句子应该是“are you fine?”NLTK为我们提供了一种通过创建动词校正映射来纠正此类错误的方法。这些校正映射根据词块中是否存在复数或单数名词来使用。
示例
要实现Python示例,我们首先需要定义动词校正映射。让我们创建两个映射如下:
复数到单数映射
plural= { ('is', 'VBZ'): ('are', 'VBP'), ('was', 'VBD'): ('were', 'VBD') }
单数到复数映射
singular = { ('are', 'VBP'): ('is', 'VBZ'), ('were', 'VBD'): ('was', 'VBD') }
如上所示,每个映射都包含一个带标签的动词,它映射到另一个带标签的动词。我们示例中的初始映射涵盖了is到are、was到were的基本映射,反之亦然。
接下来,我们将定义一个名为verbs()的函数,您可以在其中传递一个包含不正确动词形式的词块,并获得一个已更正的词块。为了完成此操作,verb()函数使用一个名为index_chunk()的辅助函数,该函数将在词块中搜索第一个带标签单词的位置。
让我们看看这些函数:
def index_chunk(chunk, pred, start = 0, step = 1): l = len(chunk) end = l if step > 0 else -1 for i in range(start, end, step): if pred(chunk[i]): return i return None def tag_startswith(prefix): def f(wt): return wt[1].startswith(prefix) return f def verbs(chunk): vbidx = index_chunk(chunk, tag_startswith('VB')) if vbidx is None: return chunk verb, vbtag = chunk[vbidx] nnpred = tag_startswith('NN') nnidx = index_chunk(chunk, nnpred, start = vbidx+1) if nnidx is None: nnidx = index_chunk(chunk, nnpred, start = vbidx-1, step = -1) if nnidx is None: return chunk noun, nntag = chunk[nnidx] if nntag.endswith('S'): chunk[vbidx] = plural.get((verb, vbtag), (verb, vbtag)) else: chunk[vbidx] = singular.get((verb, vbtag), (verb, vbtag)) return chunk
将这些函数保存在您安装Python或Anaconda的本地目录中的Python文件中并运行它。我将其保存为verbcorrect.py。
现在,让我们对一个词性标注的is you fine词块调用verbs()函数:
from verbcorrect import verbs verbs([('is', 'VBZ'), ('you', 'PRP$'), ('fine', 'VBG')])
输出
[('are', 'VBP'), ('you', 'PRP$'), ('fine','VBG')]
消除短语中的被动语态
另一个有用的任务是从短语中消除被动语态。这可以通过围绕动词交换单词来完成。例如,“本教程很棒”可以转换为“很棒的教程”。
示例
为了实现这一点,我们定义了一个名为eliminate_passive()的函数,它将使用动词作为枢轴点,将词块的右侧与左侧交换。为了找到要围绕其旋转的动词,它还将使用上面定义的index_chunk()函数。
def eliminate_passive(chunk): def vbpred(wt): word, tag = wt return tag != 'VBG' and tag.startswith('VB') and len(tag) > 2 vbidx = index_chunk(chunk, vbpred) if vbidx is None: return chunk return chunk[vbidx+1:] + chunk[:vbidx]
现在,让我们对一个词性标注的the tutorial was great词块调用eliminate_passive()函数:
from passiveverb import eliminate_passive eliminate_passive( [ ('the', 'DT'), ('tutorial', 'NN'), ('was', 'VBD'), ('great', 'JJ') ] )
输出
[('great', 'JJ'), ('the', 'DT'), ('tutorial', 'NN')]
交换名词基数
众所周知,像5这样的基数词在词块中被标记为CD。这些基数词通常出现在名词之前或之后,但出于规范化的目的,将它们始终放在名词之前非常有用。例如,日期1月5日可以写成5月1日。让我们通过以下示例来理解它。
示例
为了实现这一点,我们定义了一个名为swapping_cardinals()的函数,它将交换任何紧跟在名词之后的基数与名词。这样,基数将出现在名词之前。为了与给定标签进行相等比较,它使用了我们命名为tag_eql()的辅助函数。
def tag_eql(tag): def f(wt): return wt[1] == tag return f
现在我们可以定义swapping_cardinals():
def swapping_cardinals (chunk): cdidx = index_chunk(chunk, tag_eql('CD')) if not cdidx or not chunk[cdidx-1][1].startswith('NN'): return chunk noun, nntag = chunk[cdidx-1] chunk[cdidx-1] = chunk[cdidx] chunk[cdidx] = noun, nntag return chunk
现在,让我们对日期“1月5日”调用swapping_cardinals()函数:
from Cardinals import swapping_cardinals() swapping_cardinals([('Janaury', 'NNP'), ('5', 'CD')])
输出
[('10', 'CD'), ('January', 'NNP')] 10 January