GTE-Base-ZH赋能Python爬虫:采集数据的智能清洗与归类

张开发
2026/4/10 12:06:39 15 分钟阅读

分享文章

GTE-Base-ZH赋能Python爬虫:采集数据的智能清洗与归类
GTE-Base-ZH赋能Python爬虫采集数据的智能清洗与归类你是不是也遇到过这种情况用Python爬虫吭哧吭哧抓了一大堆数据回来结果发现里面全是“垃圾”——重复的内容、乱七八糟的格式、还有一堆不知道该怎么分类的文本。光是整理这些数据花的时间可能比写爬虫本身还要多。我之前做项目的时候经常要处理从各个网站爬下来的新闻和用户评论。最头疼的就是数据清洗手动去重、人工分类效率低不说还容易出错。后来我发现用向量模型来做这件事简直就像给爬虫装上了“智能大脑”。今天要聊的GTE-Base-ZH就是一个专门处理中文文本的向量模型。它能把一段文字变成一串数字也就是向量然后通过比较这些数字就能判断两段文字是不是相似、属于什么主题。听起来有点玄乎其实用起来特别简单。这篇文章我就结合自己的实际经验跟你分享一下怎么用GTE-Base-ZH来给爬虫数据做“智能后处理”。从怎么把文本变成向量到怎么用这些向量去重、分类我都会用具体的代码和例子来演示。看完之后你就能把那些杂乱无章的爬虫数据快速整理成清晰好用的信息池。1. 为什么爬虫数据需要“智能清洗”先说说我们平时用Python爬虫都会遇到哪些麻烦事。你写个爬虫去抓取某个论坛的帖子一天下来能抓几千条。但仔细一看很多帖子内容其实差不多只是标题换了个说法或者发布时间不一样。这就是重复数据如果不处理掉分析结果肯定不准。还有抓回来的数据里可能有新闻、有评论、有广告全都混在一起。你想分析“科技类”新闻的舆情结果手动筛选就得花大半天。更麻烦的是情感分析。你想知道用户对某个产品的评价是正面还是负面总不能一条条去看吧尤其是当数据量达到几万、几十万条的时候人工处理几乎是不可能的。传统的解决方法要么是用一些简单的规则比如关键词匹配要么就是人工标注。规则的方法不够灵活稍微变个说法就识别不出来了人工的方法又太费时费力。而向量模型比如GTE-Base-ZH提供了一种更“智能”的思路。它不像关键词匹配那么死板而是去理解文本的“语义”。简单来说就是它能明白“苹果手机”和“iPhone”说的是一个东西也能判断“这个产品真好用”和“体验太差了”表达的是相反的情感。这样一来我们就能用程序自动完成很多以前需要人工判断的工作。接下来我就带你看看具体怎么实现。2. GTE-Base-ZH你的中文文本“理解官”在开始动手之前我们得先了解一下手里的“工具”。GTE-Base-ZH是一个开源的文本向量化模型由国内团队开发专门针对中文文本进行了优化。它的核心功能很简单你给它一段中文文本它给你返回一个固定长度的向量一串数字。这个向量就像是这段文本的“数字指纹”。为什么这个“指纹”有用呢因为语义相似的文本它们的向量在数学空间里的距离也会很近。比如“今天天气不错”和“阳光明媚的一天”这两句话虽然字面不一样但意思相近它们的向量就会很接近。反之“我很开心”和“我很难过”的向量就会相距甚远。基于这个原理我们可以做很多事情去重计算所有文本向量之间的距离距离特别近的就可以认为是重复或高度相似的内容。聚类把向量接近的文本归到一组自动发现数据中的主题或类别。情感初筛虽然GTE-Base-ZH不是专门的情感分析模型但通过对比文本向量与“正面”、“负面”标准向量的距离可以对情感倾向做一个快速的初步判断。它的使用也非常方便通过Hugging Face的sentence-transformers库就能直接调用。下面我们就进入实战环节。3. 环境搭建与模型初体验首先我们需要把环境和模型准备好。这里假设你已经有了Python的基础环境。# 安装必要的库 pip install sentence-transformers pandas numpy scikit-learnsentence-transformers是核心用来加载和使用GTE模型。pandas用来处理数据表格numpy处理数值计算scikit-learn提供了聚类等机器学习算法。安装好后用几行代码就能让模型跑起来from sentence_transformers import SentenceTransformer # 加载GTE-Base-ZH模型第一次运行会自动下载 model SentenceTransformer(thenlper/gte-base-zh) # 准备一些示例文本模拟爬虫抓取的数据 sample_texts [ Python爬虫入门教程适合新手学习。, 如何用Python编写网络爬虫采集数据, 今天的股市大盘整体上涨科技股表现突出。, 新能源汽车销量持续增长市场前景广阔。, 这部电影的剧情太精彩了演员演技也在线。, 这部影片情节扣人心弦主演表演非常出色。 ] # 将文本列表转换为向量 embeddings model.encode(sample_texts) print(f文本数量{len(sample_texts)}) print(f向量维度{embeddings.shape}) # 应该是 (6, 768) 表示6个文本每个是768维的向量 print(第一个文本的向量前10个维度, embeddings[0][:10])运行这段代码你会看到模型输出了6个向量每个向量有768个数字。这就是我们后续所有智能操作的基础。你可能注意到了示例中的最后两句话——“这部电影的剧情太精彩了…”和“这部影片情节扣人心弦…”——它们的意思非常相似。我们后面就会用向量来找出它们。4. 实战智能清洗爬虫数据四步走现在我们模拟一个更真实的爬虫数据清洗场景。假设我们爬取了一个科技新闻网站得到了下面这些数据。import pandas as pd # 模拟爬虫抓取到的原始数据 data { title: [ 人工智能助力医疗诊断准确率提升20%, AI技术应用于医学诊断效率大幅提高, 新款电动汽车续航突破1000公里, 电池技术革新电动车续航里程实现重大突破, 深度学习框架PyTorch发布重要更新, 机器学习会议NeurIPS公布最新研究成果, 用户评论这个产品太难用了经常卡顿。, 用户反馈体验很差完全不推荐购买。, 智能手机摄像头传感器技术解析, 移动影像技术发展手机拍照能力越来越强 ], content: [ 近日某研究团队将AI用于CT影像分析..., 通过人工智能算法医生可以更快地..., 某品牌发布全新电动车搭载固态电池..., 得益于新型电池材料电动汽车的续航..., PyTorch团队推出了2.0版本支持..., 在NeurIPS会议上多篇论文展示了..., 买了不到一个月就出现各种问题..., 客服态度也不好解决问题效率低..., 本文详细介绍了CMOS传感器的工作原理..., 从像素合并到计算摄影手机摄影... ] } df pd.DataFrame(data) print(原始数据预览) print(df)我们的目标是将这些杂乱的数据通过以下四个步骤变得清晰有序。4.1 第一步批量向量化第一步我们把所有文本这里为了简单用标题代表内容转换成向量。# 将标题文本转换为向量 texts_to_encode df[title].tolist() embeddings model.encode(texts_to_encode, normalize_embeddingsTrue) # normalize_embeddingsTrue 有助于后续相似度计算 # 将向量保存到DataFrame中方便后续使用 df[embedding] list(embeddings) print(向量化完成数据维度, embeddings.shape)这里normalize_embeddingsTrue是一个重要参数它会把向量归一化长度变为1这样后续计算余弦相似度会非常快且准确。4.2 第二步智能去重爬虫数据中经常有重复或高度相似的新闻。我们可以通过计算向量之间的余弦相似度来找出它们。from sklearn.metrics.pairwise import cosine_similarity import numpy as np # 计算所有向量两两之间的相似度矩阵 sim_matrix cosine_similarity(embeddings) # 设置一个相似度阈值大于这个值则认为内容重复 threshold 0.85 duplicate_pairs [] # 遍历上三角矩阵避免重复比较找出相似度高的对 for i in range(len(sim_matrix)): for j in range(i1, len(sim_matrix)): if sim_matrix[i, j] threshold: duplicate_pairs.append((i, j, sim_matrix[i, j])) print(f\n找到 {len(duplicate_pairs)} 对可能重复的内容) for i, j, sim in duplicate_pairs: print(f相似度 {sim:.3f}:) print(f A: {df.iloc[i][title]}) print(f B: {df.iloc[j][title]})运行后你会发现它成功识别出了“人工智能助力医疗诊断…”和“AI技术应用于医学诊断…”是相似的也识别出了关于电动车续航的两条新闻。这样在后续分析时我们就可以选择保留其中一条避免重复计数。4.3 第三步主题自动聚类对于去重后的数据我们可能还想知道它们主要讨论了哪些话题。这时候可以用聚类算法。from sklearn.cluster import DBSCAN # 使用DBSCAN聚类算法它不需要预先指定类别数量 # eps是邻域距离min_samples是核心点所需的最小样本数需要根据数据调整 clustering DBSCAN(eps0.4, min_samples2, metriccosine).fit(embeddings) df[cluster] clustering.labels_ print(\n聚类结果) # 打印每个簇的样本 for cluster_id in sorted(df[cluster].unique()): if cluster_id -1: print(f\n噪声点 (未聚类):) else: print(f\n主题簇 {cluster_id}:) cluster_samples df[df[cluster] cluster_id][title].tolist() for sample in cluster_samples: print(f - {sample})DBSCAN算法会把向量位置靠近的文本归为同一个簇cluster并把远离所有群体的点标记为噪声-1。从结果可以看到它成功地将“AI医疗”、“电动车”、“深度学习/机器学习”相关的新闻分到了不同的组里。而“用户评论”和“摄像头技术”可能因为与其他主题差异较大被分开了或者标记为噪声。这只是一个简单的演示在实际应用中你可能需要调整eps和min_samples参数或者尝试K-Means等其他聚类算法来获得最符合你需求的分类结果。4.4 第四步情感倾向初筛如果我们爬取的数据中包含评论快速区分正面和负面反馈很有用。我们可以用“语义搜索”的思路来实现初筛。# 定义“正面”和“负面”的查询语句锚点 positive_query 好评推荐好用满意优秀 negative_query 差评糟糕难用不满意缺陷 # 将查询语句也转换为向量 query_embeddings model.encode([positive_query, negative_query], normalize_embeddingsTrue) # 计算每条数据与正、负面查询的相似度 pos_similarity cosine_similarity(embeddings, query_embeddings[0].reshape(1, -1)).flatten() neg_similarity cosine_similarity(embeddings, query_embeddings[1].reshape(1, -1)).flatten() df[sim_positive] pos_similarity df[sim_negative] neg_similarity # 定义一个简单的规则与正面查询相似度更高则标记为初步正面反之亦然 df[sentiment_tendency] np.where(df[sim_positive] df[sim_negative], 正面, 负面) print(\n情感倾向初筛结果) print(df[[title, sentiment_tendency, sim_positive, sim_negative]].head(8))这个方法虽然不如专门的情感分析模型精准但它速度快、无需训练非常适合在海量数据中进行第一轮粗筛快速过滤出可能需要重点关注的负面评论。5. 构建完整的数据清洗流水线把上面的步骤串起来再加上一些数据IO处理就能形成一个完整的、自动化的爬虫数据清洗流水线。class SmartCrawlerDataCleaner: def __init__(self, model_namethenlper/gte-base-zh): self.model SentenceTransformer(model_name) def clean_and_organize(self, text_list, deduplicate_threshold0.85, cluster_eps0.4): 主处理函数对输入的文本列表进行清洗和归类。 # 1. 向量化 print(正在生成文本向量...) embeddings self.model.encode(text_list, normalize_embeddingsTrue) # 2. 去重 print(正在识别重复内容...) from sklearn.metrics.pairwise import cosine_similarity sim_matrix cosine_similarity(embeddings) unique_indices self._remove_duplicates(sim_matrix, text_list, deduplicate_threshold) # 保留去重后的数据和向量 unique_texts [text_list[i] for i in unique_indices] unique_embeddings embeddings[unique_indices] # 3. 聚类 print(正在进行主题聚类...) from sklearn.cluster import DBSCAN clustering DBSCAN(epscluster_eps, min_samples2, metriccosine).fit(unique_embeddings) cluster_labels clustering.labels_ # 4. 情感初筛 (可选针对评论类数据) # sentiment_tendency self._simple_sentiment_check(unique_texts, unique_embeddings) # 整理结果 result_df pd.DataFrame({ text: unique_texts, cluster: cluster_labels }) # 按主题簇分组查看 print(\n 清洗与归类结果 ) for cluster_id in sorted(result_df[cluster].unique()): if cluster_id -1: group_name 其他主题 else: group_name f主题{cluster_id} samples result_df[result_df[cluster] cluster_id][text].tolist() print(f\n【{group_name}】共 {len(samples)} 条) for sample in samples[:3]: # 每个主题只显示前3条作为代表 print(f * {sample}) if len(samples) 3: print(f ... 以及另外 {len(samples)-3} 条。) return result_df def _remove_duplicates(self, sim_matrix, texts, threshold): 辅助函数根据相似度矩阵标记并去除重复项。 n len(texts) to_keep list(range(n)) for i in range(n): if i not in to_keep: continue for j in range(i1, n): if j in to_keep and sim_matrix[i, j] threshold: # 如果j与i高度相似则移除j to_keep.remove(j) # print(f移除重复项 [{j}]: {texts[j]} - 类似于 [{i}]: {texts[i]}) return to_keep # 使用示例 if __name__ __main__: cleaner SmartCrawlerDataCleaner() # 假设这是你的爬虫数据 raw_data [ OpenAI发布新一代语言模型, 人工智能公司推出新的大语言模型, 特斯拉股价今日大幅上涨, 电动汽车龙头特斯拉市值创新高, Python成为最受欢迎的编程语言, Java和JavaScript的使用率保持稳定, 这款手机摄像头拍照效果很差, 消费者投诉手机摄像功能不佳, ] result cleaner.clean_and_organize(raw_data)这个类提供了一个基础的框架。在实际项目中你可以根据需求扩展它比如增加对长文本的分块处理、集成更精准的情感分析模型、或者将结果保存到数据库。6. 总结走完这一趟你会发现给Python爬虫加上GTE-Base-ZH这样的向量模型数据清洗和预处理的体验完全不一样了。从之前面对一堆杂乱文本无从下手到现在可以程序化地完成去重、分门别类、甚至初步的情感判断效率的提升是实实在在的。这种方法的核心优势在于“语义理解”。它不再依赖于死板的关键词所以更能应对互联网上灵活多变的表达方式。无论是新闻聚合、舆情监控还是竞争情报分析这套思路都能帮你快速地从原始数据中提炼出有价值的信息。当然它也不是万能的。向量模型的效果依赖于训练数据对于非常专业的领域术语或者最新的网络用语可能效果会打折扣。聚类的结果也需要人工审核和调整参数。但对于大多数通用领域的文本处理任务它已经是一个强大且高效的起点。下次当你再为爬虫数据清洗发愁时不妨试试这个“向量化”的思路。从安装sentence-transformers开始到写出第一个文本向量再到搭建起完整的处理流水线整个过程其实并没有想象中那么复杂。希望这篇文章能帮你打开一扇门让你采集数据的工作变得更加智能和轻松。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章