2、数据采集与格式识别:常见向量数据来源与格式解析

数据采集这件事,说白了就是搞清楚两件事:数据从哪来,以及数据长什么样。我在做向量数据清洗项目时,发现很多同学一上来就急着写代码,结果加载到一半才发现格式不对,或者字段类型跟预期完全不一样。嗯,这其实挺浪费时间的。

这一节,我们就来聊聊向量数据的常见来源,以及怎么快速识别和解析它们的格式。我个人习惯是:先摸清格式,再动手处理。这样能省掉后面至少一半的麻烦。

2.1 向量数据的三大来源

向量数据不是凭空产生的。它通常来自三种模态的数据:文本、图像和音频。每种模态的数据,在采集和预处理时都有各自的坑。

核心观点:向量数据的质量,90% 取决于原始数据的采集方式。采集阶段如果出了问题,后面再怎么清洗也很难补救。

2.1.1 文本数据

文本是最常见的向量数据来源。比如新闻文章、用户评论、技术文档、聊天记录等。这些文本经过分词、向量化后,就变成了我们需要的向量。

文本采集的常见方式有:

  • API 接口:从社交媒体、新闻平台等获取结构化文本
  • 爬虫抓取:从网页中提取正文内容
  • 本地文件:读取 CSV、JSON、TXT 等格式的文本文件
  • 数据库导出:从关系型或 NoSQL 数据库中导出文本字段

我的经验:我曾经处理过一个用户评论数据集,采集时没注意编码格式,结果大量中文变成了乱码。后来我养成了一个习惯——采集文本数据后,第一件事就是检查编码。UTF-8 是首选,但有些老系统还在用 GBK 或 Latin-1。

2.1.2 图像数据

图像数据经过卷积神经网络等模型提取特征后,会变成高维向量。这些向量常用于图像检索、人脸识别、物体检测等场景。

图像采集的常见方式:

  • 摄像头实时采集:监控视频流、手机拍照等
  • 公开数据集:ImageNet、COCO、CIFAR 等
  • 网络爬取:从搜索引擎或图床下载
  • 本地存储:读取 JPEG、PNG、BMP 等格式的图片文件

注意:图像数据的采集要特别关注分辨率和色彩空间。我见过一个项目,因为采集的图像分辨率不一致,导致向量化后的特征维度对不上,最后不得不重新采样。建议在采集阶段就统一目标分辨率,比如 224x224 或 512x512。

2.1.3 音频数据

音频数据通过声学特征提取(如 MFCC、Mel 频谱)或深度学习模型(如 wav2vec)转换为向量。常用于语音识别、说话人识别、情感分析等。

音频采集的常见方式:

  • 麦克风录制:实时语音采集
  • 音频文件:WAV、MP3、FLAC 等格式
  • 流媒体截取:从直播或录音中截取片段
  • 公开语音库:LibriSpeech、Common Voice 等

避坑指南:我曾经处理过一个音频数据集,采集时没注意采样率,有的文件是 16kHz,有的是 44.1kHz。结果提取特征时,时间窗口长度对不上,导致向量维度不一致。后来我强制要求所有音频统一重采样到 16kHz。你想想看,这种细节如果不注意,后面清洗起来真的很头疼。

2.2 常见数据格式解析

数据采集回来后,我们需要把它加载到内存中。不同的数据格式,解析方式和性能差异很大。我个人习惯根据数据量和应用场景来选择格式。

下面这张图展示了三种常见格式的适用场景和核心特点:

常见向量数据格式对比 JSON ✅ 可读性强 ✅ 支持嵌套结构 ❌ 解析慢,体积大 ❌ 不适合大数据量 CSV ✅ 结构简单 ✅ 通用性强 ❌ 不支持嵌套 ❌ 类型信息丢失 Parquet ✅ 列式存储 ✅ 压缩率高 ✅ 支持复杂类型 ❌ 可读性差 推荐使用场景 • JSON:小规模数据、配置文件、API 交互 • CSV:表格数据、简单向量、跨平台交换 • Parquet:大规模向量、数据仓库、分布式计算 • 我的建议:向量数据量超过 10 万条,优先考虑 Parquet

2.2.1 JSON 格式

JSON 是 Web 领域最通用的数据格式。它的可读性好,支持嵌套结构,非常适合存储带有元数据的向量数据。

一个典型的 JSON 向量数据长这样:

{
  "id": "vec_001",
  "vector": [0.12, 0.34, 0.56, 0.78, 0.90],
  "metadata": {
    "source": "news_article",
    "timestamp": "2024-01-15T10:30:00Z",
    "category": "technology"
  }
}

加载 JSON 数据时,我推荐使用 Python 的 json 标准库,或者 pandas 的 read_json() 方法。

import json
import pandas as pd

# 方式一:标准库加载
with open('vectors.json', 'r') as f:
    data = json.load(f)

