Python爬虫数据清洗与摘要:SmallThinker-3B-Preview自动化处理流程

张开发
2026/4/17 12:28:19 15 分钟阅读

分享文章

Python爬虫数据清洗与摘要:SmallThinker-3B-Preview自动化处理流程
Python爬虫数据清洗与摘要SmallThinker-3B-Preview自动化处理流程你是不是也遇到过这种情况用Python爬虫吭哧吭哧抓了一大堆新闻、论坛帖子回来结果一看头都大了。数据乱七八糟重复内容一大堆广告和无关信息夹杂其中想从里面提炼点有价值的东西简直像大海捞针。手动整理效率太低。放着不管那爬虫不就白跑了吗这就是数据处理的“最后一公里”难题。爬虫把数据“搬”回来了但怎么把它们变成真正能用的“知识”才是关键。今天我就跟你分享一个我们团队在实际项目中打磨出来的自动化流程。我们不用复杂的算法也不搞庞大的系统就用一个轻量级的模型——SmallThinker-3B-Preview配合Python脚本把杂乱的非结构化文本变成结构清晰、重点突出的数据报告。简单来说就是让AI帮你完成最头疼的清洗和摘要工作让你能把精力放在更重要的数据分析上。1. 为什么需要智能化的数据清洗与摘要在深入代码之前咱们先聊聊为什么传统的处理方法不够用了。你可能会用正则表达式去过滤一些关键词或者用一些规则去重。这些方法在简单场景下还行但面对今天互联网上复杂多变的文本内容就显得力不从心了。想象一下你爬取的是科技新闻。一篇关于“某品牌发布新款手机”的报道可能在十几个网站都有转载。规则去重很难判断两篇标题不同、内容表述略有差异的文章是不是在讲同一件事。更别提那些文章里嵌入的“相关阅读”、“网友评论”、“推广链接”这些噪音了。而摘要就更难了。传统的抽取式摘要比如只取首句或关键词句往往断章取义生成式摘要又需要大模型部署和成本都是问题。SmallThinker-3B-Preview这类模型的出现正好填补了这个空白。它足够轻量可以在本地或普通服务器上快速运行又足够智能能够理解文本语义进行真正的“理解后”的清洗和概括。我们的目标就是设计一个流程让爬虫数据从“原材料”自动变为“半成品”。2. 核心工具SmallThinker-3B-Preview能做什么你可能对动辄百亿、千亿参数的大模型望而却步觉得那是大公司的玩具。但SmallThinker-3B-Preview我们后面就简称它“小思”吧不一样它是一个30亿参数预览版模型主打的就是一个“小巧而实用”。在我们的数据处理流水线里主要让它承担两个核心任务智能清洗这不仅仅是去掉HTML标签那么简单。小思可以理解内容帮我们做“语义去重”判断两段文字是不是讲同一个事儿识别并过滤掉广告、版权声明、导航菜单等无关文本块只保留核心正文。自动摘要不是机械地截取句子。小思能读懂一篇长文然后用自己的话提炼出最关键的信息点生成一段连贯、简洁的摘要。你可以指定摘要的长度或风格。它的优势在于平衡。比规则方法聪明得多比超大模型又节省资源特别适合作为后端服务集成到自动化的爬虫数据处理脚本中。3. 构建自动化处理流水线下面我们就来搭建这个流水线。整个流程可以概括为原始数据输入 - 初步清洗 - 智能语义处理 - 结构化输出。我们会用一个模拟的爬虫数据文件来演示。3.1 环境准备与模型加载首先确保你的Python环境建议3.8以上已经安装了必要的库。我们将使用transformers库来调用模型。pip install transformers torch pandas接下来我们写一个脚本来初始化处理管道。这里我们使用模型的文本生成能力通过精心设计的“提示词”来引导它完成特定任务。# pipeline_setup.py import torch from transformers import AutoModelForCausalLM, AutoTokenizer import pandas as pd import re import json from typing import List, Dict, Any class DataCleanAndSummarizer: def __init__(self, model_namesmallthinker-3b-preview): 初始化清洗与摘要工具。 注意首次运行会下载模型请确保网络通畅。 print(f正在加载模型 {model_name}...) self.tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) self.model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, # 使用半精度节省显存 device_mapauto, # 自动分配至GPU或CPU trust_remote_codeTrue ) print(模型加载完毕) # 定义我们的任务提示词模板 self.clean_prompt_template 请仔细阅读以下文本并执行以下操作 1. 移除所有明显的广告、推广链接、无关的导航菜单、版权声明和作者信息。 2. 只保留最核心的新闻正文或帖子内容。 3. 如果文本是重复或无意义的请直接返回“无有效内容”。 文本内容 {raw_text} 清洗后的核心内容 self.summarize_prompt_template 请为下面的文章生成一个简洁的摘要要求 1. 概括文章的核心事件或观点。 2. 突出关键的人物、时间、地点、数据等信息。 3. 语言精炼长度控制在100字左右。 文章内容 {cleaned_text} 文章摘要 def _generate_text(self, prompt: str, max_length512) - str: 调用模型生成文本的辅助函数 inputs self.tokenizer(prompt, return_tensorspt, truncationTrue, max_length1024) inputs {k: v.to(self.model.device) for k, v in inputs.items()} with torch.no_grad(): outputs self.model.generate( **inputs, max_new_tokensmax_length, do_sampleTrue, # 开启采样使生成结果更多样 temperature0.7, top_p0.9, repetition_penalty1.1 ) generated_text self.tokenizer.decode(outputs[0], skip_special_tokensTrue) # 提取模型生成的部分去除输入的提示词 result generated_text[len(prompt):].strip() return result3.2 第一步原始数据的初步整理假设我们的爬虫已经将数据保存为一个JSON文件每条数据包含标题、原始内容、来源和URL。# 模拟的爬虫原始数据 sample_data [ { title: 某品牌全新旗舰手机发布搭载最新AI芯片, raw_content: html headtitle科技新闻/title/head body div classad-banner点击下载炒股软件赢百万大奖/div h1某品牌全新旗舰手机发布搭载最新AI芯片/h1 div classmeta发布时间2023-10-27 来源科技新闻网/div div classcontent p今日下午某品牌在秋季新品发布会上正式推出了其年度旗舰手机——X系列新品。/p p该手机最大的亮点是首次搭载了其自主研发的“雷霆”AI芯片据称AI算力提升了200%。/p p售价方面起售价为5999元将于下周五正式开售。/p /div div classrelated相关阅读其他品牌手机降价信息/div div classcomments网友评论列表.../div div classfooter版权所有 © 2023 科技新闻网/div /body /html , source: 科技新闻网, url: http://example.com/news/123 }, { title: 品牌X系列新机亮相AI芯片成最大卖点, raw_content: 【快讯】品牌于今日发布X系列新款手机。重点强调了其新的AI芯片性能强劲。售价5999元起。本文由AI自动生成。, source: 自媒体快讯, url: http://example.com/blog/456 }, # ... 更多数据 ] # 将模拟数据保存为文件模拟爬虫输出 import json with open(crawled_raw_data.json, w, encodingutf-8) as f: json.dump(sample_data, f, ensure_asciiFalse, indent2)3.3 第二步集成智能清洗与摘要现在我们将初始化好的处理器与数据读取、批处理逻辑结合起来。# main_processing.py import json from pipeline_setup import DataCleanAndSummarizer def main(): # 1. 加载原始爬虫数据 try: with open(crawled_raw_data.json, r, encodingutf-8) as f: raw_items json.load(f) print(f成功加载 {len(raw_items)} 条原始数据。) except FileNotFoundError: print(未找到原始数据文件使用模拟数据。) # 这里可以替换为你的实际数据加载逻辑例如从数据库读取 raw_items sample_data # 使用上面定义的模拟数据 # 2. 初始化处理工具 processor DataCleanAndSummarizer() processed_results [] # 3. 逐条处理数据 for i, item in enumerate(raw_items): print(f\n正在处理第 {i1}/{len(raw_items)} 条: {item[title][:50]}...) # 基础信息保留 result_entry { original_title: item[title], source: item.get(source, ), url: item.get(url, ), processed_title: item[title] # 初始使用原标题 } raw_text item.get(raw_content, ) if not raw_text or len(raw_text.strip()) 20: print( 内容过短或为空跳过。) result_entry[cleaned_content] result_entry[summary] 内容无效 processed_results.append(result_entry) continue # A. 智能清洗 print( 进行智能清洗...) clean_prompt processor.clean_prompt_template.format(raw_textraw_text[:2000]) # 避免过长 cleaned_text processor._generate_text(clean_prompt, max_length600) if 无有效内容 in cleaned_text: print( 模型判定为无有效内容。) cleaned_text result_entry[cleaned_content] cleaned_text # B. 智能摘要 (仅在清洗后内容有效时进行) if cleaned_text and len(cleaned_text) 30: print( 生成内容摘要...) summarize_prompt processor.summarize_prompt_template.format(cleaned_textcleaned_text[:1500]) summary processor._generate_text(summarize_prompt, max_length200) result_entry[summary] summary else: result_entry[summary] 内容清洗后无效无法生成摘要 # C. 简单去重利用摘要进行相似性判断此处为简化示例实际可使用向量相似度 # 基本思路如果摘要非常相似则可能为重复内容进行标记。 result_entry[is_duplicate] False # 简化逻辑实际需对比 processed_results.append(result_entry) # 打印一条结果预览 print(f 摘要预览: {result_entry[summary][:80]}...) # 4. 保存处理结果 output_file processed_data_report.json with open(output_file, w, encodingutf-8) as f: json.dump(processed_results, f, ensure_asciiFalse, indent2) print(f\n✅ 处理完成共处理 {len(processed_results)} 条数据。) print(f 结构化报告已保存至: {output_file}) # 5. 生成一个简易的文本报告 generate_text_report(processed_results) def generate_text_report(results): 生成一个人工可读的文本报告 valid_items [r for r in results if r.get(summary) and 无效 not in r[summary]] report_lines [] report_lines.append(*60) report_lines.append(爬虫数据智能处理报告) report_lines.append(*60) report_lines.append(f生成时间{pd.Timestamp.now().strftime(%Y-%m-%d %H:%M:%S)}) report_lines.append(f有效条目数{len(valid_items)} / {len(results)}) report_lines.append(\n--- 核心信息摘要 ---\n) for i, item in enumerate(valid_items[:10]): # 只展示前10条 report_lines.append(f{i1}. [{item[source]}] {item[original_title]}) report_lines.append(f 摘要{item[summary]}) report_lines.append(f 来源{item[url]}) report_lines.append() report_lines.append(--- 报告结束 ---) report_content \n.join(report_lines) with open(data_summary_report.txt, w, encodingutf-8) as f: f.write(report_content) print(f 文本简报已生成: data_summary_report.txt) if __name__ __main__: main()3.4 第三步运行与结果解读运行上面的main_processing.py脚本。你会看到控制台输出处理进度最终生成两个文件processed_data_report.json: 包含所有数据的结构化信息适合后续导入数据库或进行进一步分析。data_summary_report.txt: 一个简洁的文本报告方便人类快速浏览核心发现。以我们的模拟数据为例第一条新闻经过清洗后广告、相关阅读、页脚等都被移除只留下了核心的正文。生成的摘要可能是“某品牌于秋季新品发布会推出年度旗舰手机主打搭载自研‘雷霆’AI芯片宣称AI算力提升200%起售价5999元将于下周开售。”而第二条自媒体快讯模型可能会因为其内容过于简短且标记为“AI生成”在清洗步骤就将其过滤或标记为“无有效内容”。这样就自动完成了一次去重和去噪。4. 让流程更实用优化与扩展建议上面的流程是一个基础版本。在实际项目中你还可以从以下几个方面优化它性能优化对于大量数据可以使用批处理batch inference来提升模型推理效率。transformers的pipeline函数可以简化这个过程。更精准的去重除了依赖模型清洗可以在摘要生成后计算所有摘要的文本向量例如使用sentence-transformers通过余弦相似度来聚类和去重效果更好。关键信息提取你可以修改提示词让小思除了做摘要还能结构化地提取信息。例如“请从文中提取以下信息产品名称、发布时间、核心特性、价格”让它返回一个JSON对象。错误处理与重试网络或模型推理可能不稳定在脚本中添加重试机制和日志记录非常重要。接入爬虫框架将这个处理模块作为Scrapy或requests爬虫的pipeline组件实现抓取、清洗、摘要的全自动化。这套流程最吸引人的地方在于它用一个相对轻量的模型解决了非结构化文本处理中最耗费人力的环节。你不必再盯着海量文本发呆而是能快速获得一份干净、扼要的数据简报从而更快地发现趋势、提炼观点。处理完第一批数据后你可能会发现原本需要半天时间阅读整理的材料现在几分钟就出了报告。你可以根据报告里的摘要迅速定位到最有价值的几条原始信息进行深度阅读效率的提升是实实在在的。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章