HuggingFace课程笔记:从GitHub Issues创建自定义NLP数据集
course The Hugging Face course on Transformers 项目地址: https://gitcode.com/gh_mirrors/cou/course
引言
在NLP项目中,我们经常遇到现有数据集无法满足需求的情况。本文将详细介绍如何从GitHub Issues创建自定义数据集,这是构建NLP应用(如分类器或语义搜索引擎)的重要基础工作。
为什么需要自定义数据集
当现有数据集无法满足以下需求时,我们需要创建自定义数据集:
- 特定领域分析:如分析issue解决时间模式
- 多标签分类:训练模型自动标记issue类型(bug、功能增强等)
- 语义搜索:构建能理解用户查询的issue搜索引擎
数据获取方法
1. 使用GitHub REST API
GitHub提供了完善的REST API来获取仓库issue数据。关键端点包括:
issues
端点:获取issue列表comments
端点:获取特定issue的评论
import requests
# 基础请求示例
url = "https://api.github.com/repos/huggingface/datasets/issues"
response = requests.get(url)
issues = response.json()
2. 处理API限制
GitHub API有严格的速率限制:
- 未认证请求:每小时60次
- 认证请求:每小时5000次(需个人访问令牌)
# 使用令牌认证
headers = {"Authorization": "token your_token_here"}
response = requests.get(url, headers=headers)
数据收集最佳实践
1. 分批次获取
为避免触发速率限制,实现分页获取逻辑:
def fetch_issues(owner, repo, num_issues=1000):
per_page = 100
num_pages = math.ceil(num_issues / per_page)
for page in range(num_pages):
query = f"issues?page={page}&per_page={per_page}"
response = requests.get(f"{base_url}/{owner}/{repo}/{query}")
# 处理响应...
2. 数据存储格式
建议使用JSON Lines格式存储原始数据,每行一个JSON对象:
import pandas as pd
df = pd.DataFrame.from_records(issues)
df.to_json("dataset.jsonl", orient="records", lines=True)
数据预处理
1. 区分issue和PR
GitHub API返回的数据中,pull request也是一种issue:
dataset = dataset.map(
lambda x: {"is_pull_request": x["pull_request"] is not None}
)
2. 获取评论数据
评论数据需要单独获取,包含有价值的信息:
def get_comments(issue_number):
url = f"issues/{issue_number}/comments"
response = requests.get(url, headers=headers)
return [r["body"] for r in response.json()]
dataset = dataset.map(lambda x: {"comments": get_comments(x["number"])})
数据集上传与共享
1. 上传到Hugging Face Hub
使用push_to_hub
方法轻松共享数据集:
from huggingface_hub import notebook_login
notebook_login() # 认证
dataset.push_to_hub("github-issues") # 上传
2. 创建数据集卡片
完整的数据集卡片应包括:
- 数据集描述
- 使用场景
- 数据收集方法
- 潜在偏差分析
- 使用限制
应用场景示例
1. 多标签分类
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 加载预训练模型
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
# 微调模型...
2. 语义搜索系统
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
issue_embeddings = model.encode(issues["body"])
总结
创建高质量自定义数据集是NLP项目成功的关键。通过本文介绍的方法,你可以:
- 从GitHub等平台获取原始数据
- 进行必要的预处理和增强
- 创建完整的数据集文档
- 与社区共享你的成果
记住,好的数据集不仅包含数据本身,还包括完整的元数据和文档,这对其他研究者的使用至关重要。
course The Hugging Face course on Transformers 项目地址: https://gitcode.com/gh_mirrors/cou/course
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考