使用 NLTK 进行 POS 标记和 NLP 中的分块 [示例]

词性标记

词性标记 (词性标注)是根据词性的定义和上下文,以文本格式标记特定词性的单词的过程。它负责读取语言中的文本,并为每个单词分配一些特定的标记(词性)。它也被称为语法标注。

让我们通过 NLTK 词性示例来学习:

输入: 一切都是为了允许我们。

输出: [('一切', NN),('至', TO), ('许可', VB), ('我们', PRP)]

POS 标记示例涉及的步骤

  • 标记文本(word_tokenize)
  • 将 pos_tag 应用于上述步骤,即 nltk.pos_tag(tokenize_text)

NLTK POS标签示例如下:

缩写
CC 并列连词
CD 基数
DT 确定
EX 存在那里
FW 外来词
IN 介词/从属连词
JJ 这个 NLTK POS 标签是一个形容词(大)
杰杰瑞 形容词,比较级(较大)
JJS 形容词,最高级(最大)
LS 上市市场
MD 情态动词(可以、将会)
NN 名词,单数(猫,树)
神经网络 名词复数(书桌)
神经网络 专有名词,单数(sarah)
核动力源 专有名词,复数(印第安人或美国人)
太平洋地区时段 预定词(全部、两者、一半)
POS材料 所有格结尾(父母的)
PRP 人称代词(她的、她自己、他、他自己)
巴布亚新几内亚基纳 所有格代词(她的、他的、我的、我的、我们的)
RB 副词 (偶尔、迅速)
RBR 副词,比较级(更大)
苏格兰皇家银行 副词,最高级(最大)
RP 粒子(约)
TO 不定式标记(至)
UH 感叹词(再见)
VB 动词 (询问)
VBG 动词 动名词 (判断)
VBD 动词过去式(恳求)
宽带网络 动词过去分词(重新统一)
临界电压 动词,现在时,非第三人称单数(换行)
VBZ 动词,现在时,第三人称单数(基础)
WDT wh 限定词(那、什么)
WP wh- 代词 (谁)
世界广播电台 wh- 副词 (how)

上面的 NLTK POS 标记列表包含所有 NLTK POS 标记。NLTK POS 标记器用于为句子的每个单词分配语法信息。安装、导入和下载 POS NLTK 的所有包已完成。

NLP 中的 Chunking 是什么?

分块 在 NLP 中,分块是一种将小块信息分组为大单元的过程。分块的主要用途是将“名词短语”分组。它用于通过遵循 POS 标记结合正则表达式来为句子添加结构。生成的词组称为“块”。它也被称为浅层解析。

在浅层解析中,根和叶之间最多只有一个级别,而深层解析则包含多个级别。浅层解析也称为轻量解析或分块。

分块规则

没有预定义的规则,但您可以根据需要和要求将它们组合起来。

例如,你需要从句子中标记名词、动词(过去时)、形容词和并列连接词。你可以使用以下规则

块:{ * * * ?}

下表显示了各种符号的含义:

交易品种名称 描述
. 除换行符之外的任意字符
* 匹配 0 次或更多次重复
? 匹配 0 或 1 次重复

现在让我们编写代码来更好地理解规则

from nltk import pos_tag
from nltk import RegexpParser
text ="learn php from guru99 and make study easy".split()
print("After Split:",text)
tokens_tag = pos_tag(text)
print("After Token:",tokens_tag)
patterns= """mychunk:{<NN.?>*<VBD.?>*<JJ.?>*<CC>?}"""
chunker = RegexpParser(patterns)
print("After Regex:",chunker)
output = chunker.parse(tokens_tag)
print("After Chunking",output)

输出:

After Split: ['learn', 'php', 'from', 'guru99', 'and', 'make', 'study', 'easy']
After Token: [('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN'), ('and', 'CC'), ('make', 'VB'), ('study', 'NN'), ('easy', 'JJ')]
After Regex: chunk.RegexpParser with 1 stages:
RegexpChunkParser with 1 rules:
       <ChunkRule: '<NN.?>*<VBD.?>*<JJ.?>*<CC>?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

