人工智能之语言领域
第二十章 数据处理工具
文章目录
- 人工智能之语言领域
- [前言 数据处理工具](#前言 数据处理工具)
- [20.1 数据采集工具](#20.1 数据采集工具)
- [20.1.1 网络爬虫:Requests、Scrapy](#20.1.1 网络爬虫:Requests、Scrapy)
- [(1)Requests:轻量级 HTTP 请求库](#(1)Requests:轻量级 HTTP 请求库)
- (2)Scrapy:专业级爬虫框架
- [20.1.2 公开数据集平台](#20.1.2 公开数据集平台)
- [(1)Hugging Face Datasets](#(1)Hugging Face Datasets)
- (2)Kaggle
- [20.2 数据标注工具](#20.2 数据标注工具)
- [20.2.1 轻量级标注:Label Studio、Brat](#20.2.1 轻量级标注:Label Studio、Brat)
- [(1)Label Studio](#(1)Label Studio)
- (2)Brat
- [20.2.2 批量标注与协作工具:Doccano](#20.2.2 批量标注与协作工具:Doccano)
- [20.3 数据存储与管理](#20.3 数据存储与管理)
- [20.4 实战:NLP项目全流程数据处理流水线搭建](#20.4 实战:NLP项目全流程数据处理流水线搭建)
- 完整代码与配置
- [Step 1: Scrapy 爬虫(ecomment/spiders/comment.py)](#Step 1: Scrapy 爬虫(ecomment/spiders/comment.py))
- [Step 2: 转换为 Parquet](#Step 2: 转换为 Parquet)
- [Step 3: DVC 版本控制](#Step 3: DVC 版本控制)
- [Step 4: 导入 Doccano 标注](#Step 4: 导入 Doccano 标注)
- [Step 5: 构建训练集](#Step 5: 构建训练集)
- [Step 6: Hugging Face Datasets 加载](#Step 6: Hugging Face Datasets 加载)
- 数据质量保障最佳实践
- 小结
- 资料
前言 数据处理工具
在自然语言处理(NLP)项目中,"数据决定上限,模型决定下限" 。高质量、大规模、标注精准的数据是构建高性能 NLP 系统的前提。本章将系统介绍 NLP 项目全生命周期中的关键数据工具:从数据采集 (爬虫、公开数据集)、数据标注 (轻量级与协作平台)、数据存储 (格式选择、版本控制),到最终搭建一个端到端的数据处理流水线,助你高效构建可靠的数据基础。
20.1 数据采集工具
20.1.1 网络爬虫:Requests、Scrapy
(1)Requests:轻量级 HTTP 请求库
适合简单页面抓取或 API 调用。
python
import requests
from bs4 import BeautifulSoup
# 抓取新闻标题(示例)
url = "https://example-news.com"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
titles = [h2.get_text().strip() for h2 in soup.find_all('h2', class_='title')]
print(titles[:5])
✅ 适用场景 :单页数据、RESTful API、小规模采集
⚠️ 注意 :遵守
robots.txt,设置合理请求间隔(time.sleep)
(2)Scrapy:专业级爬虫框架
支持并发、自动重试、中间件、管道(Pipeline)等企业级功能。
新链接
Start URLs
Downloader
Spider
(解析HTML)
Item Pipeline
(清洗/存储)
项目结构示例:
bash
news_spider/
├── scrapy.cfg
└── news_spider/
├── __init__.py
├── items.py # 定义数据结构
├── pipelines.py # 存储逻辑
├── settings.py # 配置(UA、延迟等)
└── spiders/
└── news.py # 爬虫逻辑
核心代码(spiders/news.py):
python
import scrapy
class NewsSpider(scrapy.Spider):
name = 'news'
start_urls = ['https://example-news.com']
def parse(self, response):
for article in response.css('div.article'):
yield {
'title': article.css('h2::text').get(),
'url': article.css('a::attr(href)').get(),
'date': article.css('.date::text').get()
}
# 翻页
next_page = response.css('a.next::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
运行与导出:
bash
scrapy crawl news -o news.json # 输出 JSON 文件
✅ 优势 :高并发、自动去重、可扩展
📌 中文编码问题 :在
settings.py中设置FEED_EXPORT_ENCODING = 'utf-8'
20.1.2 公开数据集平台
(1)Hugging Face Datasets
提供 20,000+ 标准化 NLP 数据集,一键加载。
python
from datasets import load_dataset
# 加载中文情感分析数据集
dataset = load_dataset("liukun95/sentiment_chinese") # 示例ID
train_data = dataset["train"]
print(train_data[0]) # {'text': '这个电影太棒了!', 'label': 1}
# 直接转为 PyTorch DataLoader
dataloader = torch.utils.data.DataLoader(
train_data.with_format("torch"),
batch_size=8
)
🔍 搜索技巧 :在 Hugging Face Datasets Hub 按语言(Chinese)、任务(Text Classification)筛选
(2)Kaggle
竞赛平台,含大量高质量标注数据(如 Chinese Text Multi-classification)。
-
下载方式:
bashkaggle datasets download -d user/dataset-name unzip dataset-name.zip -
优势:常附带 baseline 代码、讨论区经验
20.2 数据标注工具
20.2.1 轻量级标注:Label Studio、Brat
(1)Label Studio
开源、支持多模态(文本、图像、音频)、Web 界面友好。
安装与启动:
bash
pip install label-studio
label-studio start
文本分类配置示例(config.xml):
xml
<View>
<Text name="text" value="$text"/>
<Choices name="sentiment" toName="text">
<Choice value="positive"/>
<Choice value="negative"/>
<Choice value="neutral"/>
</Choices>
</View>
导入数据(JSONL 格式):
json
{"text": "服务态度很好!"}
{"text": "物流太慢了。"}
✅ 优势:支持主动学习、模型预标注、多人协作(企业版)
(2)Brat
专为序列标注(NER、关系抽取)设计的轻量工具。
- 基于 Web,无需数据库
- 输出标准 standoff format(.ann 文件)
标注界面示例:
文本: 马云是阿里巴巴的创始人。
标注: T1 Person 0 2 马云
T2 Organization 3 6 阿里巴巴
R1 Founder Arg1:T1 Arg2:T2
📌 适用场景:学术研究、小规模 NER 项目
20.2.2 批量标注与协作工具:Doccano
Doccano 是开源的文本标注平台,支持:
- 文本分类
- 序列标注(NER)
- 序列到序列(翻译、摘要)
Docker 一键部署:
bash
docker pull doccano/doccano
docker run -d --name doccano -p 8000:8000 doccano/doccano
访问 http://localhost:8000,创建项目、上传数据、分配标注员。
数据导入格式(JSONL):
json
{"text": "北京是中国的首都。"}
{"text": "苹果发布了新款 iPhone。"}
导出格式:
- 分类:CSV(text, label)
- NER:spaCy 格式、CoNLL-U
✅ 优势:支持团队协作、进度跟踪、API 接口
20.3 数据存储与管理
20.3.1 文本数据存储格式对比
| 格式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| CSV | Excel 可读、简单 | 不支持嵌套、编码问题 | 表格型数据(分类标签) |
| JSON | 结构灵活、嵌套支持 | 文件大、无压缩 | 小规模标注数据 |
| JSONL | 流式读取、一行一记录 | 无 Schema 校验 | 大规模日志、爬虫输出 |
| Parquet | 列式存储、高压缩、快查询 | 需要额外库(pyarrow) | TB 级数据仓库 |
Parquet 使用示例(高效存储)
python
import pandas as pd
# 保存为 Parquet
df = pd.DataFrame({"text": ["你好", "世界"], "label": [1, 0]})
df.to_parquet("data.parquet", engine='pyarrow')
# 读取(比 CSV 快 5-10 倍)
df = pd.read_parquet("data.parquet")
💡 建议:
- 小项目 → CSV/JSONL
- 大数据 → Parquet + Apache Arrow
20.3.2 大规模数据集管理:DVC(数据版本控制)
DVC(Data Version Control) 将数据/模型纳入 Git 工作流,解决:
- "数据太大无法提交 Git"
- "无法追踪数据变更"
核心原理
- Git 存储 元数据指针(.dvc 文件)
- 数据文件存储在 本地/云存储(如 S3、GCS)
dvc add
原始数据
raw_data.csv
raw_data.csv.dvc
(Git 跟踪)
.gitignore
忽略 raw_data.csv
DVC Remote
(S3/GCS/本地目录)
使用流程
bash
# 初始化 DVC
dvc init
# 添加数据文件
dvc add data/raw_data.csv
# 提交元数据
git add data/raw_data.csv.dvc .gitignore
git commit -m "Add raw data"
# 推送数据到远程存储(如 AWS S3)
dvc remote add -d myremote s3://mybucket/dvcstore
dvc push
✅ 优势:
- 与 Git 协同工作
- 支持数据流水线(
dvc run)- 团队共享数据版本
20.4 实战:NLP项目全流程数据处理流水线搭建
我们将构建一个中文情感分析项目的数据流水线:
- 采集:爬取电商评论(Scrapy)
- 存储:保存为 Parquet
- 标注:用 Doccano 标注情感(正/负)
- 版本控制:DVC 管理标注后数据
- 加载:Hugging Face Datasets 读入训练
完整代码与配置
Step 1: Scrapy 爬虫(ecomment/spiders/comment.py)
python
import scrapy
class CommentSpider(scrapy.Spider):
name = 'jd_comment'
start_urls = ['https://item.jd.com/123456.html'] # 示例商品
def parse(self, response):
for comment in response.css('.comment-item'):
yield {
'text': comment.css('.comment-content::text').get(),
'user': comment.css('.user-info::text').get()
}
运行并导出:
bash
scrapy crawl jd_comment -o comments.jsonl
Step 2: 转换为 Parquet
python
import pandas as pd
df = pd.read_json("comments.jsonl", lines=True)
df = df.dropna(subset=["text"])
df.to_parquet("data/raw/comments.parquet", index=False)
Step 3: DVC 版本控制
bash
dvc init
dvc add data/raw/comments.parquet
git add data/raw/comments.parquet.dvc
git commit -m "Add raw comments"
Step 4: 导入 Doccano 标注
- 启动 Doccano:
doccano start - 创建"情感分析"项目(文本分类)
- 上传
comments.jsonl(仅保留text字段) - 标注后导出为
labeled.jsonl
Step 5: 构建训练集
python
# convert_to_csv.py
import json
with open("labeled.jsonl") as f, open("train.csv", "w") as out:
out.write("text,label\n")
for line in f:
data = json.loads(line)
# Doccano 输出: {"text": "...", "label": ["positive"]}
label = 1 if "positive" in data["label"] else 0
out.write(f'"{data["text"]}",{label}\n')
Step 6: Hugging Face Datasets 加载
python
from datasets import load_dataset
dataset = load_dataset("csv", data_files="train.csv")
dataset = dataset["train"].train_test_split(test_size=0.2)
# 直接用于 Trainer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
def tokenize(batch):
return tokenizer(batch["text"], padding=True, truncation=True)
dataset = dataset.map(tokenize, batched=True)
数据质量保障最佳实践
| 环节 | 工具/方法 |
|---|---|
| 去重 | datasketch(MinHash)、Pandas drop_duplicates |
| 清洗 | 正则表达式、ftfy(修复乱码) |
| 平衡 | imblearn(过采样/欠采样) |
| 验证 | 自定义 Schema(pydantic)、人工抽样检查 |
小结
NLP 项目的成功始于高质量数据。本章覆盖了从采集(Scrapy)、标注(Doccano)、存储(Parquet)到版本控制(DVC)的完整工具链:
- 小规模项目:Requests + Label Studio + CSV
- 工业级项目:Scrapy + Doccano + Parquet + DVC
掌握这些工具,你就能构建可复现、可协作、可扩展的 NLP 数据基础设施,为模型训练打下坚实基础。
资料
咚咚王
《Python 编程:从入门到实践》
《利用 Python 进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第 3 版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow 机器学习实战指南》
《Sklearn 与 TensorFlow 机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python 深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习 +(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第 2 版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨 +&+ 张孜铭
《AIGC 原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战 AI 大模型》
《AI 3.0》