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

⚡ 智能摘要

词性标注为句子中的每个词分配一个词性,而分块则将这些已标注的词分组为有意义的短语(例如名词短语),从而添加 NLTK 使用正则表达式构建的浅层结构。 Python.

  • 🏷️ 词性标记: 每个单词都会根据其上下文获得一个语法标记,例如 NN、VB 或 JJ。
  • 🌿 分块: 带标签的词语被分组为短语,这个过程也称为浅层解析。
  • 🔤 工作流程: 首先对文本进行分词,然后应用词性标注,最后使用正则表达式解析器语法进行解析。
  • 📊 标签计数: Counter 和 FreqDist 揭示了用于特征工程的标签和词频。
  • 🔗 搭配: 二元组和三元组可以捕捉词对和词组,从而增强文本特征。
  • 🤖 人工智能应用: 机器学习和基于隐马尔可夫模型的词性标注器以概率方式处理歧义词。

使用 NLTK 进行词性标注和自然语言处理中的组块技术

词性标记

词性标记 词性标注(Parts of Speech Tagging)是根据词性定义和上下文,对文本中的单词进行词性标记的过程。它负责读取文本,并为每个单词分配一个特定的词性标记(词性)。它也被称为语法标注。

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

Input: Everything to permit us.
Output: [('Everything', NN),('to', TO), ('permit', VB), ('us', PRP)]

POS标签示例涉及的步骤

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

以下是NLTK词性标注示例:

缩写
CC 并列连词
CD 基数
DT 确定
EX 存在那里
FW 外来词
IN 介词/从属连词
JJ 形容词
杰杰瑞 形容词,比较级
JJS 形容词,最高级
LS 上市市场
MD 语气
NN 名词,单数
神经网络 名词复数
神经网络 专有名词,单数
核动力源 专有名词,复数
太平洋地区时段 预定者
POS材料 所有格结尾
PRP 人称代词
巴布亚新几内亚基纳 所有格代词
RB 副词
RBR 副词,比较级
苏格兰皇家银行 副词,最高级
RP 粒子
TO 无限标记
UH
VB 动词
VBG 动名词
VBD 动词过去式
宽带网络 动词过去分词
临界电压 动词,现在时,非第三人称单数
VBZ 动词,现在时,第三人称单数
WDT 疑问词限定词
WP 特殊代词
世界广播电台 疑问副词

上述 NLTK 词性标注列表包含了所有 NLTK 词性标注。NLTK 词性标注器用于为句子中的每个词分配语法信息。至此,NLTK 词性标注器的所有软件包的安装、导入和下载工作已完成。

NLP 中的 Chunking 是什么?

分块 在自然语言处理(NLP)中,组块(Chunking)是将零散的信息组合成大单元的过程。组块的主要用途是将“名词短语”分组。它通过词性标注结合正则表达式来构建句子结构。最终得到的词组称为“词块”。组块也称为浅层句法分析。

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

分块规则

没有预设规则,但您可以根据需要组合使用。例如,假设您需要标记句子中的名词、动词(过去式)、形容词和并列连词,您可以使用以下规则:

chunk:{***?}

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