上述词性标注的结论 Python 例如:“make” 是一个动词,它不包含在规则中,因此不会被标记为 mychunk

分块用例

分块用于实体检测。实体是句子的一部分,机器通过它获取任何意图的值。

Example: 
Temperature of New York. 
Here Temperature is the intention and New York is an entity. 

换句话说,分块用于选择标记的子集。请按照以下代码了解如何使用分块来选择标记。在此示例中,您将看到与名词短语块相对应的图表。我们将编写代码并绘制图表以便更好地理解。

演示用例的代码

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {<DT>?<JJ>*<NN>}"
cp  =nltk.RegexpParser(grammar)
result = cp.parse(tag)
print(result)
result.draw()    # It will draw the pattern graphically which can be seen in Noun Phrase chunking 

输出:

['learn', 'php', 'from', 'guru99']  -- These are the tokens
[('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN')]   -- These are the pos_tag
(S (NP learn/JJ php/NN) from/IN (NP guru99/NN))        -- Noun Phrase Chunking

图表

名词短语分块图
名词短语分块图

从图中我们可以得出结论,“learn”和“guru99”是两个不同的标记,但被归类为名词短语,而“from”不属于名词短语。

分块用于将不同的标记归类到同一个块中。结果将取决于所选的语法。进一步的分块 NLTK 用于标记模式和探索文本语料库。

计数词性标签

我们讨论过各种 pos_tag 在上一节中。在本教程中,您将学习如何计算这些标签。计算标签对于文本分类以及为基于自然语言的操作准备特征至关重要。我将与您讨论 guru99 在准备代码时遵循的方法以及输出讨论。希望这对您有所帮助。

如何计数标签:

这里我们首先会编写工作代码,然后编写不同的步骤来解释代码。

from collections import Counter
import nltk
text = "Guru99 is one of the best sites to learn WEB, SAP, Ethical Hacking and much more online."
lower_case = text.lower()
tokens = nltk.word_tokenize(lower_case)
tags = nltk.pos_tag(tokens)
counts = Counter( tag for word,  tag in tags)
print(counts)

输出:

计数器({'NN':5,',':2,'TO':1,'CC':1,'VBZ':1,'NNS':1,'CD':1,'。':1,'DT':1,'JJS':1,'JJ':1,'JJR':1,'IN':1,'VB':1,'RB':1})

守则的详细说明

计数词性标签

  1. 要计算标签数量,您可以使用集合模块中的 Counter 包。计数器是字典子类,其工作原理是键值操作。它是一个无序集合,其中元素存储为字典键,而计数是它们的值。
  2. 导入包含用于对文本进行标记的模块的 nltk。
  3. 写下您想要统计其 pos_tag 的文本。
  4. 有些单词是大写的,有些是小写的,因此在应用标记化之前将所有单词转换为小写是合适的。
  5. 将单词从 nltk 传递到 word_tokenize。
  6. 计算每个 token 的 pos_tag
    Output = [('guru99', 'NN'), ('is', 'VBZ'), ('one', 'CD'), ('of', 'IN'), ('the', 'DT'), ('best', 'JJS'), ('site', 'NN'), ('to', 'TO'), ('learn', 'VB'), ('web', 'NN'), (',', ','), ('sap', 'NN'), (',', ','), ('ethical', 'JJ'), ('hacking', 'NN'), ('and', 'CC'), ('much', 'RB'), ('more', 'JJR'), ('online', 'JJ')]
  7. 现在来看看字典计数器的作用。我们已经在代码行 1 中导入了。单词是关键,标签是值,计数器将计算文本中存在的每个标签总数。

频率分布

频率分布是指实验结果出现的次数。它用于查找文档中每个单词出现的频率。它使用 频率分布类别 并定义为 nltk.probabilty 模块。

频率分布通常是通过对重复运行实验的样本进行计数来创建的。每次计数都会增加一。例如

