📅  最后修改于: 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类来实现组合标记的操作,并通过特征提取的方式来进一步对文本进行分析和处理。