Python NLP 从文本处理到实战应用
自然语言处理(NLP)是人工智能的核心方向之一,旨在让计算机理解、处理人类语言。无论是智能客服、文本分类、机器翻译,还是舆情分析、情感判断,背后都离不开 NLP 技术。本文从零基础出发,用 Python 手把手教你掌握 NLP 核心技能,覆盖文本预处理、特征提取、模型训练全流程,所有代码均可直接复用。
一、NLP 核心应用场景(先明确学习目标)
学习 NLP 前,先了解常见应用场景,明确技术落地方向:
-
文本分类:新闻分类、垃圾邮件识别、用户评论分类;
-
情感分析:电商评论情感判断(好评 / 差评)、社交媒体舆情分析;
-
文本生成:智能写作、机器翻译、聊天机器人回复生成;
-
信息抽取:从新闻 / 合同中提取关键信息(人名、地名、时间);
-
语音识别 / 合成:语音转文字、文字转语音(如 Siri、导航语音)。
二、入门必备工具与环境搭建
NLP 实战核心依赖 3 个 Python 库,先完成环境搭建:
1. 核心库介绍
| 库名 | 作用 | 安装命令 |
|---|---|---|
| NLTK | 经典 NLP 工具库,含分词、词性标注、语料库 | pip install nltk |
| jieba | 中文分词工具(NLTK 对中文支持弱) | pip install jieba |
| scikit-learn | 机器学习库,用于文本特征提取、模型训练 | pip install scikit-learn |
| pandas | 数据处理库,用于读取 / 清洗文本数据 | pip install pandas |
2. 环境验证
安装完成后,运行以下代码测试是否成功:
import nltk
import jieba
from sklearn.feature\_extraction.text import CountVectorizer
\# 下载NLTK基础语料库(首次运行需下载)
nltk.download('punkt')
nltk.download('averaged\_perceptron\_tagger')
\# 测试英文分词
english\_text = "I love natural language processing!"
english\_words = nltk.word\_tokenize(english\_text)
print("英文分词结果:", english\_words)
\# 测试中文分词
chinese\_text = "自然语言处理真有趣"
chinese\_words = jieba.lcut(chinese\_text)
print("中文分词结果:", chinese\_words)
运行后输出分词结果,说明环境搭建成功。
三、NLP 核心步骤:从文本预处理到特征提取
NLP 任务的基础是 “让计算机读懂文本”,需先将文本转化为机器可识别的数字(特征),核心步骤为:文本预处理 → 特征提取。
1. 文本预处理(清洁文本数据)
原始文本(如用户评论、新闻)包含大量噪声(标点、停用词),需先清洗:
核心步骤:
-
去除标点符号、特殊字符;
-
转换为小写(统一格式);
-
分词(将句子拆分为单词 / 词语);
-
去除停用词(如 “的”“是”“the”“a” 等无意义词汇);
-
(可选)词形还原 / 词性标注(优化特征质量)。
实战代码(中文文本预处理):
import jieba
import re
import pandas as pd
\# 1. 定义停用词列表(可从网上下载完整停用词表)
stop\_words = \["的", "是", "在", "和", "有", "我", "你", "他", "这", "那", "了", "着", "过"]
\# 2. 预处理函数
def preprocess\_chinese\_text(text):
  \# 去除标点和特殊字符
  text = re.sub(r'\[^\u4e00-\u9fa5a-zA-Z0-9\s]', '', text)
  \# 转换为小写(英文部分)
  text = text.lower()
  \# 中文分词
  words = jieba.lcut(text)
  \# 去除停用词和空字符
  words = \[word for word in words if word not in stop\_words and word.strip() != '']
  \# 返回处理后的词语列表
  return words
\# 3. 测试预处理
raw\_texts = \[
  "自然语言处理真的很有趣!我每天都在学习NLP技术。",
  "这篇Python NLP教程太实用了,零基础也能看懂~",
  "大家好,我是NLP初学者,希望和大家一起交流学习!"
]
\# 应用预处理函数
processed\_texts = \[preprocess\_chinese\_text(text) for text in raw\_texts]
print("预处理后的文本:")
for i, text in enumerate(processed\_texts):
  print(f"原文{i+1}:", raw\_texts\[i])
  print(f"处理后:", text)
  print("-" \* 50)
实战代码(英文文本预处理):
import nltk
from nltk.tokenize import word\_tokenize
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
\# 下载依赖语料库
nltk.download('stopwords')
nltk.download('wordnet')
\# 初始化工具
stop\_words = set(stopwords.words('english'))
lemmatizer = WordNetLemmatizer() # 词形还原工具
\# 预处理函数
def preprocess\_english\_text(text):
  \# 去除标点和特殊字符
  text = re.sub(r'\[^\w\s]', '', text)
  \# 转换为小写
  text = text.lower()
  \# 英文分词
  words = word\_tokenize(text)
  \# 去除停用词+词形还原(还原为单词原形,如running→run)
  words = \[lemmatizer.lemmatize(word) for word in words if word not in stop\_words]
  return words
