用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-learnnltk 库进行情感分析。

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,提高处理效率。
  • 内部流程:
    1. 分词(Tokenization)—— 使用对应 tokenizer 处理文本
    2. 输入模型进行前向传播
    3. 输出预测结果(标签 + 置信度分数)

📤 返回值说明:

[
  {'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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