78、自然语言处理的基础【用Python进行AI数据分析进阶教程】
摘要:本文系统介绍了自然语言处理(NLP)的基础知识、核心任务与典型应用。主要内容涵盖文本预处理(如分词、去停用词、词干提取)、词向量表示(如TF-IDF、Word2Vec、BERT)和文本分类方法(传统机器学习与深度学习模型)。文章强调了数据质量、语言特性和计算资源等关键注意点,并通过Python代码示例展示了NLTK、scikit-learn和Transformers等工具的实际应用。最后介绍
用Python进行AI数据分析进阶教程78
自然语言处理的基础
关键词:自然语言处理、文本预处理、词向量表示、文本分类、Transformer
摘要:本文系统介绍了自然语言处理(NLP)的基础知识、核心任务与典型应用。主要内容涵盖文本预处理(如分词、去停用词、词干提取)、词向量表示(如TF-IDF、Word2Vec、BERT)和文本分类方法(传统机器学习与深度学习模型)。文章强调了数据质量、语言特性和计算资源等关键注意点,并通过Python代码示例展示了NLTK、scikit-learn和Transformers等工具的实际应用。最后介绍了NLP在情感分析、机器翻译、问答系统等场景的应用,并对比了传统模型与基于BERT的预训练模型在性能与资源消耗上的差异,为初学者提供了清晰的NLP入门路径。
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
自然语言处理是人工智能的一个重要领域,旨在让计算机理解、处理和生成人类语言。NLP 的应用包括文本分类、情感分析、机器翻译、问答系统等。
一、NLP 的基础知识
自然语言处理(NLP)是人工智能的一个重要分支,旨在让计算机理解、处理和生成人类语言。NLP 的基础任务包括文本预处理、词向量表示、文本分类等。
1、文本预处理
文本预处理是 NLP 的第一步,目的是将原始文本转换为适合模型输入的格式。
(1)关键任务
- 分词(Tokenization):将文本分割成单词或子词。
- 去除停用词(Stopword Removal):去除无意义的常用词(如 "the", "is")。
- 词干提取(Stemming):将单词还原为词干(如 "running" → "run")。
- 词形还原(Lemmatization):将单词还原为词典形式(如 "better" → "good")。
- 去除非字母数字字符:去除标点符号、特殊字符等。
(2)注意点
- 语言特性:不同语言的分词规则和停用词列表不同。
- 任务需求:某些任务(如情感分析)可能需要保留停用词。
(3)代码示例
Python脚本
# 导入必要的库
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, WordNetLemmatizer
# 下载所需的NLTK数据包(仅需运行一次)
nltk.download('punkt') # 用于分词
nltk.download('stopwords') # 用于获取英文停用词
nltk.download('wordnet') # 用于词形还原
# 示例文本
text = "I love running in the park! It makes me feel better."
# 将文本转换为小写,并进行分词
tokens = word_tokenize(
text.lower() # 统一转为小写
)
# 输出分词结果
print("分词结果:", tokens)
# 获取英文停用词集合,用于过滤
stop_words = set(stopwords.words('english'))
# 过滤掉非字母数字字符,并移除停用词
filtered_tokens = [
word for word in tokens
if word.isalnum() # 保留字母或数字组成的词
and word not in stop_words # 去除停用词
]
# 输出去除停用词后的结果
print("去除停用词后:", filtered_tokens)
# 创建词干提取器(Porter算法)
stemmer = PorterStemmer()
# 对过滤后的词汇进行词干提取
stemmed_tokens = [
stemmer.stem(word) for word in filtered_tokens
]
# 输出词干提取结果
print("词干提取后:", stemmed_tokens)
# 创建词形还原器
lemmatizer = WordNetLemmatizer()
# 对过滤后的词汇进行词形还原(还原为基本词形)
lemmatized_tokens = [
lemmatizer.lemmatize(word) for word in filtered_tokens
]
# 输出词形还原结果
print("词形还原后:", lemmatized_tokens)
(4)重点语句解读
- word_tokenize(text.lower()):将文本转为小写并分词。
- stopwords.words('english'):加载英文停用词列表。
- stemmer.stem(word):对单词进行词干提取。
- lemmatizer.lemmatize(word):对单词进行词形还原。
2、词向量表示
词向量表示是将单词转换为数值向量,以便计算机能够处理。
(1)关键方法
- One-Hot Encoding:将单词表示为稀疏向量。
- TF-IDF:基于词频和逆文档频率的加权表示。
- Word2Vec:通过神经网络学习词向量。
- GloVe:基于全局词共现矩阵的词向量。
- BERT:基于上下文的词向量表示。
(2)注意点
- 维度灾难:One-Hot Encoding 会导致高维稀疏向量。
- 上下文信息:Word2Vec 和 GloVe 无法捕捉上下文信息,BERT 可以。
(3)代码示例
Python脚本
# 导入所需的库
from sklearn.feature_extraction.text import TfidfVectorizer # 用于TF-IDF向量化
from gensim.models import Word2Vec # 用于训练Word2Vec模型
# 定义示例文本列表,每条文本为一个字符串
documents = [
"I love natural language processing.",
"NLP is a fascinating field.",
"I enjoy learning about NLP techniques."
]
# 初始化TF-IDF向量化器,将文本转换为TF-IDF权重矩阵
vectorizer = TfidfVectorizer()
# 对文档进行拟合并转换为TF-IDF矩阵
tfidf_matrix = vectorizer.fit_transform(documents)
# 打印TF-IDF矩阵的数组形式,便于查看每个词的权重
print("TF-IDF 矩阵:\n", tfidf_matrix.toarray())
# 将文档中的每个句子转换为小写并按空格分割成词语列表(分词)
tokenized_docs = [
doc.lower().split() for doc in documents
]
# 训练Word2Vec模型
# 参数说明:
# - sentences: 训练数据,为分词后的句子列表
# - vector_size: 词向量维度
# - window: 上下文窗口大小
# - min_count: 忽略词频低于此值的词
# - workers: 用于并行训练的线程数
word2vec_model = Word2Vec(
sentences=tokenized_docs,
vector_size=100,
window=5,
min_count=1,
workers=4
)
# 输出词汇表中'nlp'这个词的词向量
print("Word2Vec 向量 (NLP):", word2vec_model.wv['nlp'])
(4)重点语句解读
- TfidfVectorizer():初始化 TF-IDF 向量化器。
- word2vec_model.wv['nlp']:获取单词 "nlp" 的词向量。
3. 文本分类
文本分类是将文本分配到预定义类别的任务,如情感分析、垃圾邮件检测等。
(1)关键方法
- 传统方法:TF-IDF + 机器学习模型(如朴素贝叶斯、SVM)。
- 深度学习方法:RNN、LSTM、Transformer。
(2)注意点
- 数据平衡:类别不平衡会影响模型性能。
- 模型选择:根据数据规模和任务复杂度选择模型。
(3)代码示例
Python脚本
# 导入所需的库
from sklearn.feature_extraction.text import TfidfVectorizer # 用于TF-IDF特征提取
from sklearn.model_selection import train_test_split # 用于划分训练集和测试集
from sklearn.naive_bayes import MultinomialNB # 多项式朴素贝叶斯分类器
from sklearn.metrics import accuracy_score # 用于计算准确率
# 定义示例文本数据集
documents = [
"I love this movie, it's fantastic!",
"This film is terrible, I hate it.",
"What a great experience, I enjoyed it.",
"The worst movie I've ever seen.",
"Absolutely wonderful, I recommend it."
]
# 定义对应的情感标签:1 表示正面,0 表示负面
labels = [1, 0, 1, 0, 1]
# 初始化 TF-IDF 向量化器,将文本转换为数值特征
vectorizer = TfidfVectorizer()
# 对文档进行 TF-IDF 特征提取,得到特征矩阵 X
X = vectorizer.fit_transform(documents)
# 将数据划分为训练集和测试集
# test_size=0.2 表示测试集占 20%,random_state 确保结果可复现
X_train, X_test, y_train, y_test = train_test_split(
X,
labels,
test_size=0.2,
random_state=42
)
# 初始化多项式朴素贝叶斯分类器
classifier = MultinomialNB()
# 使用训练集训练分类器
classifier.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = classifier.predict(X_test)
# 计算预测结果的准确率
accuracy = accuracy_score(y_test, y_pred)
# 输出分类准确率,保留两位小数
print(f"分类准确率:{accuracy:.2f}")
(4)重点语句解读
- TfidfVectorizer():将文本转换为 TF-IDF 特征向量。
- MultinomialNB():初始化朴素贝叶斯分类器。
- accuracy_score(y_test, y_pred):计算分类准确率。
二、NLP 的应用场景
- 文本分类:
例如:垃圾邮件分类、新闻分类。
- 情感分析:
例如:分析用户评论的情感倾向。
- 机器翻译:
例如:将英文翻译为中文。
- 问答系统:
例如:智能客服、聊天机器人。
三、NLP 的代码示例
以下是一个简单的文本分类示例,使用 scikit-learn 和 nltk 库进行情感分析。
Python脚本
# 导入必要的自然语言处理库
import nltk
# 从 sklearn 导入文本向量化工具
from sklearn.feature_extraction.text import TfidfVectorizer
# 从 sklearn 导入数据集划分工具
from sklearn.model_selection import train_test_split
# 从 sklearn 导入朴素贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB
# 从 sklearn 导入模型评估指标
from sklearn.metrics import accuracy_score
# 下载 nltk 所需的分词数据包 'punkt'
nltk.download('punkt')
# 下载英文停用词列表
nltk.download('stopwords')
# 定义示例文本数据集,包含五条电影评论
documents = [
"I love this movie, it's fantastic!",
"This film is terrible, I hate it.",
"What a great experience, I enjoyed it.",
"The worst movie I've ever seen.",
"Absolutely wonderful, I recommend it."
]
# 定义每条文本对应的情感标签:1 表示正面,0 表示负面
labels = [1, 0, 1, 0, 1]
# 获取英文停用词集合,用于文本清洗
stop_words = set(nltk.corpus.stopwords.words('english'))
# 定义文本预处理函数
def preprocess(text):
# 将文本转换为小写,并使用 nltk 进行分词
tokens = nltk.word_tokenize(text.lower())
# 过滤掉非字母数字的词项,并移除停用词
tokens = [
word for word in tokens
if word.isalnum() and word not in stop_words
]
# 将处理后的词项重新组合成字符串,供向量化使用
return ' '.join(tokens)
# 对所有文档进行预处理
processed_docs = [preprocess(doc) for doc in documents]
# 初始化 TF-IDF 向量化器,用于将文本转换为数值特征
vectorizer = TfidfVectorizer()
# 将预处理后的文本转换为 TF-IDF 特征矩阵
X = vectorizer.fit_transform(processed_docs)
# 划分训练集和测试集:
# 80% 训练,20% 测试,固定随机种子以确保结果可复现
X_train, X_test, y_train, y_test = train_test_split(
X,
labels,
test_size=0.2,
random_state=42
)
# 初始化多项式朴素贝叶斯分类器
classifier = MultinomialNB()
# 使用训练数据训练分类器
classifier.fit(X_train, y_train)
# 使用训练好的模型对测试集进行预测
y_pred = classifier.predict(X_test)
# 计算预测结果的准确率
accuracy = accuracy_score(y_test, y_pred)
# 输出分类准确率,保留两位小数
print(f"分类准确率:{accuracy:.2f}")
代码解读
以下是对你提供的代码中重点语句的逐条解读,帮助理解每一步的核心作用和原理:
1. nltk.download('punkt')
作用:下载 NLTK 的分词模型(Punkt tokenizer)。
解读:
punkt是 NLTK 提供的一个预训练的无监督句子和单词分词器。它能根据标点、大小写等规则将句子切分为单词。在调用nltk.word_tokenize()之前必须先下载此数据包,否则会报错。
2. stop_words = set(nltk.corpus.stopwords.words('english'))
作用:获取英文常见停用词集合(如 “the”, “a”, “and”, “is” 等无实际语义的高频词)。
解读:
停用词在文本分类中通常对情感判断帮助不大,反而可能引入噪声。将其去除可以减少特征维度、提升模型效率和准确性。使用set是为了提高查找效率(哈希表查询为 O(1))。
3. tokens = nltk.word_tokenize(text.lower())
作用:将输入文本转为小写后进行分词处理。
解读:
.lower()统一大小写,避免 “Love” 和 “love” 被视为不同词;word_tokenize()按语言学规则智能切分单词(比如能识别 “it’s” → “it”, “'s”);
这是自然语言处理的基础步骤。
4. [word for word in tokens if word.isalnum() and word not in stop_words]
作用:过滤掉非字母数字字符(如标点符号),并移除停用词。
解读:
word.isalnum()确保只保留纯字母或数字组成的词(过滤,,!,'等);word not in stop_words移除无意义高频词;
此操作提升了文本特征的质量,使模型更关注有实际情感含义的词汇。
5. vectorizer = TfidfVectorizer()
作用:创建一个 TF-IDF 向量化器对象。
解读:
TF-IDF(Term Frequency-Inverse Document Frequency)是一种将文本转换为数值向量的方法:
- TF(词频):一个词在文档中出现越频繁,重要性越高;
- IDF(逆文档频率):一个词在整个语料中出现越普遍,其区分能力越低,权重越小;
最终每个词被赋予一个反映其“关键程度”的权重,形成向量输入模型。
6. X = vectorizer.fit_transform(processed_docs)
作用:对预处理后的文本执行 fit + transform,生成 TF-IDF 特征矩阵。
解读:
fit:统计所有文本中的词汇及其 IDF 权重;transform:将每篇文档转换为以 TF-IDF 加权的向量(稀疏矩阵形式);
输出X是一个(n_samples, n_features)的矩阵,供机器学习模型使用。
7. train_test_split(..., test_size=0.2, random_state=42)
作用:将数据划分为训练集和测试集。
解读:
test_size=0.2表示拿出 20% 的数据用于测试,其余 80% 用于训练;random_state=42固定随机种子,确保每次运行结果一致(便于调试与复现);
这是评估模型泛化能力的标准做法。
8. classifier = MultinomialNB()
作用:初始化一个多项式朴素贝叶斯分类器。
解读:
多项式 NB 特别适用于离散特征(如词频、TF-IDF),基于贝叶斯定理和“特征条件独立”假设进行概率建模。
在文本分类任务中表现良好、计算高效,常作为基线模型使用。
9. classifier.fit(X_train, y_train)
作用:使用训练数据“训练”分类器。
解读:
模型通过统计每个类别下各个词语的出现概率(加权),学习“哪些词更可能出现在正面/负面评论中”。虽然数据量小,但这是完整的参数学习过程。
10. y_pred = classifier.predict(X_test)
作用:对测试集样本进行情感预测。
解读:
模型根据学到的概率分布,对新的(未见过的)文本向量进行分类决策,输出预测标签(0 或 1)。这是模型推理阶段。
11. accuracy = accuracy_score(y_test, y_pred)
作用:计算预测结果的准确率。
解读:
准确率 = 预测正确的样本数 / 总样本数。
它是最直观的分类性能指标,适用于类别平衡的情况(本例中正负类大致均衡)。
12. print(f"分类准确率:{accuracy:.2f}")
作用:格式化输出模型准确率,保留两位小数。
解读:
使用 f-string 格式化字符串,.2f表示浮点数保留两位小数。例如输出可能是:分类准确率:1.00表示模型在测试集上完全预测正确(注意:由于数据极小,可能存在过拟合或偶然性)。
总结:整体流程解读
| 步骤 | 功能 |
|---|---|
| 数据准备 | 提供带标签的文本样本(情感分类) |
| 文本预处理 | 分词、去停用词、清洗,提取有意义词汇 |
| 特征工程 | 使用 TF-IDF 将文本转为数值向量 |
| 模型训练 | 用朴素贝叶斯学习文本与标签之间的关系 |
| 模型评估 | 在测试集上预测并计算准确率 |
⚠️ 注意:当前数据集非常小(仅5条),测试集仅1条(20%),因此评估结果不具备统计意义。实际项目中应使用更大、更平衡的数据集,并考虑交叉验证等方式提升评估可靠性。
✅ 建议后续改进方向:
- 使用真实数据集(如 IMDb、Twitter 情感数据);
- 增加模型评估指标(精确率、召回率、F1);
- 添加交叉验证;
- 尝试其他模型(如逻辑回归、SVM、BERT)对比效果。
四、进阶:使用 Transformer 模型
以下是一个使用 Hugging Face transformers 库进行情感分析的示例。
Python脚本
# 导入 Hugging Face 提供的 pipeline 工具
# 用于快速加载和使用预训练的自然语言处理模型
from transformers import pipeline
# 初始化情感分析模型管道
# 自动下载并加载默认的预训练情感分析模型
# (如 distilbert-base-uncased-finetuned-sst-2-english)
sentiment_analyzer = pipeline(
task='sentiment-analysis' # 指定任务类型为情感分析
)
# 定义待分析的文本列表
# 包含两个情感倾向明显的英文句子,用于测试模型效果
texts = [
"I love this movie, it's fantastic!", # 积极情感示例
"This film is terrible, I hate it." # 消极情感示例
]
# 对输入文本列表进行批量情感分析
# 模型将返回每个文本的预测标签和置信度分数
results = sentiment_analyzer(texts)
# 遍历每一条分析结果
for result in results:
# 输出每条文本的分析结果
# 包括模型预测的情感标签(如 'POSITIVE' 或 'NEGATIVE')
# 以及对应的置信度(score),保留两位小数
print(
f"情感标签: {result['label']}, " # 显示预测的情感类别
f"置信度: {result['score']:.2f}" # 显示置信度,保留两位小数
)
代码解读
以下是对代码中重点语句的逐条解读,帮助理解其核心功能与技术意义:
1. from transformers import pipeline
解读:
这是 Hugging Face 提供的高级 API,用于快速加载和使用预训练的自然语言处理(NLP)模型。
pipeline封装了模型加载、分词、推理和后处理等步骤,极大简化了使用流程。- 用户无需手动处理模型细节(如 tokenizer、model 类型选择等),只需指定任务类型即可。
✅ 作用: 实现“开箱即用”的 NLP 模型调用。
2. sentiment_analyzer = pipeline(task='sentiment-analysis')
解读:
创建一个情感分析任务的模型管道。
task='sentiment-analysis'表示要执行的任务是情感分类(积极/消极)。- 第一次运行时会自动从 Hugging Face 模型库下载默认的预训练模型(通常是
distilbert-base-uncased-finetuned-sst-2-english)。 - 下载完成后,模型会被缓存,后续调用无需重复下载。
🧠 关键点:
- 自动化程度高:自动选择合适的 tokenizer 和 model。
- 默认模型简介:
- 基于 DistilBERT(轻量版 BERT)
- 在 SST-2 数据集上微调过(标准情感分析数据集)
- 支持英文情感分类
✅ 结果: 得到一个可直接调用的函数对象 sentiment_analyzer,输入文本即可输出预测结果。
3. texts = [...]
解读:
定义一个包含两个英文句子的列表,用于测试情感分析模型的效果。
- 第一句
"I love this movie, it's fantastic!"明显表达正面情感。 - 第二句
"This film is terrible, I hate it."明显表达负面情感。
📌 设计目的:
提供清晰、典型的情感样本,便于验证模型是否能正确识别情绪倾向。
4. results = sentiment_analyzer(texts)
解读:
对文本列表进行批量推理(batch inference)。
- 将多个文本一次性传入
pipeline,提高处理效率。 - 内部流程:
- 分词(Tokenization)—— 使用对应 tokenizer 处理文本
- 输入模型进行前向传播
- 输出预测结果(标签 + 置信度分数)
📤 返回值说明:
[
{'label': 'POSITIVE', 'score': 0.9998},
{'label': 'NEGATIVE', 'score': 0.9996}
]
每个结果包含:
'label': 预测的情感类别(POSITIVE / NEGATIVE)'score': 模型对该预测的置信度(概率值,范围 0~1)
✅ 优势: 支持批量输入,自动批处理,性能更优。
5. for result in results: ... print(...)
解读:
遍历每一条情感分析结果,并格式化输出。
- 使用 f-string 格式化打印:
{result['label']}:显示情感标签{result['score']:.2f}:将置信度保留两位小数显示(如0.99)
📌 示例输出:
情感标签: POSITIVE, 置信度: 0.99
情感标签: NEGATIVE, 置信度: 1.00
✅ 意义: 可视化模型预测结果,便于人工检查和调试。
✅ 总结:整段代码的核心逻辑
| 步骤 | 功能 |
|---|---|
| 导入 pipeline | 快速接入 Hugging Face 预训练模型生态 |
| 初始化情感分析器 | 加载默认情感分析模型(无需手动配置) |
| 准备测试文本 | 构造典型样例验证模型能力 |
| 批量预测 | 高效获取多个文本的情感判断 |
| 输出结果 | 展示标签与置信度,直观可读 |
🔍 补充建议(进阶方向):
- 若处理中文文本,需更换为支持中文的模型,例如:
sentiment_analyzer = pipeline( task='sentiment-analysis', model='uer/roberta-base-finetuned-dianping-chinese' ) - 可添加异常处理或限制最大长度防止长文本报错。
- 可扩展为 Web 应用(如结合 Flask 或 Gradio)供他人使用。
如有需要,我可以为你将此代码改造成支持中文、加入可视化或部署为 API 接口。
——The END——
本专栏《用Python进行AI数据分析进阶教程》共78集,到今天为止已经全部推出完毕。
后续,还会推出Python数据分析高级进阶版。敬请期待!
🔗 欢迎订阅专栏
| 序号 | 专栏名称 | 说明 |
|---|---|---|
| 1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
| 2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
| 3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
| 4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
| 5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
| 6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589
更多推荐



所有评论(0)