====== 当前MNBVC的语料格式 ======
通用文本格式
[[https://github.com/aplmikex/deduplication_mnbvc]]
问答语料格式
[[https://github.com/wanicca/WikiHowQAExtractor-mnbvc]]
代码语料格式
[[https://github.com/LinnaWang76/githubcode_extractor_mnbvc]]
多轮对话语料格式
[[https://github.com/pany8125/ShareGPTQAExtractor-mnbvc]]
论坛语料格式
[[https://github.com/aplmikex/forum_dialogue_mnbvc]]
平行语料格式
[[https://github.com/liyongsea/parallel_corpus_mnbvc]]
多模态语料
[[https://huggingface.co/datasets/wanng/example_mmdata_mnbvc]]
====== MNBVC语料格式检查工具 ======
未来所有MNBVC语料都会统一格式,请提交数据的同学都执行下格式检查工具:[[https://github.com/X94521/DataCheck_MNBVC|DataCheck_MNBVC]]
======MNBVC语料格式详情 ======
对于语料格式的每个jsonl文件,其大小略大于500MB。
==== 关于“时间” ====
时间字段所有语料格式中都有,必填,代表本语料出现的最早时间,统一采用字符串的 yyyymmdd 格式,具体规则如下:
- 年份固定为4位,月份和日固定为两位,例如2024年1月1日记为 '20240101';
- 年份不足4位需要在前面补0至4位,如738年3月3日记为 '07380303';
- 不能具体到日或月份,统一记为01,如公元738年记为 '07390101';
- 公元前则在前面加上负号,如公元前5000年记为 '-50000101';
补充:补零4位python代码只需要加上:04d为 f'{$year:04d}',如需将补零4位字符串转换为int,python中 int() 函数会自动识别转换,如 int('0001') 则为整数 1。
==== 通用文本输出jsonl格式说明 ====
1.对于每一个文件,时间格式为yyyymmdd,具体参考前面的内容,他的json结构层次如下:
{
'文件名': '文件.txt',
'是否待查文件': False,
'是否重复文件': False,
'文件大小': 1024,
'simhash': 0,
'最长段落长度': 0,
'段落数': 0,
'去重段落数': 0,
'低质量段落数': 0,
'段落': [],
'扩展字段': json_str,
'时间': str(yyyymmdd),
}
将每一行为一个段落,段落的json结构层次如下:
{
'行号': line_number,
'是否重复': False,
'是否跨文件重复': False,
'md5': md5,
'内容': line,
'扩展字段': json_str
}
2.结果示例:
{
'文件名': '文件.txt',
'是否待查文件': False,
'是否重复文件': False,
'文件大小': 1024,
'simhash': 0,
'最长段落长度': 0,
'段落数': 0,
'去重段落数': 0,
'低质量段落数': 0,
'段落': [
{
'行号': 1,
'是否重复': False,
'是否跨文件重复': False,
'md5': 'md5hash1',
'内容': '这是第一段文字。',
'扩展字段': json_str
},
'扩展字段': json_str,
'时间': str(yyyymmdd),
]
}
==== 问答语料输出jsonl格式说明 ====
1.每行是一条问答数据,对应一个WikiHow词条页面。
2.对于每一个问答数据,其最高层次结构如下。
{
"id":123456,
"问":"写一个超短小说",
"答":"他们相遇,又别离。岁月如梭,情感却不减。",
"来源":"wikihow",
"元数据":{
"create_time":"20230511 15:56:03",
"问题明细":"",
"回答明细":"",
"扩展字段":""
},
"时间": str(yyyymmdd),
}
3.在wikihow语料中,"回答明细"是一个列表,结构层次如下:
[
{
"回答": "完整回答文本,包含方法、提示、注意事项",
"简要回答": "回答的摘要文本,来自WikiHow的页面开头信息,概括了页面的主要内容",
"结构": {}
}
]
4.每个回答除了回答文本、简要回答文本以外,还有可供参考使用的结构信息,结构如下。
"结构": {
"方法":[],
"小提示":[],
"注意事项":[]
}
5.方法内部的结构包括编号、标题、步骤,每个步骤包括自己的编号、标题、描述。
6.小提示、注意事项为字符串列表。
7.结果示例:
{
"id": 0,
"问": "如何在PS3上玩PS2游戏",
"答": "1. 了解基础知识 ...",
"来源": "来源",
"时间": str(yyyymmdd),
"元数据": {
"create_time": "20230517 06:47:18",
"问题明细": "...",
"回答明细": {
"回答": "...",
"简要回答": "如果你的PS3游戏机的机型在硬件上兼容PS2光盘,那么你就可以在PS3上正常地玩PS2的游戏。尽管存档这些游戏需要额外的步骤,但是一旦你完成相关的游戏设置,很快你就可以在PS3上玩PS2游戏啦。",
"结构": {
"方法": [
{
"编号": 1,
"标题": "了解基础知识",
"步骤": [
{
"编号": 1,
"标题": "查明你的PS3是否具有反向兼容性。",
"描述": "PS3游戏机经历了一系列的更新升级和改变。尽管有些版本的PS3控制台可用于玩PS2游戏,但是并不是所有版本都能够兼容。..."
},
{
"编号": 2,
"标题": "像往常那样,插入游戏光盘。",
"描述": "PS2光盘插入光驱的方法和PS3光盘相同。一旦插入光盘,无需其它动作指令或协助,PS3就会自动识别并载入光盘内容。 接着,你就可以玩你想玩的游戏了。"
}
]
}
],
"小提示": ["如果你的PS3控制台不兼容,那么可以尝试从Playstation在线商店下载PS2版本游戏。遇到这种情况时,你需要购买一个新游戏,而不是使用旧版本游戏。但在兼容的控制台上也可以玩旧版本游戏。"],
"注意事项": ["值得注意的是,有些PS2游戏只能部分兼容于PS3设备,所以在玩游戏的过程中可能遭遇各种问题。以下将列出部分于PS3设备的游戏: 生死极速 魔力女战士 火爆狂飙 ..."]
}
}
}
}
==== 代码语料输出jsonl格式说明 =====
1.每行是一个文本的数据,对应一个代码仓库里的文本文件。
2.对于每一行数据,其最高层次结构如下。
{
"来源":"github",
"仓库名":"esbatmop/MNBVC",
"path":"/main/README.md",
"文件名":"README.md",
"ext": "md",
"size":123456,
"原始编码":"GBK",
"md5":"文件的md5值",
"text": "文件的内容,utf8格式",
"时间": str(yyyymmdd),
}
3.结果示例:
{
"来源":"github",
"仓库名":"esbatmop/MNBVC",
"path":"/main/README.md",
"文件名":"README.md",
"ext": "md",
"size":123456,
"原始编码":"GBK",
"md5":"文件的md5值",
"text": "文件的内容,utf8格式",
"时间": str(yyyymmdd),
}
==== 代码commit语料输出jsonl格式说明 =====
1.每行是一个文本的数据,对应一个代码仓库里的一个文本文件的变更。
2.对于每一行数据,其最高层次结构如下。
{
"来源":"github",
"仓库名":"esbatmop/MNBVC",
"path":"/main/README.md",
"文件名":"README.md",
"ext": "md",
"index": "abc1234..def5678",
"message": "Update with new content",
"diff": "@@ -1,3 +1,4 @@
This is the first line.
-This is the second line.
+This line has been modified.
@@ -5,2 +6,3 @@
+This line has been modified again.
+This is another new line added.",
"原始编码":"GBK",
"md5":"差异的md5值",
"时间": str(yyyymmdd),
'扩展字段': "json_string",
}
==== 多轮对话输出jsonl格式说明 =====
1.每行对应一对问答,包含问答文本,以及同一会话下多轮问答的唯一标识和序号。
2.对于每一个问答数据,其最高层次结构如下。
{
"id":"82b2834abe2ed41a26b6b06317114f8f",
"问":"写一个超短小说",
"答":"他们相遇,又别离。岁月如梭,情感却不减。",
"来源":"ShareGPT",
"时间": str(yyyymmdd),
"元数据":{
"create_time":"20230511 15:56:03",
"问题明细":"\"from\": \"human\"",
"回答明细":"\"from\": \"gpt\"",
"扩展字段":"{\"会话\": 1, \"多轮序号\": 1, \"解析模型\": gpt4}"
}
}
3.jsonl文件中每一行的json基本KV说明。
^ KEY ^ VALUE说明 ^
| id | 每一对问答的唯一标识,使用json串的md5作为唯一标识id |
| 问 |问的文本 |
| 答 |答的文本 |
| 来源 |固定为'ShareGPT' |
| 元数据|包含创建时间、问题明细、回答明细、扩展字段 |
4.元数据中每一项的KV说明。
^ KEY ^ VALUE说明 ^
| create_time |问答创建时间,格式为%Y%m%d %H:%M:%S |
| 问题明细 |原始语料中问的来源,例如 "from": "human" |
| 回答明细 |原始语料中答的来源,例如 "from": "gpt" |
| 扩展字段 |包含会话的唯一标识和本条在会话中的序号,以及解析模型 |
5.扩展字段中每一项的KV说明。
^ KEY ^ VALUE说明 ^
| 会话 |会话的唯一标识,例如 "会话": "yOKd88p" |
| 多轮序号|本条在会话中的序号,例如 "多轮序号": 1 |
| 解析模型 |用于标识原始语料的来源,例如 "解析模型": "gpt4" |
| 其他。。等等|语料中问答相关的其他补充信息字段 |
6.注意:如果有问没答,保持答为空。如果只有答案没有问,直接丢弃答。
7.结果示例:
{
"id": "82b2834abe2ed41a26b6b06317114f8f",
"问": "Can you make me a Shakespearean script about a girl who has tummy troubles and can\u2019t fart not matter how hard she tries- so they think she is a witch",
"答": "Sure, here's a Shakespearean script about a girl who c...",
"来源": "ShareGPT",
"时间": str(yyyymmdd),
"元数据": {
"create_time": "20230517 10:41:58",
"问题明细":"\"from\": \"human\"",
"回答明细":"\"from\": \"gpt\"",
"扩展字段": "{
"会话": "yOKd88p",
"多轮序号": 1,
"解析模型": "gpt4"
}"
}
}
==== 论坛语料输出jsonl格式说明 ====
1.每行是一个以一个主题,论坛针对该主题进行回复的对话。
2.对于每一个论坛主题对话,其最高层次结构如下。
{
"ID": 10000,
"主题": "主题",
"来源": "清华树洞",
"回复": [],
"时间": str(yyyymmdd),
"元数据": {
"发帖时间": "20200628 06:38:34",
"回复数": 37,
"扩展字段": ""
}
}
3.其中回复是关于该语料的回复的相关评论的字典的列表,其结构如下所示。
{
"楼ID": "abcdef",
"回复": "",
"扩展字段": "",
}
4.主题是楼主的话,由于楼主如果只发了链接由于会被过滤掉,所以主题有可能是空字符串。
5.扩展字段会以字符串的格式给出,格式不完全固定,原始数据里面有什么就当前的内部格式如下所示,可以通过json.loads来解析。
元数据里面的扩展字段:
{
"标签": "label",
"点赞数": 0,
"原文": "",
}
回复里面的扩展字段:
其中引用id代表回复的评论的那个的id,如果原始语料中只有回复某个人而没有具体回复哪条评论,引用ID置空,将只保留回复人。
(注:由于原始语料问题,引用人可能不能匹配在此回复之前的某个回复人)
{
"回复人": "等站",
"回复时间": "",
"引用ID": "abcde",
"引用人": "等战",
"点赞数": 1,
"点踩数": 1,
}
6.label代表这个帖代表什么类型的讨论。
7.原文是该语料的完整来源,如果我们代码解析出错可以在原文中自行提取。
8.结果示例:
{
"ID": 275957,
"主题": "出一张今晚七点贝多芬专场作品音乐会的票,一楼18排4座,原价60出。",
"来源": "北大树洞",
"时间": str(yyyymmdd),
"回复": [
{
"楼ID": "1",
"回复": "有意者可加洞主微信*",
"扩展字段": "{\"回复人\": \"洞主\", \"引用人\": \"洞主\", \"回复时间\": \"20170924 13:54:21\"}"
},
{
"楼ID": "2",
"回复": "搭车转,楼主优先。有要的留言啊",
"扩展字段": "{\"回复人\": \"Alice\", \"引用人\": \"Alice\", \"回复时间\": \"20170924 14:31:48\"}"
},
{
"楼ID": "3",
"回复": "已出",
"扩展字段": "{\"回复人\": \"洞主\", \"引用人\": \"洞主\", \"回复时间\": \"20170924 17:17:50\"}"
}
],
"元数据": {
"发帖时间": "20170924 13:53:31",
"回复数": 3,
"扩展字段": "{\"原文\": \"#p 275957 2017-09-24 13:53:31 1 3\\n出一张今晚七点贝多芬专场作品音乐会的票,一楼18排4座,原价60出。\\n\\n#c 1047150 2017-09-24 13:54:21\\n[洞主] 有意者可加洞主微信*\\n\\n#c 1047192 2017-09-24 14:31:48\\n[Alice] 搭车转,楼主优先。有要的留言啊\\n\\n#c 1047510 2017-09-24 17:17:50\\n[洞主] 已出\", \"点赞数\": 1}"
}
}
==== 平行语料输出jsonl格式说明 ====
语料文件是多行 jsonl 格式,这是其中一行的样例(实际上一行即为一个json,不需要缩进打印):
{
"文件名": "Terraria-workshop-localization_test2.jsonl",
"是否待查文件": false,
"是否重复文件": false,
"段落数": 17944,
"去重段落数": 0,
"低质量段落数": 0,
"行号": 1,
"是否重复": false,
"是否跨文件重复": false,
"it_text": "",
"zh_text": "正在生成海洋沙",
"en_text": "Generating ocean sand",
"ar_text": "",
"nl_text": "",
"de_text": "",
"eo_text": "",
"fr_text": "Génération du sable de l'océan",
"he_text": "",
"ja_text": "",
"pt_text": "Gerando areia do oceano",
"ru_text": "Создание песка в океане",
"es_text": "",
"sv_text": "",
"ko_text": "",
"th_text": "",
"id_text":"",
"cht_text":"",
"vi_text":"",
"扩展字段": "{\"other_texts\": {\"cs\": \"Generování mořského písku\", \"pl\": \"Generowanie piasku morskiego\", \"hu\": \"Tengeri homok elhelyezése\", \"uk\": \"Генерація океанського піску\", \"tr\": \"Okyanus kumu üretme\"}}",
"时间": "20240316",
"zh_text_md5": "b656579704c6ca5acc29f2aa36159ce2"
}
如果语料格式与平行语料小组的github主仓库有差异,**以仓库内的README所展示的为准**。https://github.com/mnbvc-parallel-corpus-team/parallel_corpus_mnbvc
字段说明:
**文件名**: 建议和输出的 jsonl 文件名保持一致。对于每份独立的语料,以文件名为唯一依据。每份文件独立计算的 `时间`, `是否待查文件`, `是否跨文件重复`, `是否重复`, `是否重复文件`, `段落数`, `低质量段落数`, `去重段落数` 会随文件名冗余多份,保证文件名相等的情况下这几个字段结果相等。所以建议取一个**能够精确描述这份语料来源**的文件名。
**是否待查文件**: 如果是 True 就是不怎么靠谱,告诉大家尽量别用,平行语料小组收录的语料的此字段若无特殊情况将**全部给 False**
**是否重复文件**: 留给其它小组的进行去重工作的字段,平行语料小组收录的语料的此字段将**全部给 False**
**段落数**: 等于整份文件中jsonl的行数
**去重段落数**: 以 `zh_text` 为依据,“重复了的段落”的个数,注意**不是去重后不同的段落个数**
**低质量段落数**: `zh_text` 或者 `en_text` 有缺(为空字符串)的段落数量
**行号**: 段落下标,是一个取值范围在 `[1, 段落数]` 之间的整数
**是否重复**: 由 `zh_text` 是否重复来决定,每个非重复段落第一次出现时是 False, 此后再次出现发现已重复时是 True
**是否跨文件重复**: 留给其它小组的进行去重工作的字段,平行语料小组收录的语料的此字段将**全部给 False**
**时间**: `yyyymmdd` 格式的日期字符串,表示这份语料被转换为本文所定义的标准平行语料格式的时间。可以参考样例