实战 Python NLP:处理 PDF 文档批量提取文本并进行主题建模

Python NLP实战:PDF文本批量提取与主题建模

1. PDF文本批量提取

核心工具:

  • PyPDF2:基础PDF文本提取
  • pdfplumber:增强型文本/表格提取(推荐)
python 复制代码
import os
import pdfplumber

def extract_pdf_texts(folder_path):
    """批量提取PDF文件夹中的文本"""
    all_texts = []
    for filename in os.listdir(folder_path):
        if filename.endswith(".pdf"):
            with pdfplumber.open(os.path.join(folder_path, filename)) as pdf:
                text = ""
                for page in pdf.pages:
                    text += page.extract_text() + "\n"
                all_texts.append(text)
    return all_texts

# 使用示例
pdf_texts = extract_pdf_texts("/path/to/pdf_folder")
2. 文本预处理流程
python 复制代码
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer

nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')

def preprocess_text(text):
    """文本清洗与标准化"""
    # 1. 小写化 & 移除特殊字符
    text = re.sub(r'[^a-zA-Z\s]', '', text.lower())
    
    # 2. 分词
    words = nltk.word_tokenize(text)
    
    # 3. 移除停用词
    stop_words = set(stopwords.words('english'))
    words = [w for w in words if w not in stop_words and len(w) > 2]
    
    # 4. 词形还原
    lemmatizer = WordNetLemmatizer()
    return [lemmatizer.lemmatize(w) for w in words]

# 预处理所有文档
processed_docs = [preprocess_text(text) for text in pdf_texts]
3. 主题建模(LDA实现)
python 复制代码
from gensim import corpora, models

# 1. 创建词典与词袋
dictionary = corpora.Dictionary(processed_docs)
corpus = [dictionary.doc2bow(doc) for doc in processed_docs]

# 2. 训练LDA模型
lda_model = models.LdaModel(
    corpus=corpus,
    id2word=dictionary,
    num_topics=5,          # 主题数量
    passes=10,             # 训练轮次
    random_state=42
)

# 3. 可视化主题
def print_topics(model):
    for idx, topic in model.print_topics(-1):
        print(f"主题 {idx}: {topic}")

print_topics(lda_model)
4. 结果优化技巧
  1. 主题数选择:

    python 复制代码
    # 使用一致性分数选择最优主题数
    from gensim.models import CoherenceModel
    coherence_scores = []
    for num_topics in range(3, 10):
        model = models.LdaModel(corpus, num_topics=num_topics, id2word=dictionary)
        coherencemodel = CoherenceModel(model, texts=processed_docs, dictionary=dictionary, coherence='c_v')
        coherence_scores.append(coherencemodel.get_coherence())
  2. TF-IDF加权:

    python 复制代码
    from gensim.models import TfidfModel
    tfidf = TfidfModel(corpus)
    corpus_tfidf = tfidf[corpus]
    lda_model_tfidf = models.LdaModel(corpus_tfidf, id2word=dictionary, num_topics=5)
5. 完整工作流示例
python 复制代码
# 1. 提取PDF文本
pdf_texts = extract_pdf_texts("research_papers")

# 2. 预处理
processed_docs = [preprocess_text(text) for text in pdf_texts]

# 3. 训练优化模型
dictionary = corpora.Dictionary(processed_docs)
corpus = [dictionary.doc2bow(doc) for doc in processed_docs]
tfidf = TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]

lda_model = models.LdaModel(
    corpus=corpus_tfidf,
    id2word=dictionary,
    num_topics=5,
    passes=15,
    alpha='auto'
)

# 4. 输出主题关键词
print_topics(lda_model)

输出示例:

复制代码
主题 0: 0.025*"data" + 0.018*"learning" + 0.012*"model" + 0.009*"algorithm" + ...
主题 1: 0.031*"network" + 0.022*"neural" + 0.015*"deep" + 0.011*"layer" + ...
关键注意事项
  1. PDF提取质量:

    • 扫描版PDF需先使用OCR工具(如Tesseract)处理
    • 表格密集文档使用pdfplumber.extract_table()
  2. NLP预处理:

    • 领域特定停用词(如学术论文中的"figure", "table")
    • 保留专业名词(通过词性标注筛选名词)
  3. 模型调优:

    • 主题数通过 \\text{一致性分数} = \\frac{1}{N}\\sum_{i=1}\^{N} \\text{score}(t_i) 优化
    • 超参数调整:alpha(文档-主题密度), eta(主题-词语密度)
  4. 替代方案:

    python 复制代码
    # 使用BERTopic进行现代主题建模
    from bertopic import BERTopic
    topic_model = BERTopic(language="english")
    topics, _ = topic_model.fit_transform([" ".join(doc) for doc in processed_docs])
相关推荐
BK贝壳1 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949653 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行7 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885728 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI8 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿9 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫9 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
深蓝冰河10 小时前
全脑记忆法创始人的2套快速记忆法pdf 书下载地址
pdf
KeepRobots10 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq10 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python