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)语法,提取文本中的名词短语。

相关推荐
小马过河R2 天前
小白沉浸式本地Mac小龙虾OpenClaw部署安装教程
人工智能·macos·大模型·nlp·agent·openclaw·龙虾
华农DrLai3 天前
什么是Prompt注入攻击?为什么恶意输入能操控AI行为?
人工智能·深度学习·大模型·nlp·prompt
华农DrLai3 天前
什么是Prompt模板?为什么标准化的格式能提高稳定性?
数据库·人工智能·gpt·nlp·prompt
华农DrLai3 天前
什么是自动Prompt优化?为什么需要算法来寻找最佳提示词?
人工智能·算法·llm·nlp·prompt·llama
华农DrLai4 天前
什么是Prompt工程?为什么提示词的质量决定AI输出的好坏?
数据库·人工智能·gpt·大模型·nlp·prompt
热爱生活的猴子4 天前
RoBERTa 分类模型正则化调优实验——即dropout和冻结层对过拟合的影响
人工智能·深度学习·分类·数据挖掘·nlp
数据智能老司机5 天前
精通 Hugging Face 自然语言处理——深度 Q 网络与 Atari 游戏
nlp
数据智能老司机5 天前
精通 Hugging Face 自然语言处理——Hugging Face Diffusers 中的调度器
nlp
数据智能老司机5 天前
精通 Hugging Face 自然语言处理——Hugging Face Diffusers 库导论
nlp
Learn Beyond Limits6 天前
循环神经网络的问题:梯度消失与梯度爆炸|Problems with RNNs: Vanishing and Exploding Gradients
人工智能·rnn·深度学习·神经网络·机器学习·自然语言处理·nlp