什么是自然语言处理中的分块?

源节点: 1878431

亲爱的读者,

在这篇博客中,我将讨论 Python 中的分块理论和实践。

那么,让我们开始吧……

注意: 对于实现,最好使用 Python IDLE,因为输出是在单独窗口中弹出的树图。

议程

  • 什么是分块?
  • 分块用在哪里?
  • 分块的类型
  • Python中分块的实现
  • 成果

什么是分块?

分块被定义为用于识别给定句子中存在的词性和短语的自然语言处理过程。

回想一下我们在学校的旧英语语法课,请注意有八个词性,即名词、动词、形容词、副词、介词、连词、代词和感叹词。另外,在上述组块定义中,短语指的是通过包括这些词类中的任何一个而形成的短语。

例如,可以进行分块来识别名词短语或单独的名词、形容词或形容词短语等并由此对其进行分组。考虑下面的句子:

“我早餐吃了汉堡和糕点。”

在这种情况下,如果我们希望对名词短语进行分组或分块,我们将得到“burgers”、“pastry”和“lunch”,它们是句子的名词或名词组。

分块用在哪里?

为什么我们想要学习一些东西而不知道它被广泛使用在哪里?!查看博客本节中讨论的应用程序将帮助您保持好奇心直到最后!

分块用于从给定句子中获取所需的短语。然而,词性标注只能用于识别句子中每个单词所属的词性。

当我们对某个特定单词或我们感兴趣的短语有大量描述或修改时,我们会使用分块来单独获取所需的短语,而忽略它周围的其余部分。因此,分块为对所需短语进行分组并排除它们周围的所有修饰语铺平了道路,这些修饰语对于我们的分析来说是不必要的。总而言之,分块可以帮助我们从冗长的描述中提取出重要的单词。因此,分块是信息提取的一个步骤。

有趣的是,NLP 中的分块过程已扩展到各种其他应用程序;例如,将特定类别的水果分组,例如将富含蛋白质的水果作为一组,将富含维生素的水果作为另一组,等等。此外,分块还可以用于将类似的汽车分组,例如,支持自动档的汽车分为一组,而其他支持手动档的汽车分到另一组,依此类推。

分块的类型

一般来说,分块有两种类型:

  • 分块
  • 分块

分块:

在这里,我们不深入探讨;而是深入研究。相反,我们对信息的概述感到满意。它只是帮助我们简要了解给定的数据。

分块:

与之前的分块类型不同,分块可以帮助我们获得详细信息。

因此,如果您只是想要深入了解,请考虑“分块”,否则更喜欢“分块”。

Python中分块的实现

想象一下您想要从给定文本中提取所有动词进行分析的情况。因此,在这种情况下,我们必须考虑动词短语的分块。这是因为我们的目标是从给定的文本片段中提取所有动词短语。分块是在正则表达式的帮助下完成的。

如果您是第一次遇到“正则表达式”这个术语,请不要担心。下表在这里,可以帮助您:

图形符号

例如:

*

前面的字符可以出现零次或多次,这意味着前面的字符可能存在也可能不存在。

ab* 匹配所有以 ab 开头,后跟零个或多个 b 的输入。该模式将匹配 ab、abb 、abbb 等。

+

前面的字符应该至少出现一次。

a+ 匹配 a、aa、aaa 等。

?

前面的字符可能根本不会出现或仅出现一次,这意味着前面的字符是可选的。

ab?匹配 ab,abb 但不匹配 abbb 等。

上表包括最常用的正则表达式。正则表达式在命令行中非常有用,尤其是在删除、定位、重命名或移动文件时。

无论如何,对于这个实现,我们将只使用 *.请随意查看上表来熟悉该符号!

我们将使用最流行的 NLP 库 nltk 执行分块。因此,我们首先导入它。

导入nltk

让我们考虑一下我自己创建的以下示例文本。请随意将下面的内容替换为您想要实现分块的任何示例文本!