频率分布 = 频率分布()

对于文档中的标记:

频率分布.inc(token.type())

对于任何单词,我们都可以检查它在特定文档中出现的次数。例如

  1. 计数方法: freq_dist.count('and')此表达式返回“and”发生的次数的值。它被称为 count 方法。
  2. 频率法: freq_dist.freq('and')此表达式返回给定样本的频率。

我们将编写一个小程序并详细解释其工作原理。我们将编写一些文本并计算文本中每个单词的频率分布。

import nltk
a = "Guru99 is the site where you can find the best tutorials for Software Testing     Tutorial, SAP Course for Beginners. Java Tutorial for Beginners and much more. Please     visit the site guru99.com and much more."
words = nltk.tokenize.word_tokenize(a)
fd = nltk.FreqDist(words)
fd.plot()

频率分布

代码说明:

  1. 导入 nltk 模块。
  2. 写下需要查找单词分布的文本。
  3. 对文本中的每个单词进行标记,作为 nltk 的 FreqDist 模块的输入。
  4. 将每个单词以列表的形式应用到 nlk.FreqDist
  5. 使用 plot() 在图形中绘制单词

请将图表形象化,以便更好地理解所写的文字

图中每个单词的频率分布

图中每个单词的频率分布

注意:你需要安装 matplotlib 才能看到上面的图表

观察上面的图表。它对应于计算文本中每个单词的出现次数。它有助于研究文本并进一步实现基于文本的情感分析。简而言之,可以得出结论,nltk 有一个用于计算文本中每个单词出现次数的模块,这有助于准备自然语言特征的统计数据。它在查找文本中的关键字方面起着重要作用。您还可以使用 extract、PyPDF2 等库从 pdf 中提取文本,并将文本提供给 nlk.FreqDist。

关键词是“标记化”。标记化后,它会检查给定段落或文本文档中的每个单词,以确定其出现的次数。您不需要 NLTK 工具包即可完成此操作。您也可以使用自己的 Python 编程技能来完成此操作。NLTK 工具包仅为各种操作提供了现成的代码。

计算每个单词可能没什么用。相反,我们应该关注搭配和二元词组,它们处理成对的大量单词。这些对可以识别有用的关键词,以更好地为机器提供自然语言特征。请参阅下文了解它们的详细信息。

搭配:二元词组和三元词组

什么是搭配?

搭配是指在文档中多次出现的单词对。其计算方法是将这些单词对一起出现的次数与文档总字数进行比较。

考虑一下电磁波谱,比如紫外线、红外线。

紫外线和射线这两个词不会单独使用,因此可以视为搭配。另一个例子是 CT 扫描。我们不会将 CT 和扫描分开说,因此它们也被视为搭配。

我们可以这样说,寻找搭配需要计算单词的频率及其在其他单词上下文中的出现频率。这些特定的单词集合需要过滤以保留有用的内容术语。然后可以根据某种关联度量对每个单词 gram 进行评分,以确定每个 Ingram 成为搭配的相对可能性。

搭配可以分为两种类型-

  • 二元语法两个词的组合
  • 三个词的组合

二元组和三元组为特征提取阶段提供了更有意义和更有用的特征。这些特征在基于文本的情感分析中尤其有用。

二元语法示例代码

import nltk

text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.bigrams(Tokens))
print(output)

输出:

[('Guru99', 'is'), ('is', 'totally'), ('totally', 'new'), ('new', 'kind'), ('kind', 'of'), ('of', 'learning'), ('learning', 'experience'), ('experience', '.')]

三元组示例代码

有时,在句子中看到三个单词的组合对于统计分析和频率计数很重要。这在形成 NLP (自然语言处理功能)以及基于文本的情感预测。

运行相同的代码来计算三元组。

import nltk
text = “Guru99 is a totally new kind of learning experience.”
Tokens = nltk.word_tokenize(text)
output = list(nltk.trigrams(Tokens))
print(output)

输出:

[('Guru99', 'is', 'totally'), ('is', 'totally', 'new'), ('totally', 'new', 'kind'), ('new', 'kind', 'of'), ('kind', 'of', 'learning'), ('of', 'learning', 'experience'), ('learning', 'experience', '.')]   

标记句子

标记句子在广义上是指根据句子的上下文添加动词、名词等的标签。POS 标记的识别是一个复杂的过程。因此,无法手动对 POS 进行通用标记,因为根据句子的结构,某些单词可能具有不同的(模糊的)含义。将文本转换为列表形式是标记之前的一个重要步骤,因为列表中的每个单词都会循环并针对特定标记进行计数。请参阅下面的代码以更好地理解它

import nltk
text = "Hello Guru99, You have to build a very good site, and I love visiting your site."
sentence = nltk.sent_tokenize(text)
for sent in sentence:
	 print(nltk.pos_tag(nltk.word_tokenize(sent)))

输出:

[('你好', 'NNP'), ('Guru99', 'NNP'), (',', ','), ('你', 'PRP'), ('有', 'VBP'), ('构建', 'VBN'), ('a', 'DT'), ('非常', 'RB'), ('好', 'JJ'), ('站点', 'NN'), ('和', 'CC'), ('我', 'PRP'), ('爱', 'VBP'), ('访问', 'VBG'), ('你的', 'PRP$'), ('站点', 'NN'), ('.', '.')]

标记句子

代码说明:

  1. 导入 nltk 的代码(自然语言工具包,包含句子标记和单词标记等子模块。)
  2. 要打印标签的文本。
  3. 句子标记化
  4. 实现了 For 循环,其中从句子中标记单词并将每个单词的标签打印为输出。

在语料库中,有两种类型的 POS 标注器:

  • 基于规则
  • 随机 POS 标注器

1.基于规则的词性标注器: 对于具有歧义的单词,则采用基于上下文信息的规则方法。通过检查或分析前一个或后一个单词的含义来实现。从单词周围或单词本身分析信息。因此,单词会根据特定语言的语法规则(如大写和标点符号)进行标记。例如,Brill 的标记器。

2.随机词性标注器: 该方法采用频率或概率等不同方法。如果训练集中的单词大多带有特定标记,则在测试句子中会赋予该特定标记。单词标记不仅取决于其自身标记,还取决于前一个标记。这种方法并不总是准确的。另一种方法是计算句子中特定标记出现的概率。因此,通过检查单词与特定标记的最高概率来计算最终标记。

使用隐马尔可夫模型进行词性标记

标记问题也可以使用 HMM 建模。它将输入标记视为可观察序列,而标记被视为隐藏状态,目标是确定隐藏状态序列。例如 x = x1,x2,…………,Xn 其中 x 是标记序列,而 y = y1,y2,y3,y4………是的n是隐藏序列。

隐马尔可夫模型(HMM)如何工作?

HMM 使用连接分布,即 P(x, y),其中 x 是输入序列/标记序列,y 是标签序列。

x 的标记序列将是 argmaxy1….ynp(x1,x2,….xn,y1,y2,y3,…..)。我们已经从文本中对标签进行了分类,但这些标签的统计至关重要。因此,下一步就是统计这些标签以进行统计研究。

结语

  • POS 标记 NLTK 是根据语音特定部分的定义和上下文,以文本格式标记单词的过程。
  • 一些 NLTK POS 标记示例有:CC、CD、EX、JJ、MD、NNP、PDT、PRP$、TO 等。
  • 词性标注器用于为句子中的每个单词分配语法信息。使用 NLTK 进行词性标注的所有包的安装、导入和下载已完成。
  • NLP 中的分块是将小块信息分组为大单元的过程。
  • 没有预定义的规则,但您可以根据需要和要求将它们组合起来。
  • 分块用于实体检测。实体是句子的一部分,机器通过它获取任何意图的值。
  • 分块用于将不同的标记归类到同一个块中。