1. 数据获取方法
掌握公开数据集的使用、数据质量评估指标、了解常见的网络爬虫技术
🧩 一、公开数据集的使用
✅ 常见平台(一定要熟)
平台 | 简介 | 示例数据集 |
---|---|---|
Hugging Face Datasets | 专注 NLP、CV 领域的大模型训练数据集库 | IMDB、SQuAD、Common Crawl、wikitext |
Kaggle | 各类竞赛+高质量数据集 | 泰坦尼克号、生物医学、情感分析等 |
UCI 数据库 | 经典机器学习数据集 | Iris、成人收入预测 |
Google Dataset Search | 谷歌开放数据搜索引擎 | 全球各类开放数据 |
OpenAI, Meta, Google AI | 提供 LLM 训练的部分公开数据说明 | WebText、C4、The Pile 等(间接获取) |
✅ 如何使用 Hugging Face 数据集?
from datasets import load_datasetdataset = load_dataset("imdb") # 电影评论情感分析数据
print(dataset["train"][0])
✅ 数据集自动缓存下载,内置分词、预处理功能,适合训练 Transformer 类模型!
✅ 面试押题:
Q:你如何选择用于训练大模型的数据集?
A:我会优先考虑数据规模、质量、语料多样性和开放协议,比如使用 Hugging Face 上的 C4、The Pile 数据集,同时避免版权风险。
🧪 二、数据质量评估指标
为了训练高质量模型,数据本身也要“干净、全面、有代表性”:
维度 | 评估指标 | 说明 |
---|---|---|
完整性 | 缺失值率、字段覆盖率 | 是否有字段缺失或样本丢失 |
一致性 | 重复样本率、一致编码 | 同一类型样本是否标准化 |
准确性 | 噪音率、标签准确度 | 标签是否正确,是否有错别字等 |
多样性 | 词汇丰富度、类别平衡 | 是否只集中在少量领域或话题 |
偏差性 | 来源是否单一、过拟合语料 | 检查是否存在训练偏差 |
✅ 可视化检查方法
- 分析 label 分布(条形图)
- 检查文本长度分布
- 去重、清洗、分词分析
- 使用 TF-IDF/Embedding 评估内容多样性
✅ 面试押题:
Q:你怎么评估一个 NLP 数据集的质量?
A:
- 分析标签分布是否平衡
- 检查是否有重复或乱码数据
- 看语料是否覆盖目标领域或任务
🕸️ 三、网络爬虫技术(实战 + 原理)
如果找不到合适的数据集,可以自己爬!
✅ 爬虫常用库
使用 Python 的 requests 库等发送 HTTP 请求获取网页内容,然后通过解析库如 BeautifulSoup 或 lxml 来解析 HTML 页面,提取所需的数据。这种方法简单灵活,适用于大多数网页的爬取。
工具 | 用途 |
---|---|
requests | 发送 HTTP 请求获取网页源码 |
BeautifulSoup | 解析 HTML 页面,提取文本 |
Selenium | 控制浏览器,适合动态加载网页 |
Scrapy 死磕rai皮 | 强大的爬虫框架,适合大型项目 |
playwright | 新一代浏览器自动化,效率高 |
✅ 简单示例:爬百度百科某个词条
import requests
from bs4 import BeautifulSoupurl = "https://baike.baidu.com/item/人工智能"
headers = {"User-Agent": "Mozilla/5.0"}
html = requests.get(url, headers=headers).text
soup = BeautifulSoup(html, "html.parser")content = soup.find_all("div", {"class": "lemma-summary"})
print(content[0].text.strip())
✅ 面试押题:
Q:你如何获取训练语料?是否使用过爬虫?
答:
- 如果没有现成数据,我会用 requests + BeautifulSoup 爬取新闻、百科等
- 对于需要登录或动态加载的页面,会使用 Selenium 或 Playwright
✅ 总结:三大能力表格
能力 | 工具 | 是否面试重点 |
---|---|---|
公共数据获取 | HuggingFace、Kaggle、UCI | ✅✅✅ |
数据质量评估 | 可视化分析、分布检查、清洗 | ✅✅ |
网络爬虫 | requests、Selenium、Scrapy | ✅✅ |
2. 数据清洗技术
熟悉常见的文本去重算法原理、如 MinHash,了解常见训练数据配比策略,如代码、数学、通用知识问答等各种占比多少比较合理
🧹 第一部分:文本去重算法原理
🔍 为什么需要文本去重?
- 减少重复内容带来的 模型偏置
- 降低训练成本,提高 数据多样性
- 提升模型在真实应用场景下的泛化能力
🚀 常见去重算法对比
(1) Exact Match(精确匹配)
- 原理:精确匹配是一种最简单的文本匹配方法,它直接比较两个文本是否完全相同。在这种方法中,只有当两个文本的每个字符都完全一致时,才认为它们是匹配的。
- 优点
- 代码实现简单:不需要复杂的算法和模型,只需要进行字符串的直接比较,代码实现简单易懂。
- 结果明确:匹配结果清晰,不存在模糊性,能够准确判断两个文本是否完全相同。
- 缺点
- 缺乏灵活性:对文本的变化非常敏感,即使两个文本在语义上非常相似,但只要存在一个字符的差异,就会被判定为不匹配。
- 适用范围有限:在实际应用中,由于文本的表达方式多样,很难出现完全相同的文本,因此精确匹配的应用场景受到很大限制。
- 适用场景:适用于对文本准确性要求极高,且文本表达方式相对固定的场景,如数据库中的主键匹配、文件的哈希值比对等。
2. Jaccard 相似度
- 原理:Jaccard 相似度用于衡量两个集合之间的相似程度,其计算公式为 (J(A,B)=\frac{|A\cap B|}{|A\cup B|}),其中 (A) 和 (B) 是两个集合,(|A\cap B|) 表示两个集合的交集元素个数,(|A\cup B|) 表示两个集合的并集元素个数。对于文本数据,通常将文本转换为词集合或 n - 元组集合来计算 Jaccard 相似度。
- 优点
- 简单直观:基于集合的交集和并集计算相似度,概念简单,容易理解和实现。
- 对文本长度不敏感:Jaccard 相似度只关注集合中元素的共同性,不依赖于文本的长度,因此在处理不同长度的文本时具有较好的稳定性。
- 缺点
- 忽略词序:将文本转换为集合后,会忽略词的顺序信息,导致一些语义相近但词序不同的文本可能被判定为相似度较低。
- 对停用词敏感:如果文本中包含大量的停用词(如“的”“是”“在”等),这些停用词会影响集合的交集和并集计算,从而降低相似度计算的准确性。
- 适用场景:适用于对词序不太敏感,更关注文本中词汇共同性的场景,如文档分类、网页去重等。
3. MinHash
- 原理:MinHash 算法基于 Jaccard 相似度,用于快速估算两个集合之间的 Jaccard 相似度。具体步骤如下:
- 将文本分割成若干个小块,形成一个集合。
- 使用多个不同的哈希函数对集合中的每个元素进行哈希计算,对于每个哈希函数,记录集合中元素的最小值哈希值,这些最小值构成了该集合的 MinHash 签名。
- 通过比较两个集合的 MinHash 签名中相同元素的比例,来近似估算它们的 Jaccard 相似度。
- 优点
- 计算效率高:MinHash 算法可以在不计算集合交集和并集的情况下,快速估算 Jaccard 相似度,尤其适用于大规模数据的处理。
- 节省存储空间:只需要存储 MinHash 签名,而不需要存储完整的文本集合,大大节省了存储空间。
- 缺点
- 近似计算存在误差:MinHash 是一种近似算法,估算的 Jaccard 相似度可能与真实值存在一定的误差。
- 哈希函数选择和数量影响准确性:哈希函数的选择和数量会影响 MinHash 签名的质量和相似度计算的准确性。
- 适用场景:适用于大规模文本数据的去重、聚类等任务,在处理海量数据时能够显著提高效率。
4. SimHash
- 原理:SimHash 是一种用于快速计算文本相似度的局部敏感哈希(Locality-Sensitive Hashing, LSH)算法。 其核心思想是将高维特征向量映射为低维的固定长度指纹(fingerprint),并通过比较指纹的海明距离(Hamming Distance)来衡量文本之间的相似性。主要用于处理大规模文本的近似去重。具体步骤如下:
- 特征提取:将文本分词,并为每个词计算一个特征向量(通常使用词的哈希值)。
- 加权:根据词的重要性(如 TF - IDF 值)为每个特征向量赋予权重。
- 合并特征向量:将所有加权后的特征向量相加,得到一个综合的特征向量。
- 二值化:将综合特征向量的每个维度根据正负值转换为 0 或 1,得到 SimHash 值。
- 相似度计算:通过比较两个文本的 SimHash 值的汉明距离(即两个二进制串中不同位的数量)来判断它们的相似度,汉明距离越小,文本越相似。
- 优点
- 高效性:SimHash 算法的计算复杂度较低,能够快速计算文本的哈希值,适用于大规模文本数据的处理。
- 对局部修改有一定的鲁棒性:文本的局部修改对 SimHash 值的影响较小,能够在一定程度上识别出语义相近的文本。
- 缺点
- 对语义理解不足:SimHash 主要基于文本的词法特征,对语义信息的捕捉能力有限,可能会将一些语义不同但词法相似的文本判定为相似。
- 汉明距离阈值难以确定:选择合适的汉明距离阈值来判断文本是否相似是一个挑战,不同的数据集和应用场景可能需要不同的阈值。
- 适用场景:适用于大规模文本的近似去重,如网页去重、新闻文章去重等。
5. BERT Embedding + 相似度阈值
- 原理:
- 文本编码:使用预训练的 BERT 模型将文本转换为固定长度的向量表示(即 BERT Embedding)。BERT 模型能够学习到文本的语义信息,将文本映射到一个低维的向量空间中。
- 相似度计算:计算两个文本 BERT Embedding 之间的相似度,常用的相似度度量方法有余弦相似度、欧氏距离等。
- 阈值判断:设定一个相似度阈值,当两个文本的相似度超过该阈值时,认为它们是相似的。
- 优点
- 语义理解能力强:BERT 模型能够捕捉文本的语义信息,对语义相近但表达方式不同的文本有较好的识别能力。
- 通用性好:适用于各种类型的文本匹配任务,不需要针对特定的领域进行复杂的特征工程。
- 缺点
- 计算成本高:BERT 模型是一个大型的深度学习模型,计算 BERT Embedding 需要较高的计算资源和时间成本。
- 阈值选择困难:相似度阈值的选择需要根据具体的数据集和应用场景进行调整,不同的阈值可能会导致不同的匹配结果。
- 适用场景:适用于对语义理解要求较高的文本匹配任务,如语义搜索、问答系统等。
算法 原理简述 特点 场景适用 Exact Match 哈希后全匹配 快,但只对完全重复有效 小规模清洗 Jaccard 相似度 比较词集合的交集/并集 简单直观,但计算慢 精确清洗 MinHash 快速估算 Jaccard 相似度 高效、可扩展、用于大规模数据 大模型文本去重首选 SimHash 把文本映射为指纹向量 快速近似查重(局部敏感哈希) 适合短文本(如微博) BERT Embedding + 相似度阈值 用 BERT 提取语义,再计算余弦相似度 语义去重,但耗时大 高质量语料过滤
✅ 面试押题:
Q:大模型训练前,你如何对大规模语料做去重?
答:
- 小数据量用 exact match 或 Jaccard;
- 大规模语料我会用 MinHash 或 SimHash 实现高效去重;
- 对于语义层的重复,我会用 BERT + 向量检索方式做精细化清洗。
🧪 第二部分:大模型训练数据的配比策略
大模型的训练效果,很大程度取决于不同类型数据的配比策略。以下是常见的训练数据构成比例(以语言模型训练为主):
数据类型 | 内容示例 | 推荐占比 | 说明 |
---|---|---|---|
网页语料 | Common Crawl, Wikipedia, Reddit | 30%~40% | 多样性强、通用性广 |
书籍/论文类 | Books3, arXiv, PubMed | 10%~15% | 提升专业表达能力 |
问答类数据 | SQuAD, NaturalQuestions | 5%~10% | 优化 QA 能力 |
对话类语料 | OpenSubtitles, ShareGPT | 10%~20% | 提升对话能力 |
代码语料 | GitHub, CodeSearchNet | 5%~10% | 提升代码生成/理解 |
数学/逻辑类 | MATH, GSM8K, ProofPilot | 5%~8% | 提升推理能力 |
多语言语料 | CC100, mC4 | 5%~15% | 提升多语种能力(如训练 GPT4) |
不同模型(如 GPT vs. 专用模型)会微调配比。
🎯 举个例子:LLaMA 训练数据比例(Meta)
LLaMA 用了 Common Crawl、C4、Books、ArXiv 等数据,强调多语种 + 高质量书面语,书籍语料占比更高,用于提升文本生成质量。
✅ 面试押题:
Q:你如何设计大模型训练数据的配比策略?
答:
- 我会参考现有模型(如 LLaMA、Bloom)的经验,构建多元数据池
- 保证语料覆盖常识、问答、代码、对话、数学等多场景
- 同时考虑 token 分布平衡,避免某类数据主导模型行为
📌 总结一句话
文本去重要选对算法(MinHash 精准又高效),数据配比要“广+精+多样”,让模型具备语言理解、推理、生成等多项能力。