跳至主要內容

第3天上午_Python文本分析

周子力大约 12 分钟教学文档Python基础

一日速成:Python文本分析实战培训方案

培训总体设计

培训目标:8小时内掌握文本分析全流程技能,覆盖数据获取→清洗→特征提取→情感分析→主题建模→实体识别→分类预测
教学理念:70%实战编码 + 20%原理讲解 + 10%案例复盘
技术栈选择:聚焦工业级实用工具(jieba/pkuseg/spaCy),兼顾传统方法与现代技术(BERT简介)
课前准备:学员需提前安装Anaconda,培训现场提供Docker镜像(含所有依赖库)


上午培训讲义(8:00-12:00)

8:00-8:30 课程导入与环境配置

学习目标

  • 理解文本分析的应用场景与技术栈全景
  • 完成开发环境配置

核心内容

# 【现场演示】环境验证脚本(学员运行确认环境就绪)
import sys, platform
print(f"Python版本: {sys.version}")
print(f"操作系统: {platform.system()} {platform.release()}")

# 必装库清单(培训专用Docker镜像已预装)
required_libs = [
    "jieba>=0.42.1", "pkuseg>=0.0.28", "snownlp>=0.12.3",
    "scikit-learn>=1.4.0", "gensim>=4.3.0", "wordcloud>=1.9.2",
    "spacy>=3.7.0", "matplotlib>=3.8.0", "pandas>=2.1.0"
]
print("✅ 环境准备就绪!8小时掌握文本分析核心技能")

文本分析技术全景图

数据层 → 清洗层 → 特征层 → 分析层 → 应用层
  ↓        ↓        ↓        ↓        ↓
原始文本 → 正则清洗 → 词向量   → 情感/主题 → 商业决策
          → 分词标注 → TF-IDF  → 实体识别 → 产品优化

💡 最佳实践:中文文本分析优先使用UTF-8编码,避免GBK乱码问题(90%的初学者踩坑点)


8:30-9:30 文本基础处理:从原始数据到干净文本

学习目标

  • 掌握编码处理、噪声清洗、正则表达式实战
  • 处理真实场景中的脏数据(HTML/表情/特殊符号)

核心技能点

  1. 编码自动检测与转换
import chardet, codecs

def auto_decode(text_path):
    """智能编码检测(解决中文乱码核心方案)"""
    with open(text_path, 'rb') as f:
        raw = f.read(10000)  # 采样前10KB
        result = chardet.detect(raw)
        encoding = result['encoding'] if result['confidence'] > 0.7 else 'utf-8'
    
    with codecs.open(text_path, 'r', encoding=encoding, errors='ignore') as f:
        return f.read()

# 练习1:清洗电商评论中的噪声
sample_text = "商品质量★★★★☆ 很好!<br>就是物流太慢了😭  #推荐#"
  1. 正则表达式实战清洗
import re

