CoolFace
Datasetpublic

miracleyin/example_mmdata_mnbvc

mnbvc mm dataset v2.1 MNBVC 多模态语料数据格式。原链接:https://huggingface.co/datasets/wanng/example_mmdata_mnbvc 参考实现:mm_template_mnbvc 的 mmdata_block.BLOCK_SCHEMA。schema 以那份代码为准,这个数据集是它的示例产物。 字段 字段名称 类型 字段说明 可选 实体ID string 数据的唯一标识符。用于在数据集中确定是哪一条数据。在单个数据集中确定一条数据的实体对象。 必选 md5 string 内容的 md5,用于去重与完整性校验 必选 块ID int32 一个实体对象内的标识符。用于确定一条数据内的一个部分数据。parquet 行的最小单元。 必选 块类型 string 用于保存块的类别。类别的含义为「模态」。取值见下 必选 扩展字段 string 用于保存块的元信息。为可以被成功 load 的 json 字符串。后期可继续扩展 必选… See the full description on the dataset page: https://huggingface.co/datasets/miracleyin/example_mmdata_mnbvc.

sourceHugging Faceapache-2.0updated 24d agoView on Hugging Face
2likes72downloads
Dataset Card

mnbvc mm dataset v2.1

MNBVC 多模态语料数据格式。原链接:https://huggingface.co/datasets/wanng/examplemmdatamnbvc

参考实现:mm_template_mnbvcmmdata_block.BLOCK_SCHEMAschema 以那份代码为准,这个数据集是它的示例产物。

字段

字段名称类型字段说明可选
实体IDstring数据的唯一标识符。用于在数据集中确定是哪一条数据。在单个数据集中确定一条数据的实体对象。必选
md5string内容的 md5,用于去重与完整性校验必选
块IDint32一个实体对象内的标识符。用于确定一条数据内的一个部分数据。parquet 行的最小单元。必选
块类型string用于保存块的类别。类别的含义为「模态」。取值见下必选
扩展字段string用于保存块的元信息。为可以被成功 load 的 json 字符串。后期可继续扩展必选
时间string语料首次出现的时间,如无法确定则为处理该数据实体的时间。格式 YYYYMMDD必选
页IDint32当文件从文档中解析时,当前页码(0 起)可选
文本large_string文本块的内容可选
图片struct\<bytes, path\>图片块的内容可选
视频struct\<bytes, path\>视频块的内容可选
音频struct\<bytes, path\>音频块的内容可选
OCR文本large_string图片的 OCR 结果可选
STT文本large_string音频的 STT 结果可选

块类型 取值:text · image · audio · video · pdf · image-text-pair

相对 v2.0 的变化

v2.0 的示例数据和参考实现的代码在 schema 上是对不上的,这一版把两边统一了。 以下改动会影响读旧数据的代码

v2.0v2.1为什么
md5 列名文件md5md5示例用 文件md5、代码用 md5,同一个字段两个名字
md5 语义文件 md5(示例里恒为 null)内容 md5参考实现里算的是文件名的 md5,既不能去重也不能校验:内容相同名字不同得到两个 md5,文件被截断反而 md5 不变
视频没有代码里一直声明着,示例里漏了
媒体列类型binarystruct<bytes, path>HuggingFace 的 Image/Audio/Video 三个 feature 用的都是这个结构,binary 和 base64 字符串都解不出图,见下
块类型 取值文字/图片/音频text/image/audio示例用中文、chinaxiv 转换用 pdf/image-text-pair、视频转换用 视频,同一列三套词汇,没法统一筛选
schemapandas 逐批推断显式声明推断的结果是整列为空时被推成 null 类型(v2.0 里 OCR文本/STT文本/文件md5/页ID 都是 null),另一批有值时推成 binary,两个 shard 拼不起来

解不出来的方式会变,别拿报错去判断。 datasets 4 在把 binary 或 base64 字符串 cast 成 Image() 时抛 ArrowNotImplementedError: Unsupported cast ... to structdatasets 5 接受了这次 cast,转而把 base64 内容当文件名去打开,死在 FileNotFoundError。两种都拿不到图,所以用 struct<bytes, path> 的理由不变—— 但如果你的代码在 except 里匹配报错文本,它会在升级 datasets 时静悄悄地不再匹配。

体积上媒体列从 binary 改成 struct 没有代价(path 那个小字符串 zstd 之后压没了)。

读旧数据不用改代码:参考实现里的 decode_media() 同时吃 struct / 裸 bytes / base64 字符串三种形态。

内容

7 行,一个 parquet 文件:

块ID块类型内容
0text一行 demo 文字
1imageblocks/demo.png,200×200
2audioblocks/demo.wav,5 秒 @44.1kHz
0–3image-text-pair4 页真实 PDF:整页光栅 @200dpi + 该页 Markdown

PDF 页那 4 行来自 pdfsystem_mnbvcpdfsys.page/v2 页级格式,经 pdfsys mnbvc-export --dialect v2 转换而来 —— 两边 schema 逐列一致。它们的 扩展字段 里带着 width_pt/height_pt/render_dpi/ extractor 等页级信息。

读取

python
from datasets import load_dataset, Audio, Image

ds = load_dataset("miracleyin/example_mmdata_mnbvc", split="train")

ds.cast_column("图片", Image())[1]["图片"]     # -> PIL.Image
ds.cast_column("音频", Audio())[2]["音频"]     # -> {"array": ..., "sampling_rate": 44100}

不确定手上那份是 v2.0 还是 v2.1 时:

python
from src.mm_data.core.models.mmdata_block import decode_media

blob = decode_media(row["图片"])   # struct / 裸 bytes / base64 三种都吃

mmdata.ipynb 里是从零造各模态数据块并写成 parquet 的完整流程。

说明

每一行文本/图片/视频/音频只能存在一条内容。

OCR文本 只在图片确实过了 OCR 时才填。这里那 4 行 PDF 页的 OCR文本 是 null —— 它们的 文本 来自 PyMuPDF 直读 PDF 自带的文本层,不是从像素识别出来的,填进 OCR文本 就是谎报。走 MinerU 的 pipeline / VLM 链路时才会填。扩展字段.extractor 记录了是哪条链路。

PDF 页的源文件来自 OmniDocBencholmOCR-bench 两个公开 benchmark,上游许可未逐份核实。