📜  自然语言工具包-组合标记(1)

📅  最后修改于: 2023-12-03 15:11:48.008000             🧑  作者: Mango

自然语言工具包-组合标记

简介

自然语言工具包(Natural Language Toolkit,简称NLTK)是一个Python第三方库,主要用于对自然语言文本进行处理,包括分词、词性标注、命名实体识别、语法分析等等。

其中,组合标记(Chunking)是指将一个句子中的词汇组合成一些有意义的短语(如名词短语、动词短语等),从而形成更高层次的结构。

快速上手

首先,需要安装NLTK库:

pip install nltk

接下来,需要下载NLTK中的一些数据集,可通过如下Python命令实现:

import nltk
nltk.download()

运行上述命令后,会弹出一个界面,选择“all”即可下载所有数据集。

接下来,导入nltk包并进行分词和词性标注:

import nltk

sentence = "John saw the book on the table"
tokens = nltk.word_tokenize(sentence)
tags = nltk.pos_tag(tokens)

上述代码中,我们首先对句子进行了分词操作,此处将句子分解为单词,即["John", "saw", "the", "book", "on", "the", "table"]。接着,我们对分词后的结果进行了词性标注,得到如下结果:

[('John', 'NNP'), ('saw', 'VBD'), ('the', 'DT'), ('book', 'NN'), ('on', 'IN'), ('the', 'DT'), ('table', 'NN')]

其中,词性标注的结果为一个元组,第一个元素表示单词,第二个元素表示该单词的词性(Part-Of-Speech,简称POS)。

接下来,我们可以使用nltk中的RegexpParser类来进行组合标记操作:

grammar = "NP: {<DT>?<JJ>*<NN>}"
cp = nltk.RegexpParser(grammar)
tree = cp.parse(tags)

上述代码中,我们定义了一个包含名词短语的语法规则,然后使用RegexpParser类中的parse()方法将词性标注的结果进行组合标记,并得到如下树形结构:

(S
  (NP John/NNP)
  saw/VBD
  (NP the/DT book/NN)
  on/IN
  (NP the/DT table/NN))

其中,NP表示名词短语,其后的标记为该名词短语所包含的单词和它们的词性。

组合标记实战

实现一个简单的邮件分类器,给定一封邮件,判断其是否为垃圾邮件。

首先,需要准备好一个包含多封邮件的文本文件,每封邮件应当以“Subject:”开头,内容部分以空行分隔。

读取邮件并进行组合标记和特征提取,全部代码如下所示:

import nltk
import os

# 定义语法规则
grammar = r"""
    NP: {<DT|PRP\$>?<JJ>*<NN.*>}
    """
cp = nltk.RegexpParser(grammar)

# 加载邮件数据集
path = "emails/"
emails = []
for filename in os.listdir(path):
    with open(path + filename, "r", encoding="utf-8", errors="ignore") as f:
        content = f.read()
        # 提取邮件主题
        subject = content.split("Subject:")[1].split("\n")[0].strip()
        # 提取邮件内容
        body = content.split("\n\n")[1].strip()
        # 进行组合标记
        tokens = nltk.word_tokenize(body)
        tags = nltk.pos_tag(tokens)
        tree = cp.parse(tags)
        # 提取特征
        features = {}
        for subtree in tree.subtrees():
            if subtree.label() == "NP":
                noun_phrase = " ".join(word for word, tag in subtree.leaves())
                features[noun_phrase] = True
        emails.append((features, subject))

# 输出特征结果
for features, subject in emails:
    print(subject)
    print(features)
    print("-" * 50)

上述代码中,我们首先定义了一个语法规则NP,用于识别名词短语。然后,我们通过读取邮件数据集的方式,逐一对每封邮件进行组合标记和特征提取的操作,并最终输出特征结果。

总结

组合标记是自然语言处理中的一个重要概念,通过组合标记可以将一些单词组合成一些更加有意义的短语,从而更好地识别和理解文本内容。在NLTK中,我们可以通过nltk.RegexpParser类来实现组合标记的操作,并通过特征提取的方式来进一步对文本进行分析和处理。