# 基于B站视频评论区构建对话数据集
> 本项目仅用于学习交流,不可用于商业用途,如有侵权请联系删除。爬虫程序务必遵守相关法律法规,本项目不承担任何责任。务必不要影响网站正常运行!
## 一些例子
最终完成构建的数据集,样例如下:
```json
[
[
{
"from": "龙末",
"value": "上学的时候,寝室六个人,蚊子只爱我,\n宁可趴在我蚊帐上对我垂涎三尺望眼欲穿,都不会去叮其他人趴其他人的蚊帐,"
},
{
"from": "雾川鹤",
"value": "我一样,宿舍四个人,只叮我,b型血"
},
{
"from": "心琪爱糖",
"value": "b血加一,一个屋里人家能骑着被子我得从头到脚裹严实"
},
{
"from": "带个蓬箍会头疼",
"value": "和血型无关,和糖分有关,一般胖人,或者懒人身上没肌肉都是那种软肉,糖分会高点,肌肉男运动型人不怎么招蚊子"
},
{
"from": "龙末",
"value": "我是176cm,55kg的肌肉女"
},
{
"from": "带个蓬箍会头疼",
"value": "55的176很瘦了,不过血糖也不是看体重,如果甜食吃的多血糖也多。我才163,体重50,血糖就体检有点多,皮和骨头直接没有肉,只有脂肪,不运动原因,"
},
{
"from": "龙末",
"value": "我特讨厌吃甜食,爱喝水不喝饮料,不吃肉,只吃鱼和蔬菜,血糖正常。[OK]"
}
]
]
```
> 目前的算法会将符合条件(长度大于等于阈值)的所有对话分支都保留下来,比如,对于
> ```
> /--F
> A -> B -> C -> D -> E
> \--G
> ```
> 那么它会形成三条链,分别是 ABCDE、ABCDF、ABCDG。这是特殊处理过的(`def build_conv_from_replies`)。如果你不需要特殊处理,想获得和 B 站评论区一致的对话,可参考 [#1 ](https://github.com/FunnySaltyFish/bilibili_comments_crawl/issues/1) 修改对应代码
这个数据格式是 Aquila 做微调需要的,具体参见 [它们的 Github 仓库](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/Aquila/Aquila-chat/data)。更多数据样例,请移步文章最后的仓库源码查看。
## 如何运行
1. 环境
- Python 3.7+ (自测环境为 Python 3.10.4)
- 使用 `pip install -r requirements.txt` 安装相关依赖
- 一个可用的 B 站账号
2. .env
由于 B 站限制,爬取相关内容需要登录,因此需要配置一下账号的 Cookie。
克隆此项目后,在根目录下创建 .env 文件,内容如下:
```
SESSDATA='xxx'
BUVID3='xxxx'
DEDE_USER_ID='xxx'
BILI_JCT='xxx'
AT_TIME_VALUE='xxx'
```
各项值的含义和获取方式请参考 https://nemo2011.github.io/bilibili-api/#/get-credential 。
3. 按需修改参数
项目的主要文件只有一个, `bilibili_comments_crawler.py`,您可以配置的参数有:
```python
# 同时最多运行多少个协程,可调,但不建议改太大,不要给 B 站造成负担
ASYNC_POOL_MAX_SIZE = 16
# 对话链的最短有效长度,超过此长度的对话才会被保存
MIN_DIALOG_LENGTH = 5
# oid 即为视频的 av 号,可以在某个视频的源码中找到(右键-查看源代码-搜索 oid)
VIDEO_OID = 2
# 爬取每一页评论(即视频下面)后的休眠时间,单位秒
SLEEP_TIME_ONE_PAGE = 0.1
# 爬取每一条评论后的休眠时间,单位秒
SLEEP_TIME_ONE_REPLY = 0.1
# 被 B 站限制访问时的休眠时间,单位秒
SLEEP_TIME_WHEN_LIMITED = 30
# 被 B 站限制访问时的最高重试次数,超过此次数则放弃
MAX_RETRY_TIME_WHEN_LIMITED = 3
# 当某条数据已经爬过时,是否跳过,而不是重新爬取(对于新视频,有可能评论会随时间更新;老视频一般无影响)
SKIP_EXISTED_DATA = True
```
请按实际情况配置。
另外,项目生成的 json 格式为 `Aquila` 微调所需格式,如果需要改,可以自行修改 `build_conv_from_replies` 函数。
4. 跑起来
```bash
python bilibili_comments_crawler.py
```
下面是配套文章。
---
## 前言
前段时间,我的某个课程给我们提出了一个任务:自行构建数据集,微调 [Aquila-7B](https://model.baai.ac.cn/model-detail/100098) 大模型。上网搜了一圈,发现很多对话数据集是用的 GPT 系列的模型,而且数据集很多都是英文的,中文的数据集很少。作为 B 站用户,我突发奇想,想到了 B 站的视频评论区,这里的对话更加贴近生活,而且 B 站的视频评论区有很多热门视频,评论数也很多,能不能那它们来构建一个中文的对话数据集呢?
> 后记:由于时间关系,我最终没有用这个数据集来微调 Aquila-7B。不过既然折腾了这么久,我还是把这个项目写出来了,希望能对大家有所帮助。
## 基本思路
先不谈各种细节,我们先回顾下B站的评论区(或者各种视频网站的评论区),一般来说,评论区的对话是这样的:
![Alt text](image.png)
因此每一层可以作为一个主题,其下每一条评论可以作为一个对话,默认情况下它是对这一层评论的回复,但是也有可能大家互相交流起来了。用数据结构的话,大概可以形成一棵树
```mermaid
graph LR
A[主题1] --> B[评论1]
A --> C[评论2]
A --> D[评论3]
B --> E[评论4]
B --> F[评论5]
C --> G[评论6]
C --> H[评论7]
D --> I[评论8]
```
这样,从树的根节点开始,到树的某一个叶子结点结束,就形成了一段对话。因此,我们的基本思路就是,从树的根节点开始,遍历树的所有叶子结点,每一条路径就是一段对话,我们把这些对话保存下来,按一定条件筛选,就构成了一个对话数据集。
思路有了,下面开始获取数据吧!
## 爬虫
### 基本结构
我们先来看看 B 站的评论区是怎么样的,打开一个视频,点击评论区,在 F12 开发者工具中,我们可以看到评论区的请求如下:
![Alt text](image-1.png)
这是一个分页请求,每一页的接口返回的评论数据在 `data.replies` 中,其中每一条代表**一层**,有一个 `rpid` 字段,代表这一层的评论 ID。那每一层的评论又是怎样的呢?
![Alt text](image-2.png)
里面还是 `replies` 字段,代表这一层的所有回复,结构与上面的一样。不过这一层下面就没有子层级了。打开 B 站页面,发现这个层中的评论也是按分页加载的。
![Alt text](image-3.png)
也就是说,要爬取一个视频的所有评论,我们需要先获取第一层的评论,然后获取每一层的回复,直到没有回复为止。我们要做到两层的分页,第一层是获取视频下评论区某一页的评论,第二层是获取某一层的某一页的回复。这意味着,我们需要用一些方法来做到并行爬取,否则效率会很低。
### 协程和协程池
#### 协程
谈到并行,我们一般可能会想到线程,不过在线程之上还有更轻量的并发方式:协程。协程是一种用户态的“轻量级线程”,可以在一个线程中实现并发,协程的切换不需要操作系统的参与,因此效率很高。Python 3.4 之后的协程是通过 `asyncio` 模块实现的,我们可以通过 `async` 和 `await` 关键字来定义协程,通过 `asyncio.run()` 来运行协程。协程的执行需要一个事件循环,我们可以通过 `asyncio.get_event_loop()` 来获取一个事件循环,然后通过 `loop.run_until_complete()` 来运行协程。
举个栗子:
```python
import asyncio
async def main():
print('Hello')
await asyncio.sleep(1)
print('World')
# 在 Python 高版本中,可以用 asyncio.run(main()) 来运行协程
# 或者低版本的:
# loop = asyncio.get_event_loop()
# loop.run_until_complete(main())
asyncio.run(main())
```
输出:
```
Hello �
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 基于Python对B站评论区数据构建大语言模型+数据集源码+详细说明+全部数据资料 高分项目.zip基于Python对B站评论区数据构建大语言模型+数据集源码+详细说明+全部数据资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于Python对B站评论区数据构建大语言模型+数据集源码+详细说明+全部数据资料 高分项目.zip (22个子文件)
bilibili_comments_crawl-master
image.png 201KB
bilibili_comments_crawler.py 10KB
image-3.png 142KB
image-2.png 137KB
example_data
video_960513817
page_1
rpid_184452398752_convs.json 1KB
rpid_184330501552_convs.json 1KB
rpid_184334042368_convs.json 1KB
rpid_184347526080_convs.json 2KB
video_2
page_1
rpid_2576184175_convs.json 546B
rpid_208000425_convs.json 24KB
rpid_917945205_convs.json 5KB
rpid_476670_convs.json 7KB
rpid_495059_convs.json 2KB
image-4.png 78KB
requirements.txt 55B
bilibili_comments_crawler_test.py 5KB
.gitignore 49B
image-1.png 292KB
README.md 24KB
async_pool.py 5KB
config.py 263B
171265889347208773632.zip 416B
共 22 条
- 1
资源评论
不走小道
- 粉丝: 3324
- 资源: 5060
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 计算机毕业设计:python+爬虫+cnki网站爬
- nyakumi-lewd-snack-3-4k_720p.7z.002
- 现在微信小程序能用的mqtt.min.js
- 基于MPC的非线性摆锤系统轨迹跟踪控制matlab仿真,包括程序中文注释,仿真操作步骤
- shell脚本入门-变量、字符串, Shell脚本中变量与字符串的基础操作教程
- 基于MATLAB的ITS信道模型数值模拟仿真,包括程序中文注释,仿真操作步骤
- 基于Java、JavaScript、CSS的电子产品商城设计与实现源码
- 基于Vue 2的zjc项目设计源码,适用于赶项目需求
- 基于跨语言统一的C++头文件设计源码开发方案
- 基于MindSpore 1.3的T-GCNTemporal Graph Convolutional Network设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功