用户工具

站点工具


现有语料格式

当前MNBVC的语料格式

MNBVC语料格式检查工具

未来所有MNBVC语料都会统一格式,请提交数据的同学都执行下格式检查工具:DataCheck_MNBVC

MNBVC语料格式详情

对于语料格式的每个jsonl文件,其大小略大于500MB。

关于“时间”

时间字段所有语料格式中都有,必填,代表本语料出现的最早时间,统一采用字符串的 yyyymmdd 格式,具体规则如下:

  1. 年份固定为4位,月份和日固定为两位,例如2024年1月1日记为 '20240101';
  2. 年份不足4位需要在前面补0至4位,如738年3月3日记为 '07380303';
  3. 不能具体到日或月份,统一记为01,如公元738年记为 '07390101';
  4. 公元前则在前面加上负号,如公元前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格式说明

1.对于每一个文件,他的json结构层次如下:

 
{
    '文件名': '文件.txt', # 过滤语料种类,取中文的输入文件的文件名
    '是否待查文件': False, # 如果是True就是不怎么靠谱,告诉大家尽量别用
    '是否重复文件': False, # 留给其它小组的字段,我们小组给False就行
    '段落数': 0,
    '去重段落数': 0, # 只看中文zh_text,完全相等就算重
    '低质量段落数': 0, # 中文或者英文有缺(为空字符串)的段落数量
    '段落': [],
    '扩展字段': 任意字符串,建议为json格式,但也可用直接用自然语言写注释,比如用于描述内层段落级别的扩展字段,
    '时间': str(yyyymmdd)
}

注意:所有语种字段的双字母缩写优先参考[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)的定义,并且优先填写下文所注的段落级主要字段,如果没有,则根据iso双字母简写填入扩展字段中。如果所收录语言并不在 iso 639-1 双字母简写表中,请自己起一个不与其他双字母简写有冲突的key名写到扩展字段中,并将其key名和对应的语种作为注释写到文件级扩展字段中。

2.将每一行为一个段落,段落的json结构层次如下:

 
{
    '行号': 如果源文件有行号信息,可以记在此处,否则取从1开始递增的值,尽量保证每个段落的行号都不同,
    '是否重复': False, # 用zh_text全等进行判断,第一次出现的是False,后面重复的就是True
    '是否跨文件重复': False, # 留给其它小组的字段,我们小组给False就行
    'zh_text_md5': 十六进制的中文语句的md5,可以直接用hashlib.md5(zh_text).hexdigest()得到,
    '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格式字符串,详细约定见下文
}

段落

{
    other_texts: {
        {lang1_iso}: "",
        {lang2_iso}: ""
    },
    ...
}

文件

{
    other_texts_iso_map: {
        {lang1_iso}: "语种1",
        {lang2_iso}: "语种2"
    }
}

如果没有别的需要收录的语种,并且也没有其它信息需要用扩展字段记录时,扩展字段这里约定填{}来保证json.loads不会出问题。

3.一份样例语料数据(注意,扩展字段直接用json.dumps(obj,ensure_ascii=False)生成,故会带反斜杠将内部字符串的双引号转义):

{
    "文件名": "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": "",
            "it_text": "",
            "ja_text": "",
            "pt_text": "Gerando areia do oceano",
            "ru_text": "Создание песка в океане",
            "es_text": "",
            "sv_text": "",
            "ko_text": "",
            "th_text": "",
            "other1_text": "",
            "other2_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"
        }
    ],
    "扩展字段": "{
        \"other_texts_iso_map\": {
            \"cs\": \"捷克语\",
            \"pl\": \"波兰语\",
            \"hu\": \"匈牙利语\",
            \"uk\": \"乌克兰语\",
            \"tr\": \"土耳其语\"
        }
    }",
    "时间": "20240316"
}
现有语料格式.txt · 最后更改: 2024/09/21 19:28 由 MNBVC项目组