样本文本=“”“
罗摩(Rama)为了从兰卡(Lanka)拯救西塔(Sita)而杀死了罗波那(Ravana)。罗摩衍那的传说是印度最受欢迎的史诗。很多电影和连续剧已经
根据《罗摩衍那》在印度用多种语言拍摄。 ”“”

显然,在我们继续之前,必须对数据进行句子标记,然后对单词进行标记。标记化不过是将给定的文本片段分解为更小的单元的过程,例如在句子标记化的情况下是句子,在单词标记化的情况下是单词。

接下来是标记化,对每个单词进行POS(词性)标记,其中每个单词的词性将被识别。现在,我们只对动词词性感兴趣并希望提取相同的词性。

因此,使用所需的正则表达式指定我们感兴趣的词性,如下所示:

VB:{}

tokenized=nltk.sent_tokenize(sample_text)
对于标记化中的 i:words=nltk.word_tokenize(i) # print(words) tagged_words=nltk.pos_tag(words) # print(tagged_words) chunkGram=r"""VB: {}""" chunkParser=nltk.RegexpParser( chunkGram) chunked=chunkParser.parse(tagged_words) chunked.draw()

正则表达式 (RE) 括在尖括号 () 内,而尖括号 () 又括在大括号({ 和 })内。

注意: 根据需要的POS指定RE

VB 代表动词 POS。 VB 后面的点表示匹配 VB 后面的任何字符。点后面的问号指定 B 之后的任何字符只能出现一次或根本不能出现。然而,从我们之前看到的表来看,这个字符是可选的。我们以这种方式构建正则表达式,因为在 NLTK 中,动词短语包含以下词性标签:

POS材料

VB

动词的基本形式

VBD

动词的过去时态

VBG

动词现在时

宽带网络

动词的过去分词形式

临界电压

动词现在时但不是第三人称单数

VBZ

动词现在时并且是第三人称单数

因此,动词短语可以属于上述任何一个词性。这就是为什么正则表达式被框架为VB。?其中包括上述所有类别。 RegexpParser 包用于检查 POS 是否满足我们之前使用 RE 提到的所需模式。

整个代码可以看出如下:

导入nltk
nltk.download('averaging_perceptron_tagger')
样本文本=“”“
罗摩(Rama)为了从兰卡(Lanka)拯救西塔(Sita)而杀死了罗波那(Ravana)。罗摩衍那的传说是印度最受欢迎的史诗。很多电影和连续剧已经
根据《罗摩衍那》在印度用多种语言拍摄。 ”“”
tokenized=nltk.sent_tokenize(sample_text)
对于标记化中的 i:words=nltk.word_tokenize(i) # print(words) tagged_words=nltk.pos_tag(words) # print(tagged_words) chunkGram=r"""VB: {}""" chunkParser=nltk.RegexpParser( chunkGram) chunked=chunkParser.parse(tagged_words) chunked.draw()

成果

分块结果
分块结果

最后,我们获得单词的 POS 以及 POS 与给定 RE 匹配的单词的树形形式。从我们传递的示例文本获得的输出快照可以在上图中看到。

请注意,仅满足我们对动词短语的 RE 的单词在输出中清楚地突出显示。因此,动词短语的分块已经成功执行。

希望您觉得我的文章有用。

感谢!

参考资料

1. 在 Python 中实现分块

2. 分块背后的理论

3. NLP 中可用的 POS 完整列表

关于我

我是 Nithyashree V,BTech 计算机科学与工程专业的最后一年学生。 我喜欢学习这些很酷的技术并将它们付诸实践,尤其是观察它们如何帮助我们解决社会上具有挑战性的问题。 我感兴趣的领域包括人工智能、数据科学和自然语言处理。

这是我的LinkedIn个人资料: 我的领英

您可以阅读我关于 Analytics Vidhya 的其他文章 点击此处.

本文中显示的媒体不属于 Analytics Vidhya 所有,其使用由作者自行决定。

资料来源:https://www.analyticsvidhya.com/blog/2021/10/what-is-chunking-in-natural-language-processing/

时间戳记:

更多来自 分析维迪亚