Python 自然语言处理工具包(Natural Language Toolkit,简称 NLTK)是一款 Python 的库,主要用于处理自然语言的相关问题,如文本清洗、标记化、分词、语义分析、词性标注、文本分类等功能,是数据科学家和机器学习工程师不可或缺的工具之一。
本文将介绍学习 Python NLTK 的路线,包括从简单的文本处理开始,到掌握较为复杂的自然语言处理技术,同时提供一些学习资料和优秀实践,帮助你快速入门 Python NLTK,提高自己的自然语言处理能力。
一、基础知识
- Python 基础
学习 Python NLTK,首先需要掌握 Python 的基本语法和语言特性,并学会使用 Python 安装和管理第三方库。
Python 教程:
Python官方文档:https://docs.python.org/3/tutorial/
Learn Python3 the Hard Way 中文版:https://wizardforcel.gitbooks.io/lpthw/content/
廖雪峰的 Python3 教程:https://www.liaoxuefeng.com/wiki/1016959663602400
- 文本处理基础
在学习自然语言处理前,需要掌握文本处理的基础知识,包括正则表达式、字符编码及文件操作等。
正则表达式教程:
菜鸟教程正则表达式:https://www.runoob.com/regexp/regexp-tutorial.html
Python正则表达式基本语法:https://www.runoob.com/python/python-reg-expressions.html
文件操作教程:
Python文件读写操作:https://www.runoob.com/python/python-files-io.html
Python文件操作手册:https://www.pythondoc.com/pythontutorial3/inputoutput.html
二、基础操作
- 安装 NLTK
安装 NLTK 包,可以使用 pip 工具进行安装。
pip install nltk
- 下载 NLTK 数据集
NLTK 提供了多种语料库、分类器和词典数据集,包括 Brown Corpus、Gutenberg Corpus、WordNet 等,下面介绍如何下载数据集。
import nltk
nltk.download() # 下载所有语料库和模型
nltk.download('stopwords') # 下载指定的语料库
nltk.download('punkt') # 下载指定的语料库
三、数据预处理
在进行自然语言处理前,需要对文本进行预处理,包括文本清洗、词干提取、词袋模型等操作。
- 文本清洗
文本清洗是指将文本中的噪声、特殊字符等无用信息去除,将文本转化为合适的格式进行处理,包括去除标点符号、转换为小写等操作。
- 分词
将文本拆分为单词或短语的过程称为分词,是进行自然语言处理的第一步。
import nltk
# 将文本转化为小写
sequence = 'Hello, World!'
tokens = [word.lower() for word in nltk.word_tokenize(sequence)]
print(tokens) # ['hello', ',', 'world', '!']
- 词干提取
将单词的词干提取出来,是自然语言处理中的重要操作,它能够将不同单词的 “干”( 或者说 基础形式)提取出来。
from nltk.stem import PorterStemmer
# 创建一个Porter stemmer object
porter = PorterStemmer()
# 进行词干提取
words = ["running","runner","runners","run","easily","fairly","fairness"]
for word in words:
print(porter.stem(word))
四、特征提取
在进行自然语言处理时,我们需要从文本中提取特征,然后将其用于分类、聚类、文本相似度比较等任务中。
- 词袋模型
词袋模型(Bag of Words,简称 BoW),是将文本转化为一组单词以及单词出现的频率作为特征的一种方法。
from sklearn.feature_extraction.text import CountVectorizer
# 创建 CountVectorizer 对象
vectorizer = CountVectorizer()
# 将文本拟合到 CountVectorizer 中
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?'
]
X = vectorizer.fit_transform(corpus)
# 打印特征值
print(vectorizer.get_feature_names())
# 打印词袋模型中文本的向量化表示
print(X.toarray())
- TF-IDF 模型
TF-IDF(Term Frequency-Inverse Document Frequency)模型是一种评估单词在文档中重要性的方法,即单词在文档中出现的频率越高,且同时在文档库中出现的频率越低,则此单词的重要性越大。
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
# 创建 TfidfVectorizer 对象
tfidf_vec = TfidfVectorizer()
# 计算词频-逆向文本频率
corpus = [
"This is the first document.",
"This is the second second document.",
"And the third one.",
"Is this the first document?"
]
tfidf_matrix = tfidf_vec.fit_transform(corpus)
# 打印特征值
print(tfidf_vec.get_feature_names())
# 打印词袋模型中文本的向量化表示
print(pd.DataFrame(tfidf_matrix.toarray(), columns=tfidf_vec.get_feature_names()))
五、自然语言处理实践
- 分类问题
文本分类是将文本按照某种类别划分的过程,是自然语言处理的一个重要任务,例如:新闻分类、聊天机器人回复等。
import nltk
import pandas as pd
from nltk.tokenize import word_tokenize, sent_tokenize
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 读取数据集
dataset = pd.read_csv("data.csv")
# 分词
tokens = []
for index, row in dataset.iterrows():
text = row['text']
words = nltk.word_tokenize(text)
tokens.append(words)
# 获得所有单词的列表
all_words = []
for token in tokens:
for word in token:
all_words.append(word)
# 列表去重
all_words = nltk.FreqDist(all_words)
# 获得前1000个常用单词
word_features = list(all_words.keys())[:1000]
# 特征提取
def find_features(document):
words = set(document)
features = {}
for w in word_features:
features[w] = (w in words)
return features
featuresets = [(find_features(rev), category) for (rev, category) in zip(tokens, dataset['category'])]
# 划分训练集和测试集
training_set, testing_set = train_test_split(featuresets, test_size=0.25, random_state=42)
# 训练模型
model = nltk.NaiveBayesClassifier.train(training_set)
# 打印准确率
accuracy = nltk.classify.accuracy(model, testing_set)
print("Accuracy of the model: ", accuracy)
# 分类预测
predicted = [model.classify(features) for (features, category) in testing_set]
actual = [category for (features, category) in testing_set]
print("Classification Report:\n", nltk.classify.util.accuracy(model, testing_set))
- 相似度计算
文本相似度计算是指计算两个文本之间的相似度,常用于信息检索系统和推荐系统中。
import nltk
import pandas as pd
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
# 读取数据集
dataset = pd.read_csv("data.csv")
# 预处理
texts = []
for text in dataset['text']:
words = word_tokenize(text)
texts.append(words)
# 进行词向量训练
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(texts)]
model = Doc2Vec(documents, vector_size=100, window=3, min_count=2, epochs=100)
# 计算文本相似度
text1 = "This is the first document."
text2 = "This is the second second document."
text3 = "And the third one."
text4 = "Is this the first document?"
text1_vec = model.infer_vector(word_tokenize(text1))
text2_vec = model.infer_vector(word_tokenize(text2))
text3_vec = model.infer_vector(word_tokenize(text3))
text4_vec = model.infer_vector(word_tokenize(text4))
print(nltk.cluster.util.cosine_distance(text1_vec, text2_vec))
print(nltk.cluster.util.cosine_distance(text1_vec, text3_vec))
print(nltk.cluster.util.cosine_distance(text1_vec, text4_vec))
六、学习资源
- 官方文档
Python NLTK 官方文档提供了详尽的使用方法、示例和 API 文档:http://www.nltk.org/
- NLTK 书籍
- 《Python自然语言处理》:讲解了 NLTK 的基本用法和自然语言处理技术,适合初学者阅读。
- 《自然语言处理与文本挖掘》:介绍了自然语言处理的基本方法和技术,并详细讲解了如何使用 Python 中的 NLTK 库进行自然语言处理。
- 《Python数据科学手册》:介绍了如何使用 Python 进行数据科学、机器学习和自然语言处理等任务。
- GitHub 示例
NLTK 官方文档中提供了多个示例项目,也可以在 GitHub 上找到更多的 NLTK 示例:https://github.com/search?q=nltk&type=Repositories
- 博客文章
- 集成机器学习和自然语言处理——NLTK 使用指南:https://towardsdatascience.com/integrating-machine-learning-and-natural-language-processing-nltk-a552dd9ceb9a
- Python下利用NLTK进行自然语言处理:https://zhuanlan.zhihu.com/p/33723365
- 自然语言处理(NLP)中最常用的 Python 库:https://towardsdatascience.com/the-most-used-python-libraries-for-nlp-5dcb388f024e
七、总结
以上就是 Python NLTK 的学习路线和相关资料,从基础知识到实际操作,希望可以帮助到想要学习自然语言处理的同学, NLTK 是 Python 中为数不多的自然语言处理库之一,可以帮助我们更好地预处理和处理文本数据,同时也可以应用于分类、相似度计算等任务中,是数据科学家和机器学习工程师不可或缺的工具之一。