\# 测试预处理
english\_raw\_texts = \[
  "I love learning Natural Language Processing! It's so interesting.",
  "This Python NLP tutorial is very useful for beginners.",
  "Hello everyone, I'm a new learner of NLP and want to share knowledge with you."
]
processed\_english\_texts = \[preprocess\_english\_text(text) for text in english\_raw\_texts]
print("英文预处理结果:")
for i, text in enumerate(processed\_english\_texts):
  print(f"原文{i+1}:", english\_raw\_texts\[i])
  print(f"处理后:", text)
  print("-" \* 50)
2. 特征提取(文本转数字)
计算机无法直接处理文本,需将预处理后的词语转化为数字特征,常用两种方法:
(1)词袋模型(Bag of Words)
核心思想:统计每个词语在文本中出现的频率,生成 “词语 - 频率” 矩阵。
from sklearn.feature\_extraction.text import CountVectorizer
\# 注意:CountVectorizer需要输入字符串,需将预处理后的词语列表拼接为句子
processed\_texts\_str = \[' '.join(words) for words in processed\_texts]
\# 初始化词袋模型
vectorizer = CountVectorizer()
\# 生成特征矩阵(行=文本,列=词语,值=出现频率)
bow\_matrix = vectorizer.fit\_transform(processed\_texts\_str)
\# 查看结果
print("词袋模型特征矩阵形状:", bow\_matrix.shape) # (3, 15) → 3个文本,15个不同词语
print("所有特征词语:", vectorizer.get\_feature\_names\_out())
print("特征矩阵(稀疏矩阵):")
print(bow\_matrix.toarray()) # 转换为稠密矩阵查看
(2)TF-IDF(词频 - 逆文档频率)
核心思想:不仅考虑词语出现频率,还考虑词语在所有文本中的 “重要性”(如罕见词对分类更有价值)。
from sklearn.feature\_extraction.text import TfidfVectorizer
\# 初始化TF-IDF模型
tfidf\_vectorizer = TfidfVectorizer()
\# 生成TF-IDF特征矩阵
tfidf\_matrix = tfidf\_vectorizer.fit\_transform(processed\_texts\_str)
\# 查看结果
print("TF-IDF特征矩阵形状:", tfidf\_matrix.shape)
print("所有特征词语:", tfidf\_vectorizer.get\_feature\_names\_out())
print("TF-IDF矩阵(稠密矩阵):")
print(tfidf\_matrix.toarray()) # 值为TF-IDF分数,分数越高表示词语对该文本越重要
选型建议:简单场景(如垃圾邮件识别)用词袋模型,复杂场景(如文本分类、情感分析)优先用 TF-IDF,能更好地突出关键特征。
四、实战项目 1:文本分类(新闻分类任务)
用已学的预处理、特征提取方法,结合机器学习模型实现新闻分类:
1. 数据准备
使用公开新闻数据集(可从 Kaggle 下载,或用以下模拟数据):
\# 模拟新闻数据(类别:体育、科技、娱乐)
news\_data = pd.DataFrame({
  "text": \[
  "国足3-0战胜越南队,晋级亚洲杯八强",
  "华为发布新款Mate手机,搭载最新麒麟芯片",
  "某顶流明星官宣新剧,粉丝连夜打call",
  "CBA常规赛:广东队击败辽宁队,取得十连胜",
  "人工智能大模型GPT-4发布,性能提升50%",
  "综艺《乘风2024》开播,话题度霸屏热搜"
  ],
  "label": \[0, 1, 2, 0, 1, 2] # 0=体育,1=科技,2=娱乐
})
2. 完整流程实现
\# 1. 文本预处理
news\_data\["processed\_text"] = news\_data\["text"].apply(preprocess\_chinese\_text)
news\_data\["processed\_text\_str"] = news\_data\["processed\_text"].apply(lambda x: ' '.join(x))
\# 2. 特征提取(TF-IDF)
tfidf\_vectorizer = TfidfVectorizer()
X = tfidf\_vectorizer.fit\_transform(news\_data\["processed\_text\_str"]) # 特征矩阵
y = news\_data\["label"] # 标签
\# 3. 划分训练集和测试集(8:2)
from sklearn.model\_selection import train\_test\_split
X\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.2, random\_state=42)
\# 4. 训练分类模型(使用朴素贝叶斯,适合文本分类)
from sklearn.naive\_bayes import MultinomialNB
from sklearn.metrics import accuracy\_score, classification\_report
\# 初始化模型
model = MultinomialNB()
\# 训练模型
model.fit(X\_train, y\_train)
\# 5. 预测与评估
y\_pred = model.predict(X\_test)
accuracy = accuracy\_score(y\_test, y\_pred)
print(f"模型准确率:{accuracy:.2f}")
print("分类报告:")
print(classification\_report(y\_test, y\_pred, target\_names=\["体育", "科技", "娱乐"]))
\# 6. 预测新新闻
new\_news = "最新款AI手表支持语音交互,续航提升至7天"
\# 预处理
new\_news\_processed = preprocess\_chinese\_text(new\_news)
new\_news\_str = ' '.join(new\_news\_processed)
\# 特征提取(需用训练好的vectorizer)
new\_news\_tfidf = tfidf\_vectorizer.transform(\[new\_news\_str])
\# 预测
pred\_label = model.predict(new\_news\_tfidf)\[0]
label\_map = {0: "体育", 1: "科技", 2: "娱乐"}
print(f"新新闻《{new\_news}》的分类结果:{label\_map\[pred\_label]}")
五、实战项目 2:情感分析(电商评论情感判断)
1. 数据准备
\# 模拟电商评论数据(1=好评,0=差评)
comment\_data = pd.DataFrame({
  "comment": \[
  "商品质量很好,做工精细,性价比超高,值得推荐",
  "物流太慢了,商品和描述不符,很失望",
  "使用体验很棒,功能齐全,比预期的好",
  "质量太差,用了一次就坏了,不建议购买",
  "包装很精致,发货快,客服态度好",
  "材质粗糙,尺寸偏小,非常不满意"
  ],
  "sentiment": \[1, 0, 1, 0, 1, 0]
})
2. 实现情感分析
\# 1. 预处理
comment\_data\["processed\_comment"] = comment\_data\["comment"].apply(preprocess\_chinese\_text)
comment\_data\["processed\_comment\_str"] = comment\_data\["processed\_comment"].apply(lambda x: ' '.join(x))
\# 2. 特征提取(TF-IDF)
tfidf\_vectorizer = TfidfVectorizer()
X = tfidf\_vectorizer.fit\_transform(comment\_data\["processed\_comment\_str"])
y = comment\_data\["sentiment"]
\# 3. 划分训练集/测试集
X\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.3, random\_state=42)
\# 4. 训练模型(逻辑回归)
from sklearn.linear\_model import LogisticRegression
model = LogisticRegression()
model.fit(X\_train, y\_train)
\# 5. 评估
y\_pred = model.predict(X\_test)
accuracy = accuracy\_score(y\_test, y\_pred)
print(f"情感分析准确率:{accuracy:.2f}")
print("分类报告:")
print(classification\_report(y\_test, y\_pred, target\_names=\["差评", "好评"]))
\# 6. 预测新评论
new\_comment = "这款产品真的太好用了,已经回购第三次了"
new\_comment\_processed = preprocess\_chinese\_text(new\_comment)
new\_comment\_str = ' '.join(new\_comment\_processed)
new\_comment\_tfidf = tfidf\_vectorizer.transform(\[new\_comment\_str])
pred\_sentiment = model.predict(new\_comment\_tfidf)\[0]
sentiment\_map = {0: "差评", 1: "好评"}
print(f"新评论《{new\_comment}》的情感结果:{sentiment\_map\[pred\_sentiment]}")
六、进阶方向:现代 NLP(深度学习模型)
以上是传统 NLP 方法,现代 NLP 更依赖深度学习(如 BERT、GPT),无需手动特征提取,模型能自动学习文本语义:
1. 核心工具
-
Transformers 库(Hugging Face):提供预训练模型(BERT、RoBERTa 等),开箱即用;
-
安装:
pip install transformers torch(需安装 PyTorch)。
2. 用 BERT 实现情感分析(极简示例)
from transformers import BertTokenizer, BertForSequenceClassification
import torch
\# 加载预训练BERT模型和Tokenizer(中文情感分析模型)
model\_name = "uer/bert-base-chinese-finetuned-dianping-chinese"
tokenizer = BertTokenizer.from\_pretrained(model\_name)
model = BertForSequenceClassification.from\_pretrained(model\_name)
\# 预处理文本(Tokenizer自动完成分词、编码)
new\_comment = "这款产品质量极差,客服态度恶劣"
inputs = tokenizer(
  new\_comment,
  return\_tensors="pt",
  padding=True,
  truncation=True,
  max\_length=512
)
\# 预测
model.eval()
with torch.no\_grad():
  outputs = model(\*\*inputs)
  logits = outputs.logits
  pred\_label = torch.argmax(logits, dim=1).item()
sentiment\_map = {0: "差评", 1: "好评"}
print(f"BERT模型预测结果:{sentiment\_map\[pred\_label]}")
浙公网安备 33010602011771号