# 方式二:pandas 加载
df = pd.read_json('vectors.json', orient='records')
print(df.head())

注意:JSON 文件如果包含大量向量数据,解析速度会明显变慢。我曾经处理过一个 2GB 的 JSON 文件,加载花了将近 5 分钟。后来我把它转成了 Parquet 格式,加载时间降到了 10 秒以内。所以,JSON 适合小规模数据,大规模数据建议换格式。

2.2.2 CSV 格式

CSV 是最简单的表格格式。它的优点是通用性强,几乎任何工具都能打开。但缺点也很明显——不支持嵌套结构,而且类型信息会丢失。

一个 CSV 向量数据示例:

id,vector,source,timestamp
vec_001,"[0.12,0.34,0.56,0.78,0.90]",news_article,2024-01-15
vec_002,"[0.23,0.45,0.67,0.89,0.11]",social_media,2024-01-16

加载 CSV 数据时,要注意向量字段的解析。因为 CSV 把向量存成了字符串,我们需要手动转换:

import pandas as pd
import ast

df = pd.read_csv('vectors.csv')

# 将字符串形式的向量转换为列表
df['vector'] = df['vector'].apply(ast.literal_eval)

print(df.info())

我的经验:CSV 的向量字段最好用引号括起来,否则逗号会被误认为字段分隔符。我曾经因为这个原因,解析出来的向量总是少几个维度,排查了半天才发现是 CSV 解析的问题。你想想看,这种低级错误真的很坑。

2.2.3 Parquet 格式

Parquet 是列式存储格式,专为大数据场景设计。它的压缩率高,支持复杂数据类型,而且读取速度极快。我个人强烈推荐在大规模向量数据场景中使用 Parquet。

加载 Parquet 数据非常简单:

import pandas as pd

# 读取 Parquet 文件
df = pd.read_parquet('vectors.parquet')

# 查看数据概览
print(df.head())
print(df.dtypes)

Parquet 的优势在于:

特性 JSON CSV Parquet
存储方式 行式 行式 列式
压缩率 低 低 高(可压缩 70-80%)
读取速度 慢 中等 快(列裁剪)
类型支持 丰富 仅字符串 丰富(含向量类型)
适用场景 小规模、配置 简单表格 大规模、数据仓库

核心建议:如果你的向量数据量超过 10 万条,或者需要频繁读取,Parquet 是最优选择。它不仅能节省存储空间,还能大幅提升读取性能。我在一个项目中,把 500GB 的 JSON 数据转成 Parquet 后,存储降到了 120GB,读取速度提升了 20 倍。

2.3 数据加载与预览

数据加载完成后,第一件事不是急着清洗,而是预览数据。我习惯先看看数据长什么样,有没有明显的异常。

预览数据时,我会关注以下几点:

  • 数据量:总共有多少条记录?
  • 字段类型:每个字段的类型是否正确?向量字段是不是列表类型?
  • 缺失值:有没有空值或 NaN?
  • 数据范围:向量的值是否在合理范围内?比如文本向量通常在 [-1, 1] 之间。
  • 重复数据:有没有完全相同的记录?

下面是一个快速预览的代码示例:

import pandas as pd

# 加载数据
df = pd.read_parquet('vectors.parquet')

# 1. 查看数据量
print(f"总记录数: {len(df)}")

# 2. 查看字段类型
print("\n字段类型:")
print(df.dtypes)

# 3. 查看前 5 行
print("\n前 5 行数据:")
print(df.head())

# 4. 检查缺失值
print("\n缺失值统计:")
print(df.isnull().sum())

# 5. 查看向量字段的统计信息
vector_col = 'vector'
if vector_col in df.columns:
    # 假设向量是列表类型,计算每个维度的均值
    vector_array = np.array(df[vector_col].tolist())
    print(f"\n向量维度: {vector_array.shape[1]}")
    print(f"向量值范围: [{vector_array.min():.4f}, {vector_array.max():.4f}]")

避坑指南:我曾经加载一个 CSV 文件时,发现向量字段的类型是字符串,而不是列表。这是因为 CSV 不支持复杂类型,向量被存成了类似 "[0.12, 0.34, ...]" 的字符串。如果你不手动转换,后面做向量运算时会直接报错。所以,预览数据时一定要检查字段类型,尤其是向量字段。

2.4 本章小结

数据采集与格式识别,是整个向量数据清洗流程的第一道关卡。我个人觉得,这一步花的时间越多,后面清洗和建模就越顺利。

记住几个关键点:

  • 文本、图像、音频是向量数据的三大来源,每种都有各自的采集注意事项
  • JSON 适合小规模数据,CSV 通用但类型信息丢失,Parquet 是大规模数据的最佳选择
  • 数据加载后一定要预览,检查数据量、字段类型、缺失值和数据范围
  • 向量字段的类型转换是常见坑点,尤其是从 CSV 或 JSON 加载时