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. 文本预处理(清洁文本数据)

原始文本(如用户评论、新闻)包含大量噪声(标点、停用词),需先清洗:

核心步骤:

  1. 去除标点符号、特殊字符;

  2. 转换为小写(统一格式);

  3. 分词(将句子拆分为单词 / 词语);

  4. 去除停用词(如 “的”“是”“the”“a” 等无意义词汇);

  5. (可选)词形还原 / 词性标注(优化特征质量)。

实战代码(中文文本预处理):

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]}")
posted @ 2026-01-19 20:30  三木彤  阅读(2)  评论(0)    收藏  举报