使用 Spacy 在 NLP 中进行词性标记

词性 (POS) 是在句子中扮演不同角色的单词。英语有 8 个词类。他们是:

  1. 名词
  2. 代词
  3. 动词
  4. 副词
  5. 形容词
  6. 介词
  7. 连词
  8. 交叉点

PoS 标签提供了有关单词及其邻居的大量信息。它可用于各种任务,例如情感分析、文本到语音转换等。

另请阅读:NLP 简介


什么是 POS 标签?

标记意味着将标记分类到预定义的类别中。词性 (POS)标记是使用合适的标记(即基于上下文的词性)标记给定语料库中每个单词的过程。它也称为语法标记


词性标注技术

词性标注器主要有四种类型:

  1. 基于规则的标注器:基于规则的标注器根据一些预定义的规则和提供给它们的信息的上下文来工作,以将词性分配给单词。
  2. 随机/概率标注器:这是最简单的词性标注方法。它使用概率、频率和统计数据。这些标注器找到训练数据中考虑的文本中给定单词最常使用的标签,并将该标签分配给测试数据中的单词。有时,这可能会导致标记在语法上不正确。
  3. 基于内存的标记器:案例集合保存在内存中,每个案例都有一个单词、其上下文和适当的标签。根据内存中保存的案例之间的最佳匹配,为新句子添加标签。
  4. 基于转换的标记器:它是基于规则和随机标记的组合。在这种类型中,规则是根据数据自动生成的。此外,还考虑了一些预定义的规则。这两个因素都用于在基于转换的词性标注器中执行词性标注。

现在,让我们尝试用 Python 实现 POS 标记。我们将了解如何使用spacyPython 中提供的库执行词性标记。

将以下文本视为我们用于执行词性标记的语料库。

Sarah lives in a hut in the village.
She has an apple tree in her backyard.
The apples are red in colour.

让我们创建上述句子的数据框。

import pandas as pd
 
text = ['Sarah lives in a hut in the village.',
      'She has an apple tree in her backyard.',
      'The apples are red in colour.']
 
df = pd.DataFrame(text, columns=['Sentence'])
 
df
POS 标签数据框

使用 spacy 进行词性标记

让我们开始使用 Python spacy 进行词性标记。

import spacy
 
#load the small English model
nlp = spacy.load("en_core_web_sm")
 
#list to store the tokens and pos tags
token = []
pos = []
 
for sent in nlp.pipe(df['Sentence']):
    if sent.has_annotation('DEP'):
        #add the tokens present in the sentence to the token list
        token.append([word.text for word in sent])
        #add the pos tage for each token to the pos list
        pos.append([word.pos_ for word in sent])

要了解有关 spacy 模型的更多信息,请参阅此链接

在上面的代码中,

  • 我们首先导入了 spacy 库。
  • 创建了两个列表 – 一个用于存储标记 ( token ),另一个 ( pos ) 用于存储词性标记。
  • 然后,我们循环数据框 (df) 的“句子”列中的每个句子,并
    • 将每个句子中的标记添加到标记列表中。
    • 将 token 对应的词性标签添加到 pos 列表中。

token列表如下所示:

[['Sarah', 'lives', 'in', 'a', 'hut', 'in', 'the', 'village', '.'],
 ['She', 'has', 'an', 'apple', 'tree', 'in', 'her', 'backyard', '.'],
 ['The', 'apples', 'are', 'red', 'in', 'colour', '.']]

名单pos是:

[['PROPN', 'VERB', 'ADP', 'DET', 'NOUN', 'ADP', 'DET', 'NOUN', 'PUNCT'],
 ['PRON', 'VERB', 'DET', 'NOUN', 'NOUN', 'ADP', 'PRON', 'NOUN', 'PUNCT'],
 ['DET', 'NOUN', 'AUX', 'ADJ', 'ADP', 'NOUN', 'PUNCT']]

如果我们想在句子中看到标记和 POS 标签,我们可以写

df['token'] = token
df['pos'] = pos

它将产生以下数据框:

POS 和令牌数据框

如果我们想知道特定 POS 标签的计数,我们应该使用该count方法。

# counting the number of a specific pos tag in each sentence
# (in the 'pos' col) and adding a new col for it in the df
df['noun'] = df.apply(lambda x: x['pos'].count('NOUN'), axis=1)
df['verb'] = df.apply(lambda x: x['pos'].count('VERB'), axis=1)
df['adj'] = df.apply(lambda x: x['pos'].count('ADJ'), axis=1)
df['punct'] = df.apply(lambda x: x['pos'].count('PUNCT'), axis=1)
 
df

上面的代码使用 lambda 函数来计算给定 POS 标签在上述列中出现的次数。
我们可以根据要求计算其他 POS 标签的数量。

其输出是:

POS 计数数据帧

结论

就这样!在本教程中,我们了解了词性标记及其使用Spacy 的实现。请随时在我们的网站上查看更多 Python 教程!


参考