def clean_text(text):
    """工业级文本清洗流水线"""
    # 1. 去除HTML标签
    text = re.sub(r'<[^>]+>', '', text)
    # 2. 去除URL
    text = re.sub(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', '', text)
    # 3. 去除表情符号(保留中文常用表情)
    text = re.sub(r'[^\u4e00-\u9fa5\u3000-\u303f\uFF00-\uFFEFa-zA-Z0-9,。!?、]+', '', text)
    # 4. 去除多余空格
    text = re.sub(r'\s+', ' ', text).strip()
    return text

cleaned = clean_text(sample_text)
print(f"清洗后: {cleaned}")  # 输出: 商品质量 很好 就是物流太慢了 推荐

练习任务:清洗100条微博数据(提供sample_weibo.txt),要求去除@用户、话题标签#...#,保留核心评论内容


9:30-10:30 中文分词与词性标注:理解语言结构

学习目标

  • 掌握三种主流中文分词工具的适用场景
  • 实现精准分词+词性标注+自定义词典

核心技能点

  1. jieba:速度与易用性平衡
import jieba
import jieba.posseg as pseg

text = "自然语言处理是人工智能的重要分支"

# 精确模式(默认)
print("/".join(jieba.cut(text)))  
# 输出: 自然语言/处理/是/人工智能/的/重要/分支

# 搜索引擎模式(适合索引构建)
print("/".join(jieba.cut_for_search(text)))

# 词性标注
words = pseg.cut(text)
for word, flag in words:
    print(f"{word}({flag})", end=" ")
# 输出: 自然语言(n) 处理(v) 是(v) 人工智能(nr) 的(ude1) 重要(a) 分支(n)
  1. pkuseg:高精度领域分词(2025年推荐)
import pkuseg

# 加载预训练模型(支持新闻/网络/医药等多领域)
seg = pkuseg.pkuseg(model_name='web')  # 网络文本专用模型
text = "Transformer架构在2025年仍是NLP主流"
print("/".join(seg.cut(text)))
# 输出: Transformer/架构/在/2025年/仍/是/NLP/主流 (优于jieba的"2025/年"错误切分)
  1. 自定义词典增强(解决专业术语切分问题)
# 添加领域词典(电商场景示例)
jieba.add_word("直播间", freq=2000, tag='n')
jieba.add_word("秒杀价", freq=1500, tag='n')

text = "直播间秒杀价太划算了"
print("/".join(jieba.cut(text)))  # 正确切分:直播间/秒杀价/太/划算/了

对比实验:同一段医疗文本用jieba/pkuseg分词,统计"新冠肺炎"等专业术语的切分准确率
💡 最佳实践:通用场景用jieba(快),专业领域用pkuseg(准),关键业务词必须加自定义词典


10:45-12:00 特征提取与可视化:从文本到数据

学习目标

  • 掌握词袋模型、TF-IDF特征工程
  • 生成专业级词云与频率分布图

核心技能点

  1. TF-IDF特征提取(文本分析基石)
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

# 构建文档集合(模拟新闻数据)
docs = [
    "人工智能改变未来 机器学习深度学习",
    "自然语言处理是AI重要分支",
    "深度学习推动计算机视觉发展",
    "机器学习算法需要大量数据训练"
]

# 中文TF-IDF向量化(自动分词+停用词过滤)
vectorizer = TfidfVectorizer(
    tokenizer=jieba.lcut,  # 使用jieba分词器
    stop_words=['的', '了', '是', '在', '和'],  # 中文停用词
    max_features=20  # 保留Top20特征
)
tfidf_matrix = vectorizer.fit_transform(docs)

# 查看特征词与权重
feature_names = vectorizer.get_feature_names_out()
df_tfidf = pd.DataFrame(tfidf_matrix.toarray(), columns=feature_names)
print(df_tfidf.round(3))
  1. 专业级词云生成(含形状定制)
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter

# 统计词频(停用词过滤)
words = jieba.lcut(" ".join(docs))
stopwords = set(['的', '了', '是', '在', '和', ' ', ''])
filtered = [w for w in words if len(w) > 1 and w not in stopwords]
word_freq = Counter(filtered)

# 生成词云(支持中文字体)
wc = WordCloud(
    font_path='simhei.ttf',  # 必须指定中文字体
    background_color='white',
    max_words=50,
    width=800, height=400
).generate_from_frequencies(word_freq)

plt.figure(figsize=(10, 5))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.title('新闻关键词云', fontsize=16)
plt.savefig('wordcloud.png', dpi=300, bbox_inches='tight')
plt.show()
  1. 高频词分布可视化
# Top20高频词柱状图
top20 = word_freq.most_common(20)
words, counts = zip(*top20)

plt.figure(figsize=(12, 6))
plt.barh(words[::-1], counts[::-1], color='skyblue')
plt.xlabel('词频', fontsize=12)
plt.title('Top20高频词分布', fontsize=14)
plt.tight_layout()
plt.show()

综合练习:分析200条豆瓣电影短评,输出:
(1) 词云图 (2) 情感高频词对比(好评vs差评) (3) TF-IDF特征矩阵保存为CSV


下午培训讲义(14:00-18:00)

14:00-15:00 情感分析:挖掘文本情绪价值

学习目标

  • 掌握词典法情感分析原理与实现
  • 构建领域自适应情感分析器

核心技能点

  1. SnowNLP快速情感分析(适合中文)
from snownlp import SnowNLP

text = "这个手机拍照效果惊艳,但电池续航太差了"
s = SnowNLP(text)

print(f"情感得分: {s.sentiments:.3f}")  # 0~1,>0.6积极,<0.4消极
print(f"关键词: {s.keywords(3)}")       # ['电池', '续航', '拍照']
print(f"摘要: {s.summary(2)}")          # ['这个手机拍照效果惊艳', '但电池续航太差了']
  1. 自定义情感词典(解决领域适配问题)
# 构建电商领域情感词典
positive_words = {'惊艳': 2.0, '超值': 1.8, '秒杀': 1.5}
negative_words = {'太差': -2.0, '失望': -1.8, '坑': -2.5}

def custom_sentiment(text):
    """基于自定义词典的情感分析"""
    words = jieba.lcut(text)
    score = 0
    for w in words:
        if w in positive_words:
            score += positive_words[w]
        elif w in negative_words:
            score += negative_words[w]
    return score / len(words) if words else 0

# 对比测试
texts = [
    "直播间秒杀价太划算了",
    "物流慢得像蜗牛,太坑了"
]
for t in texts:
    print(f"{t} → SnowNLP: {SnowNLP(t).sentiments:.2f} | 自定义: {custom_sentiment(t):.2f}")
  1. 情感强度可视化(雷达图)
import numpy as np

# 分析100条评论的情感分布
comments = ["很好", "一般", "太差了", "超赞", "还行"] * 20
scores = [SnowNLP(c).sentiments for c in comments]

# 绘制情感分布直方图
plt.figure(figsize=(8, 4))
plt.hist(scores, bins=20, color='coral', edgecolor='black')
plt.axvline(0.5, color='red', linestyle='--', label='中性线')
plt.xlabel('情感得分')
plt.ylabel('评论数量')
plt.title('用户评论情感分布')
plt.legend()
plt.show()

实战任务:分析500条手机评论,输出:
(1) 整体情感倾向(积极/中性/消极占比)
(2) 各产品维度(屏幕/电池/拍照)的情感得分对比
💡 避坑指南:SnowNLP训练语料偏微博,电商/医疗等领域需重新训练或自定义词典


15:00-16:00 主题建模:发现文本隐藏结构

学习目标

  • 掌握LDA主题模型原理与实现
  • 从海量文本中自动发现主题

核心技能点

  1. LDA主题建模全流程
from gensim import corpora, models
import jieba

# 准备语料(20篇科技新闻标题)
corpus = [
    "人工智能芯片突破算力瓶颈",
    "深度学习框架PyTorch发布新版本",
    "量子计算取得重大进展",
    "自动驾驶技术面临法规挑战",
    # ... 共20条
]

# 1. 分词+过滤停用词
stopwords = set(['的', '了', '是', '在', '和', ' ', ''])
texts = [[word for word in jieba.lcut(doc) if word not in stopwords and len(word)>1] 
         for doc in corpus]

# 2. 构建词典与语料向量
dictionary = corpora.Dictionary(texts)
corpus_bow = [dictionary.doc2bow(text) for text in texts]

# 3. 训练LDA模型(设定3个主题)
lda = models.LdaModel(
    corpus=corpus_bow,
    id2word=dictionary,
    num_topics=3,
    passes=10,
    random_state=42
)

# 4. 查看主题关键词
print("LDA发现的3个主题:")
for topic_id in range(3):
    print(f"\n主题#{topic_id}:")
    print(lda.show_topic(topic_id, topn=8))
  1. 主题可视化(pyLDAvis)
# 安装: pip install pyldavis
import pyLDAvis.gensim_models as gensimvis
import pyLDAvis

# 生成交互式可视化
vis = gensimvis.prepare(lda, corpus_bow, dictionary)
pyLDAvis.save_html(vis, 'lda_topics.html')  # 生成HTML交互图表
  1. 文档-主题分布分析
# 查看每篇文档的主题分布
for i, doc_bow in enumerate(corpus_bow[:5]):
    topic_dist = lda.get_document_topics(doc_bow)
    print(f"\n文档{i}: {corpus[i][:20]}...")
    for topic_id, prob in topic_dist:
        print(f"  主题{topic_id}: {prob:.2%}")

实战任务:对1000条知乎问题标题进行LDA建模,要求:
(1) 通过困惑度(Perplexity)选择最优主题数(5-15范围)
(2) 输出每个主题的Top10关键词
(3) 将问题按主题聚类并人工解读主题含义
💡 关键技巧:LDA效果依赖文本质量,务必先做分词清洗;主题数选择需结合业务理解


16:15-17:15 命名实体识别与文本分类实战

学习目标

  • 掌握spaCy中文NER实现
  • 构建端到端文本分类pipeline

核心技能点

  1. spaCy中文实体识别(工业级方案)
# 安装中文模型: python -m spacy download zh_core_web_sm
import spacy

nlp = spacy.load("zh_core_web_sm")
text = "2025年3月,阿里巴巴在杭州发布了通义千问3.0模型"

doc = nlp(text)
print("识别到的实体:")
for ent in doc.ents:
    print(f"{ent.text:12}{ent.label_} ({spacy.explain(ent.label_)})")

# 输出示例:
# 2025年3月     → DATE (日期)
# 阿里巴巴       → ORG (组织)
# 杭州          → GPE (地名)
# 通义千问3.0    → PRODUCT (产品)
  1. 文本分类实战:新闻分类器
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# 模拟数据(5类新闻)
categories = ['科技', '体育', '财经', '娱乐', '军事']
samples = [
    ("人工智能芯片突破", "科技"),
    ("NBA总决赛湖人夺冠", "体育"),
    ("股市大涨3%", "财经"),
    # ... 共200条样本
]

texts, labels = zip(*samples)

# 构建分类pipeline(分词+TF-IDF+逻辑回归)
clf = Pipeline([
    ('tfidf', TfidfVectorizer(tokenizer=jieba.lcut, max_features=500)),
    ('clf', LogisticRegression(max_iter=1000))
])

# 训练与评估
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

print(classification_report(y_test, y_pred, target_names=categories))
  1. 特征重要性分析(可解释性)
# 提取模型学到的关键词
feature_names = clf.named_steps['tfidf'].get_feature_names_out()
coef = clf.named_steps['clf'].coef_

for i, category in enumerate(categories):
    top5 = np.argsort(coef[i])[-5:][::-1]
    print(f"\n{category}类关键词: {[feature_names[idx] for idx in top5]}")

综合实战:构建微博情感分类器
数据:500条带标签微博(积极/消极)
要求:(1) 数据清洗 (2) 特征工程 (3) 模型训练 (4) 混淆矩阵可视化
💡 进阶提示:小数据集优先用传统机器学习(LR/SVM),大数据集再考虑BERT微调


17:15-18:00 综合案例+技术展望

综合案例:电商评论智能分析系统

class ECommerceAnalyzer:
    """一站式电商评论分析器"""
    def __init__(self):
        self.stopwords = set(['的', '了', '是', '在', '和', ' ', ''])
        self.sentiment_analyzer = SnowNLP
    
    def analyze_batch(self, comments):
        results = []
        for comment in comments:
            # 1. 清洗
            cleaned = clean_text(comment)
            # 2. 分词
            words = [w for w in jieba.lcut(cleaned) if w not in self.stopwords and len(w)>1]
            # 3. 情感分析
            sentiment = self.sentiment_analyzer(cleaned).sentiments
            # 4. 提取产品维度词
            dimensions = [w for w in words if w in ['屏幕', '电池', '拍照', '物流', '客服']]
            
            results.append({
                'raw': comment,
                'cleaned': cleaned,
                'words': words,
                'sentiment': sentiment,
                'dimensions': dimensions,
                'label': '积极' if sentiment > 0.6 else '消极' if sentiment < 0.4 else '中性'
            })
        return results

# 使用示例
analyzer = ECommerceAnalyzer()
sample_comments = [
    "手机屏幕超清晰,但电池不耐用",
    "物流神速,客服态度好",
    "拍照效果惊艳,性价比超高"
]
results = analyzer.analyze_batch(sample_comments)

# 输出分析报告
for r in results:
    print(f"\n原始评论: {r['raw']}")
    print(f"情感: {r['label']} ({r['sentiment']:.2f}) | 涉及维度: {r['dimensions']}")

2026年文本分析技术趋势

  1. 轻量化大模型:BERT变体(如ALBERT、DistilBERT)在边缘设备部署
  2. 多模态融合:文本+图像联合分析(如商品评论+晒图)
  3. 实时流分析:Kafka + Spark Streaming处理微博/推特流数据
  4. 可解释AI:SHAP/LIME解释模型决策,满足金融/医疗合规要求

课后学习资源

  • 中文分词:jieba官方文档、pkuseg GitHub仓库
  • 实战数据集:THUCNews(新闻分类)、ChnSentiCorp(情感分析)
  • 进阶学习:Hugging Face Transformers库(BERT实战)、spaCy官方教程
  • 避坑指南:《中文NLP常见陷阱20条》(培训材料包附赠)

培训效果保障措施

  1. 代码即文档:所有讲义代码可直接复制运行,含详细注释
  2. 阶梯式练习:每模块含基础练习+挑战任务(满足不同水平学员)
  3. 真实数据集:提供清洗好的电商/新闻/微博数据集(共5000+条)
  4. 答疑机制:下午17:30-18:00集中答疑,解决个性化问题
  5. 课后支持:提供GitHub仓库(含全部代码+数据集+扩展阅读)

通过本培训,学员将掌握从零构建文本分析pipeline的能力,可直接应用于舆情监控、用户反馈分析、智能客服等实际业务场景。

上次编辑于:
贡献者: zilizhou