交易品种名称 描述
. 除换行符之外的任意字符
* 匹配 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:{***?}"""
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:
       '***?'>
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: {
?*}" 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标签数量

我们讨论过各种 pos_tag 之前已经计算过这些值。在这里,你将学习如何统计这些标签的数量。统计标签数量对于文本分类和准备自然语言处理的特征至关重要。我们首先编写可运行的代码,然后解释各个步骤。

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)

输出:

Counter({'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. 使用 collections 模块中的 Counter 包。Counter 是一个字典子类,它将元素作为键,元素的计数作为值。
  2. 导入 nltk 对文本进行分词。
  3. 写下您想要统计其 pos_tag 的文本。
  4. 在进行分词之前,将所有单词转换为小写。
  5. 将单词传递给 word_tokenize 函数,并计算每个词元的 pos_tag。
  6. 计数器随后统计文本中每个标签出现的总次数。

频率分布

频率分布是指实验结果出现的次数。它用于查找文档中每个词出现的频率。它使用…… 频率距离 由以下类别定义 nltk.概率 模块。每次采样时,计数都会加一。

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

  • 计数方法: freq_dist.count('and') 返回 'and' 出现的次数。它被称为 count 方法。
  • 频率法: 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. 将每个单词以列表的形式应用于 nltk.FreqDist。
  5. 使用 plot() 函数在图表中绘制单词。

注意:必须安装 matplotlib 才能查看图表。该图表统计文本中每个单词的出现次数,有助于进行基于文本的情感分析。关键术语是“分词”:分词后,会检查每个单词的出现次数。

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

搭配词是指在文档中多次同时出现的词语对。它的计算方法是用同时出现的词语对数量与文档总字数的比值。

考虑一下“紫外线”和“红外线”这两个词。“紫外线”和“射线”这两个词通常不会单独使用,因此可以视为搭配词。另一个例子是“CT扫描”,因为我们不会单独说“CT”和“扫描”。搭配词可以分为两类:

  • 双字母表: 两个词的组合
  • 卦象: 三个词的组合

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

二元语法示例 Code:

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', '.')]

三卦示例 Code:

有时,在句子中看到三个单词的组合对于统计分析和频率计数很重要。这在形成 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', '.')]

标记句子

词性标注是指根据句子的上下文添加动词或名词等标签。词性标注非常复杂,因此无法手动进行通用标注,因为有些词的含义会因句子结构而异。在标注之前,将文本转换为列表是一个重要的步骤,因为每个词都会被循环处理并统计其是否属于特定标签。

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)))

Code 说明:

  1. Code 导入 nltk(自然语言处理库) Language Tool工具包,其中包含诸如句子分词和单词分词之类的子模块)。
  2. 要打印标签的文本。
  3. 句子分词。
  4. 使用 for 循环对句子中的单词进行分词,并将每个单词的标签打印出来作为输出。

在语料库中,词性标注器有两种类型:

1. 基于规则的词性标注器: 对于含义模糊的词语,采用基于上下文信息的规则标注方法。这种方法通过分析其前后词语的含义来实现。因此,词语会根据特定语言的语法规则进行标注,例如大小写和标点符号。例如,布里尔词性标注器(Brill's tagger)。

2. 随机词性标注器: 这种方法运用了词频或概率等方法。如果一个词在训练集中被标记为某个特定标签的次数最多,那么在测试句中它就被赋予该标签。词的标签不仅取决于它自身的标签,还取决于它前面的标签,因此这种方法并非总是准确的。

基于隐马尔可夫模型的词性标注

标注问题也可以使用隐马尔可夫模型(HMM)进行建模。它将输入词元视为可观测序列,而将标签视为隐藏状态,目标是确定隐藏状态序列。例如,x = x1, x2, …, xn,其中 x 是词元序列,而 y = y1, y2, y3, y4…yn 是隐藏状态序列。

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

HMM 使用联合分布 P(x, y),其中 x 是输入词元序列,y 是标签序列。x 对应的标签序列是 p(x1,x2,…xn,y1,y2,y3,…) 在 y1…yn 上的最大值。我们已经对文本中的标签进行了分类,但这些标签的统计数据至关重要,因此下一步是统计这些标签的数量以进行统计分析。

常见问题

词性标注为每个单词标注其词性,例如名词或动词。组块更进一步,将这些标注过的单词组合成短语,例如名词短语,从而使句子结构变得浅显。

浅层解析,也称为分块解析或轻量级解析,在根节点和叶节点之间最多只保留一层。它无需构建完整的解析树即可识别短语边界,因此比深度解析速度更快。

词块化将带标签的词语分组为短语,使系统能够检测诸如人、地点、日期或产品之类的实体。命名实体识别依赖于这些词块来进行识别。trac从原始文本中提取有意义的值。

nltk.pos_tag() 函数用于分配词性标签。首先使用 word_tokenize 对文本进行分词,然后将分词列表传递给 pos_tag 函数,该函数会返回每个单词及其对应的词性标签,例如 NN、VB 或 JJ。

是的。现代人工智能词性标注器通过机器学习和深度神经网络训练,从大型语料库中学习上下文,从而解决歧义词,在真实文本上达到比基于规则的方法更高的准确率。

随机词性标注器利用从训练数据中学习到的概率。机器学习会根据单词周围的标签来估计每个标签对于该单词的可能性,然后选择总体概率最高的标签序列。

除了 NLTK热门选项包括 空间 对于快速生产流程,可以使用 Stanford CoreNLP;对于基于 Transformer 的标签,可以使用 Hugging Face Transformers。

在块语法中,点号匹配除换行符以外的任何字符,星号匹配零个或多个重复,问号匹配前面的 POS 标签模式的零个或一个重复。

总结一下这篇文章: