Python之nltk分词库的使用

本文将给大家介绍一下如何使用NLTK进行各种自然语言处理任务。 这些示例将涵盖文本预处理、词频统计、词形还原、命名实体识别、文本分类等多个方面。

注意:nltk对中文分词处理的不是很理想,如果跑代码建议把示例文本替换文英文
  1. 文本预处理

文本预处理是自然语言处理的基础步骤,包括分词、去除停用词、去除标点符号等。

示例:去除停用词和标点符号

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)
  1. 词频统计

统计文本中各个单词出现的频率,可以帮助了解文本的基本特征。

示例:词频统计与可视化

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()
  1. 词形还原(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']
  1. 命名实体识别(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)
  1. 使用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'}
  1. 文本分类

利用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
      ...
  1. 词汇搭配和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')]
  1. 句子相似度计算

通过计算词汇的相似度来衡量句子的相似度。

示例:使用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主要针对英文,中文句子的相似度计算需要其他方法。

  1. 生成词云

词云能直观展示文本中高频词汇。

示例:生成词云

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
  1. 基于规则的文本分类(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)语法,提取文本中的名词短语。

相关推荐
終不似少年遊*14 小时前
词向量与词嵌入
人工智能·深度学习·nlp·机器翻译·词嵌入
qq_15321452642 天前
Openai Dashboard可视化微调大语言模型
人工智能·语言模型·自然语言处理·chatgpt·nlp·gpt-3·transformer
花千树-0102 天前
Java中的自然语言处理(NLP)工具:Stanford NLP、Apache OpenNLP、DL4J
java·自然语言处理·nlp·aigc·apache
奔跑的蜗牛啊啊4 天前
linux部署olloma deespeek
nlp
終不似少年遊*4 天前
Transformer 的核心技术Encoder、Decoder、注意力模块解析
人工智能·深度学习·nlp·transformer·注意力机制
studying_mmr4 天前
Word Embeddings
机器学习·数据挖掘·nlp·data mining
南太湖小蚂蚁5 天前
自然语言处理入门1——单词的表示和距离
人工智能·python·深度学习·nlp
studying_mmr6 天前
Natural Language Processing NLP
数据挖掘·nlp·data mining
歌刎6 天前
华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南
linux·人工智能·华为·语言模型·nlp
Q同学8 天前
一张4060完成一个miniLLM全流程训练(一):预训练
深度学习·llm·nlp