一、NLTK简介
下图来自NLTK官网:https://www.nltk.org/index.html
NLTK,全称为Natural Language Toolkit,是一个用于处理和分析自然语言文本的Python库。它提供了一系列丰富的工具和资源,包括词汇资源(如WordNet)、语料库(如布朗语料库)、文本处理功能(如分词、词性标注、句法分析等),以及机器学习和统计分析工具,使得它成为自然语言处理(NLP)领域的一个重要工具。
二、开发和维护情况
NLTK(Natural Language Toolkit)最初由Steven Bird和Edward Loper在宾夕法尼亚大学开发。他们的目的是为教育和研究提供一个易于使用和功能强大的自然语言处理工具包。
NLTK是一个开源项目,由一个活跃的社区和贡献者维护。你可以在其GitHub仓库上看到最新的更新、提交和发布版本。该项目仍在积极维护中,定期有新的版本发布,修复bug和增加新功能。
三、NLTK的原理
NLTK结合了计算机科学、语言学和机器学习的多种技术和算法,主要包括以下几个方面:
3.1 文本预处理:
- 分词(Tokenization):将文本分割成单词和句子。使用的技术包括正则表达式匹配和状态机。
- 词形还原(Lemmatization)和词干提取(Stemming):将单词还原到其基本形式或去掉词缀,通常通过查找表或算法(如Porter Stemmer)实现。
3.2 词性标注(Part-of-Speech Tagging):
- 使用机器学习模型(如条件随机场CRF或隐马尔可夫模型HMM)来标注单词的词性(如名词、动词等)。
- NLTK提供了预训练的词性标注器,并允许用户训练自己的模型。
3.3 命名实体识别(Named Entity Recognition, NER):
- 通过规则或机器学习模型识别和分类文本中的命名实体(如人名、地名、组织等)。
- 常用技术包括最大熵模型和序列标注算法。
3.4 句法分析(Parsing):
- 分析句子的语法结构,构建句法树。
- 使用上下文无关文法(CFG)和统计方法(如依存分析)来解析句子。
3.5 语料库和词汇资源:
- 提供大量的预定义语料库和词汇资源(如WordNet),用于文本分析和研究。
- 语料库包含标注的文本数据,词汇资源包含单词及其关系(同义词、反义词等)。
3.6 机器学习和统计分析:
- NLTK集成了多种机器学习算法和统计工具,用于分类、聚类、回归等任务。
- 支持与其他机器学习库(如scikit-learn)结合使用。
四、安装NLTK
4.1 安装命令
你可以使用以下命令来安装NLTK:
pip install nltk
4.2 常见报错
一般在安装完成之后,需要手动下载一些语料库,否则在运行时会出现如下报错:
LookupError:
**********************************************************************
Resource punkt not found.
Please use the NLTK Downloader to obtain the resource:
>>> import nltk
>>> nltk.download('punkt')
For more information see: https://www.nltk.org/data.html
Attempted to load tokenizers/punkt/PY3/english.pickle
Searched in:
4.3 常见需要下载的资源以及安装示例
NLTK包含许多需要下载的资源,如语料库、词汇资源,根据提示进行安装,安装示例如下:
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('maxent_ne_chunker')
nltk.download('words')
nltk.download('wordnet')
五、NLTK的主要功能
5.1 分词(Tokenization):将文本分割成单词或句子。
from nltk.tokenize import word_tokenize, sent_tokenize
text = "This is a sentence. This is another sentence."
print(word_tokenize(text)) # ['This', 'is', 'a', 'sentence', '.', 'This', 'is', 'another', 'sentence', '.']
print(sent_tokenize(text)) # ['This is a sentence.', 'This is another sentence.']
5.2 词性标注(Part-of-Speech Tagging):为每个单词分配词性标签,如名词、动词等。
from nltk import pos_tag
tokens = word_tokenize("This is a sample sentence.")
print(pos_tag(tokens)) # [('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('sample', 'NN'), ('sentence', 'NN'), ('.', '.')]
5.3 命名实体识别(Named Entity Recognition, NER):识别文本中的命名实体,如人名、地名、组织等。
from nltk import ne_chunk
from nltk.tree import Tree
tags = pos_tag(word_tokenize("Barack Obama was born in Hawaii."))
entities = ne_chunk(tags)
print(entities) # (S (PERSON Barack/NNP Obama/NNP) was/VBD born/VBN in/IN (GPE Hawaii/NNP) ./.)
5.4 句法分析(Parsing):分析句子的语法结构。
from nltk import CFG
grammar = CFG.fromstring("""
S -> NP VP
VP -> V NP | V NP PP
V -> "saw" | "ate" | "walked"
NP -> "John" | "Mary" | "Bob" | Det N | Det N PP
Det -> "a" | "an" | "the" | "my"
N -> "man" | "dog" | "cat" | "telescope" | "park"
PP -> P NP
P -> "in" | "on" | "by" | "with"
""")
sentence = "Mary saw a dog"
parser = nltk.ChartParser(grammar)
for tree in parser.parse(sentence.split()):
print(tree)
# (S (NP Mary) (VP (V saw) (NP (Det a) (N dog))))
5.5 词汇资源:使用内置的词汇资源如WordNet进行词汇关系的查询和分析。
from nltk.corpus import wordnet
synsets = wordnet.synsets("dog")
print(synsets) # [Synset('dog.n.01'), Synset('frump.n.01'), ...]
print(synsets[0].definition()) # 'a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times; occurs in many breeds'
5.6 语料库:访问和使用内置的各种语料库
from nltk.corpus import gutenberg
print(gutenberg.fileids()) # ['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', ...]