📅  最后修改于: 2020-10-14 09:27:09             🧑  作者: Mango
到目前为止,我们已经从句子中获得了大块或短语,但是我们应该如何处理它们。重要的任务之一是对其进行转换。但为什么?它要做以下事情-
假设如果您要判断短语的含义,那么有很多常用的单词,例如’the’,’a’都是无关紧要的或无用的。例如,请参见以下短语-
“电影很好”。
这里最重要的词是“电影”和“好”。换句话说,“ the”和“ was”都是无用的或微不足道的。这是因为没有它们,我们也可以得到该短语的相同含义。 ‘值得一看的电影’。
在下面的Python食谱中,我们将学习如何在POS标签的帮助下删除无用/无关紧要的单词并保留有意义的单词。
首先,通过在树库语料库中查找停用词,我们需要确定哪些词性标签很重要,哪些不重要。让我们看看下表的无关紧要的单词和标签-
Word | Tag |
---|---|
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')]
很多时候,在现实世界中,我们看到不正确的动词形式。例如,“你还好吗?”是不正确的。动词形式在此句子中不正确。句子应该是“你还好吗?” NLTK通过创建动词校正映射为我们提供了纠正此类错误的方法。根据在块中是否存在复数或单数名词来使用这些校正映射。
要实现Python配方,我们首先需要定义动词校正映射。让我们创建两个映射,如下所示:
复数到奇数映射
plural= {
('is', 'VBZ'): ('are', 'VBP'),
('was', 'VBD'): ('were', 'VBD')
}
单数到复数映射
singular = {
('are', 'VBP'): ('is', 'VBZ'),
('were', 'VBD'): ('was', 'VBD')
}
如上所示,每个映射都有一个标记动词,该动词映射到另一个标记动词。在我们的示例中,初始映射涵盖了to,was,was以及反之亦然的映射基础。
接下来,我们将定义一个名为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 。
现在,让我们在标记为POS的POS上调用verbs()函数-
from verbcorrect import verbs
verbs([('is', 'VBZ'), ('you', 'PRP$'), ('fine', 'VBG')])
[('are', 'VBP'), ('you', 'PRP$'), ('fine','VBG')]
另一个有用的任务是从短语中消除被动语态。这可以通过在动词周围交换单词来完成。例如, “教程很棒”可以转换为“教程很棒” 。
为了实现这一点,我们定义了一个名为exclude_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]
现在,让我们在标记为POS的POS上调用exclude_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日可以写为1 January 5 。让我们用下面的例子来理解它。
为了实现这一点,我们定义了一个名为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
现在,让我们在日期“ January 5”调用swapping_cardinals()函数-
from Cardinals import swapping_cardinals()
swapping_cardinals([('Janaury', 'NNP'), ('5', 'CD')])
[('10', 'CD'), ('January', 'NNP')]
10 January