本文将给大家介绍一下如何使用NLTK进行各种自然语言处理任务。 这些示例将涵盖文本预处理、词频统计、词形还原、命名实体识别、文本分类等多个方面。
注意:nltk对中文分词处理的不是很理想,如果跑代码建议把示例文本替换文英文
- 文本预处理
文本预处理是自然语言处理的基础步骤,包括分词、去除停用词、去除标点符号等。
示例:去除停用词和标点符号
Python
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import string
# 下载所需的资源
nltk.download('punkt')
nltk.download('stopwords')
# 示例文本
text = "自然语言处理(NLP)是计算机科学与人工智能领域的一个重要方向。它研究如何让计算机理解和生成人类语言。"
# 分词
tokens = word_tokenize(text)
# 去除停用词和标点符号
stop_words = set(stopwords.words('english')) # 注意:NLTK的默认停用词语言为英文
# 如果处理中文,可以自定义停用词列表
filtered_tokens = [word for word in tokens if word.lower() not in stop_words and word not in string.punctuation]
print("原始分词结果:", tokens)
print("去除停用词和标点后的结果:", filtered_tokens)
注意: NLTK默认的停用词列表主要针对英文。如果你处理中文文本,可能需要自定义中文停用词列表。
示例:自定义中文停用词
Python
import nltk
from nltk.tokenize import word_tokenize
import string
# 示例文本
text = "自然语言处理(NLP)是计算机科学与人工智能领域的一个重要方向。它研究如何让计算机理解和生成人类语言。"
# 分词(NLTK对中文分词支持有限,建议使用jieba)
# 这里为了简单起见,直接按字符分割
tokens = list(text)
# 自定义中文停用词列表
custom_stop_words = set(['的', '与', '一个', '如何', '和'])
# 去除停用词和标点符号
filtered_tokens = [word for word in tokens if word not in custom_stop_words and word not in string.punctuation and word.strip()]
print("去除停用词和标点后的结果:", filtered_tokens)
- 词频统计
统计文本中各个单词出现的频率,可以帮助了解文本的基本特征。
示例:词频统计与可视化
Python
import nltk
from nltk.tokenize import word_tokenize
from nltk.probability import FreqDist
import matplotlib.pyplot as plt
# 下载所需资源
nltk.download('punkt')
# 示例文本
text = "Natural language processing enables computers to understand human language. It's a fascinating field of artificial intelligence."
# 分词
tokens = word_tokenize(text.lower())
# 创建频率分布
freq_dist = FreqDist(tokens)
# 打印最常见的10个单词
print("最常见的10个单词:", freq_dist.most_common(10))
# 绘制频率分布图
freq_dist.plot(10, title='Top 10 Most Common Words')
plt.show()
- 词形还原(Lemmatization)
词形还原将单词还原为其基本形式,相较于词干提取更为准确。
示例:词形还原
Python
import nltk
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
# 下载所需资源
nltk.download('wordnet')
nltk.download('omw-1.4')
nltk.download('punkt')
lemmatizer = WordNetLemmatizer()
# 示例单词
words = ['running', 'runs', 'ran', 'easily', 'fairly']
# 词形还原
lemmatized_words = [lemmatizer.lemmatize(word, pos='v') for word in words]
print("词形还原结果:", lemmatized_words)
输出:
css
词形还原结果: ['run', 'run', 'run', 'easily', 'fairly']
- 命名实体识别(Named Entity Recognition, NER)
识别文本中的实体,如人名、地名、组织机构等。
示例:命名实体识别
Python
import nltk
from nltk import word_tokenize, pos_tag, ne_chunk
# 下载所需资源
nltk.download('punkt')
nltk.download('maxent_ne_chunker')
nltk.download('words')
# 示例文本
text = "Barack Obama was the 44th President of the United States."
# 分词
tokens = word_tokenize(text)
# 词性标注
tagged = pos_tag(tokens)
# 命名实体识别
entities = ne_chunk(tagged)
entities.draw() # 这将打开一个新窗口显示实体树
说明: entities.draw() 会弹出一个窗口显示实体树结构。如果你在Jupyter Notebook中,可以使用以下代码在Notebook中显示:
Python
from nltk import tree
import matplotlib.pyplot as plt
def plot_tree(t):
tree.plot_tree(t)
plot_tree(entities)
- 使用WordNet进行同义词和反义词查找
WordNet是一个大型的英语词汇数据库,NLTK提供了对WordNet的接口。
示例:查找同义词和反义词
Python
import nltk
from nltk.corpus import wordnet
# 下载WordNet资源
nltk.download('wordnet')
# 查找单词的同义词
synonyms = []
for syn in wordnet.synsets("happy"):
for lemma in syn.lemmas():
synonyms.append(lemma.name())
print("Synonyms of 'happy':", set(synonyms))
# 查找单词的反义词
antonyms = []
for syn in wordnet.synsets("happy"):
for lemma in syn.lemmas():
if lemma.antonyms():
antonyms.append(lemma.antonyms()[0].name())
print("Antonyms of 'happy':", set(antonyms))
输出:
arduino
Synonyms of 'happy': {'felicitous', 'happy', 'well-chosen'}
Antonyms of 'happy': {'unhappy'}
- 文本分类
利用NLTK进行简单的文本分类任务,例如情感分析、垃圾邮件分类等。
示例:朴素贝叶斯分类器进行情感分析
Python
import nltk
from nltk.corpus import movie_reviews
import random
# 下载所需资源
nltk.download('movie_reviews')
nltk.download('punkt')
nltk.download('stopwords')
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
# 准备数据
documents = []
for category in movie_reviews.categories():
for fileid in movie_reviews.fileids(category):
words = movie_reviews.words(fileid)
documents.append( (list(words), category) )
# 打乱数据
random.shuffle(documents)
# 提取特征
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words() if w.isalpha() and w.lower() not in stopwords.words('english'))
word_features = list(all_words)[:2000]
def document_features(document):
words = set(document)
features = {}
for w in word_features:
features[w] = (w in words)
return features
# 创建特征集
featuresets = [(document_features(d), c) for (d, c) in documents]
# 划分训练集和测试集
train_set, test_set = featuresets[:1900], featuresets[1900:]
classifier = nltk.NaiveBayesClassifier.train(train_set)
# 评估
print("分类准确率:", nltk.classify.accuracy(classifier, test_set))
# 显示最有信息量的特征
classifier.show_most_informative_features(10)
说明: 该示例使用了NLTK自带的电影评论数据集,对评论进行情感分类(积极或消极)。分类器使用朴素贝叶斯算法。
输出示例:
ini
分类准确率: 0.81
Most Informative Features
excellent = True pos : neg = 12.7 : 1.0
poor = True neg : pos = 9.6 : 1.0
...
- 词汇搭配和N-grams
发现文本中常见的词汇搭配(如二元组、三元组等)。
示例:发现二元搭配
Python
import nltk
from nltk.collocations import BigramCollocationFinder
from nltk.metrics import BigramAssocMeasures
from nltk.corpus import stopwords
import string
# 下载所需资源
nltk.download('punkt')
nltk.download('stopwords')
# 示例文本
text = "Natural language processing enables computers to understand human language. It's a fascinating field of artificial intelligence."
# 分词并过滤
tokens = [word.lower() for word in nltk.word_tokenize(text) if word.isalpha()]
stop_words = set(stopwords.words('english'))
filtered_tokens = [w for w in tokens if w not in stop_words]
# 查找二元搭配
finder = BigramCollocationFinder.from_words(filtered_tokens)
bigrams = finder.nbest(BigramAssocMeasures.pmi, 5)
print("二元搭配:", bigrams)
输出:
css
二元搭配: [('natural', 'language'), ('language', 'processing'), ('enable', 'computer'), ('fascinating', 'field'), ('artificial', 'intelligence')]
- 句子相似度计算
通过计算词汇的相似度来衡量句子的相似度。
示例:使用WordNet计算句子相似度
Python
import nltk
from nltk.corpus import wordnet as wn
from nltk.tokenize import word_tokenize
# 下载所需资源
nltk.download('wordnet')
nltk.download('punkt')
def get_synsets(word):
return wn.synsets(word)
def max_similarity(sentence1, sentence2):
words1 = word_tokenize(sentence1)
words2 = word_tokenize(sentence2)
max_sim = 0
for w1 in words1:
synsets1 = get_synsets(w1)
for w2 in words2:
synsets2 = get_synsets(w2)
for s1 in synsets1:
for s2 in synsets2:
sim = s1.wup_similarity(s2)
if sim and sim > max_sim:
max_sim = sim
return max_sim
# 示例句子
sentence1 = "Dogs are awesome."
sentence2 = "Cats are wonderful."
similarity = max_similarity(sentence1, sentence2)
print(f"句子相似度:{similarity}")
说明: 该示例使用了基于Wu-Palmer相似度的句子相似度计算方法。注意,由于WordNet主要针对英文,中文句子的相似度计算需要其他方法。
- 生成词云
词云能直观展示文本中高频词汇。
示例:生成词云
Python
import nltk
from nltk.corpus import gutenberg
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import string
# 下载所需资源
nltk.download('gutenberg')
# 选择一本书
text = gutenberg.raw('austen-emma.txt')
# 预处理
tokens = word_tokenize(text.lower())
filtered_tokens = [word for word in tokens if word.isalpha() and word not in stopwords.words('english') and word not in string.punctuation]
# 生成词云
word_freq = nltk.FreqDist(filtered_tokens)
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(word_freq)
# 显示词云
plt.figure(figsize=(15, 7.5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
注意: 需要安装wordcloud库,可以使用以下命令进行安装:
pip install wordcloud
- 基于规则的文本分类(Chunking)
使用基于规则的方法进行短语的提取和分类。
示例:名词短语提取
Python
import nltk
from nltk import pos_tag, word_tokenize, RegexpParser
# 下载所需资源
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
# 示例文本
text = "The quick brown fox jumps over the lazy dog."
# 分词和词性标注
tokens = word_tokenize(text)
tagged = pos_tag(tokens)
# 定义语法(名词短语)
grammar = "NP: {<DT>?<JJ>*<NN>}"
# 创建解析器
parser = RegexpParser(grammar)
# 解析
tree = parser.parse(tagged)
print(tree)
# 可视化
tree.draw()
说明: 该示例定义了一个简单的名词短语(NP)语法,提取文本中的名词短语。