Unstructured 是什么
Unstructured 把不同格式的文档(PDF、DOCX、HTML、PPTX、邮件等)统一切成带类型的元素:标题、正文段落、表格、列表项、页眉页脚各有自己的 category。它的价值在于把“按格式分别写解析分支”的工作收敛成一套元素模型,后续清洗与切分可以按元素类型分别处理——比如表格整块保留、页眉页脚直接丢弃。fast 模式只做轻量文本抽取,hi_res 模式会调用版面模型做更精细的识别。
基本信息
| 入口函数 | unstructured.partition.auto.partition |
|---|---|
| 策略 | strategy=fast(轻量)或 hi_res(版面模型) |
| 元素类型 | Title、NarrativeText、Table、ListItem、Header 等 |
| 元素属性 | category、text、metadata(页码、文件名) |
| 依赖 | hi_res 需要额外模型与系统库,离线需预置 |
典型使用场景
- 格式杂乱的语料库:一套接口吃下 PDF、Word、HTML,减少维护分支
- 按类型分流处理:表格单独转 Markdown,正文才进切片器
- 丢弃噪声元素:识别出页眉页脚与页码类元素,整体过滤而非靠正则硬删
- 元数据补全:元素自带页码与文件名,可直接写入切片元数据
- 流程对照:先用 fast 跑通全量,再对解析质量差的文档局部切到 hi_res
分区与按类型处理
分区与按类型处理
from unstructured.partition.auto import partition
elements = partition(filename='report.pdf', strategy='fast')
for el in elements[:5]:
print(el.category, '|', str(el)[:60]) # 元素类型与开头
tables = [el for el in elements if el.category == 'Table']
prose = [el for el in elements if el.category == 'NarrativeText'] # 只切正文元素类型与处理建议
| category | 含义 | 入库处理 |
|---|---|---|
| Title | 标题 | 写成切片的标题路径元数据 |
| NarrativeText | 正文段落 | 按句子边界切分 |
| Table | 表格 | 整表保留或转 Markdown,不参与硬切 |
| ListItem | 列表项 | 尽量与所属小标题一起成块 |
| Header/Footer | 页眉页脚 | 整体过滤,避免混入正文 |
hi_res 精度更高但依赖更重、耗时更长:批量任务先在小样本上估算吞吐与失败率,再决定是否对全量启用,混用两种策略是常见的折中做法。元素自带 metadata 中的页码与文件名要一并写入切片元数据,否则后期引用与排查都缺定位信息。