====== 当前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代码z只需要加上:4d为 f'{$year:4d}',如需将补零4位字符串转换为int,python中 int() 函数会自动识别转换 ==== 通用文本输出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), } ==== 多轮对话输出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格式说明 ==== 1.对于每一个文件,他的json结构层次如下: { '文件名': '文件.txt', '是否待查文件': False, '是否重复文件': False, '段落数': 0, '去重段落数': 0, '低质量段落数': 0, '段落': [], '拓展字段': json_str, '时间': str(yyyymmdd), } 2.将每一行为一个段落,段落的json结构层次如下: { '行号': line_number, '是否重复': False, '是否跨文件重复': False, 'zh_text_md5': zh_text_md5, 'zh_text': 中文, 'en_text': 英语, 'ar_text': 阿拉伯语, 'nl_text': 荷兰语, 'de_text': 德语, 'eo_text': 世界语, 'fr_text': 法语, 'he_text': 希伯来文, 'it_text': 意大利语, 'ja_text': 日语, 'pt_text': 葡萄牙语, 'ru_text': 俄语, 'es_text': 西班牙语, 'sv_text': 瑞典语, 'ko_text': 韩语, 'th_text': 泰语, 'id_text': 印尼语, 'vi_text': 越南语, 'cht_text': 繁体中文, 'other1_text': 小语种1, 'other2_text': 小语种2, '拓展字段': json_str, '时间': str(yyyymmdd), } 3.结果示例: { '文件名': '文件.txt', '是否待查文件': False, '是否重复文件': False, '段落数': 0, '去重段落数': 0, '低质量段落数': 0, '段落': [{ '行号': 1, '是否重复': False, '是否跨文件重复': False, 'zh_text_md5': 'zh_text_md5', 'zh_text': '中文', 'en_text': '英语', 'ar_text': '阿拉伯语', 'nl_text': '荷兰语', 'de_text': '德语', 'eo_text': '世界语', 'fr_text': '法语', 'he_text': '希伯来文', 'it_text': '意大利语', 'ja_text': '日语', 'pt_text': '葡萄牙语', 'ru_text': '俄语', 'es_text': '西班牙语', 'sv_text': '瑞典语', 'ko_text': '韩语', 'th_text': '泰语', 'id_text': 印尼语, 'vi_text': 越南语, 'cht_text': 繁体中文, 'other1_text': '小语种1', 'other2_text': '小语种2', '拓展字段': json_str }], '拓展字段': json_str }