讲师中心 微信公众号
AI工具推荐 视频效率加速

如何标准化网络爬取数据中的混合单位并转换为统一数值格式

星萱君_3047

星萱君_3047

发布时间:2026-06-03 13:17:07

|

648人浏览过

|

来源于php中文网

原创

如何标准化网络爬取数据中的混合单位并转换为统一数值格式

本文介绍在数据爬取后、写入 mongodb 前,如何系统性地将含混杂单位(如 "$ 75 thousand"、"600 gm")的字符串字段标准化为统一单位(如 usd、grams),并解析为数值类型,强调预处理优先原则及可扩展的脚本化方案。

本文介绍在数据爬取后、写入 mongodb 前,如何系统性地将含混杂单位(如 "$ 75 thousand"、"600 gm")的字符串字段标准化为统一单位(如 usd、grams),并解析为数值类型,强调预处理优先原则及可扩展的脚本化方案。

在构建数据管道时,单位标准化必须发生在入库前——MongoDB 本身不提供字段级单位自动识别、转换或规范化功能。它是一个无模式文档数据库,仅负责存储原始值(如字符串 "$ 1.2 Lakh" 或 "15 Kgs"),不会执行语义解析或单位换算。因此,标准化逻辑必须由爬虫层或 ETL 预处理阶段承担。

核心策略:分步标准化 + 数值解析

标准化过程可分为两个关键阶段:

  1. 文本归一化(Normalization):清洗格式(空格、逗号、大小写)、统一单位符号(如 "Kg" → "kg"、"gm" → "g");
  2. 语义解析与换算(Parsing & Conversion):识别数量级(Thousand, Lakh, Kgs, mg)并转换为基准单位数值。

以下以 Python 风格伪代码 + 可落地的正则+映射方案为例(适用于 Norconex、Scrapy、自研爬虫等):

import re

# 单位映射表(按字段维度定义)
UNIT_CONVERSIONS = {
    "amount": {
        r'(?i)thousand': 1e3,
        r'(?i)lakh': 1e5,     # 1 Lakh = 100,000
        r'(?i)million': 1e6,
        r'(?i)crore': 1e7,    # 印度常用,1 Crore = 10,000,000
        r'[^\d.]': '',        # 移除非数字字符(保留小数点和数字)
    },
    "weight": {
        r'(?i)kg|kgs': 1e3,   # kg → grams
        r'(?i)g|gs|gram|grams': 1.0,
        r'(?i)mg|milligrams': 1e-3,
        r'(?i)ton|tonne': 1e6, # metric ton → grams
        r'[^\d.]': '',
    }
}

def standardize_field(value: str, field: str) -> float:
    if not isinstance(value, str):
        return 0.0

    # 步骤1:提取纯数字部分(含小数点)
    num_part = re.sub(r'[^\d.]', '', value)
    if not num_part or '.' in num_part and len(num_part.split('.')[0]) > 10:
        return 0.0

    try:
        base_value = float(num_part)
    except ValueError:
        return 0.0

    # 步骤2:匹配并应用单位倍率
    multiplier = 1.0
    for pattern, factor in UNIT_CONVERSIONS.get(field, {}).items():
        if re.search(pattern, value):
            multiplier = factor
            break

    # 步骤3:返回标准化数值(例如:"$ 75 Thousand" → 75000.0)
    return round(base_value * multiplier, 2)

# 使用示例
print(standardize_field("$ 75 Thousand", "amount"))   # → 75000.0
print(standardize_field("600 gm", "weight"))         # → 600.0
print(standardize_field("25 Kgs", "weight"))         # → 25000.0
print(standardize_field("1.2 Lakh", "amount"))       # → 120000.0

在 Norconex 爬虫中集成(推荐方案)

若使用 Norconex Web Crawler,ScriptTagger 是最灵活的选择,可直接嵌入上述逻辑(支持 Groovy/JavaScript):

<handler class="ScriptTagger">
  <script><![CDATA[
    def amountStr = metadata.getString('amount')
    if (amountStr) {
      // 复用上面的解析逻辑(Groovy 兼容 Java 正则与数学运算)
      def multiplier = 1.0
      if (amountStr.toLowerCase().contains('thousand')) multiplier = 1000
      else if (amountStr.toLowerCase().contains('lakh')) multiplier = 100000
      // ... 其他规则

      def num = amountStr.replaceAll(/[^0-9.]/, '') as Double
      metadata.set('amount_normalized', num * multiplier)
      metadata.set('amount_unit', 'USD') // 显式记录单位
    }

    def weightStr = metadata.getString('weight')
    if (weightStr) {
      def multiplier = 1.0
      if (weightStr.toLowerCase().matches('.*kg.*')) multiplier = 1000
      else if (weightStr.toLowerCase().matches('.*gm|g.*')) multiplier = 1
      else if (weightStr.toLowerCase().matches('.*mg.*')) multiplier = 0.001

      def num = weightStr.replaceAll(/[^0-9.]/, '') as Double
      metadata.set('weight_grams', num * multiplier)
      metadata.set('weight_unit', 'grams')
    }
  ]]></script>
</handler>

✅ 关键优势:ScriptTagger 支持完整编程逻辑,可复用单位表、异常处理、日志输出,且修改不影响爬虫核心流程。

注意事项与最佳实践

  • 永远保留原始字段:写入 MongoDB 时,同时保存 amount_raw: "$ 1.2 Lakh" 和 amount_usd: 120000.0,便于审计与纠错;
  • 地域单位需显式配置:Lakh/Crore 主要在南亚使用,Thousand/Million 为国际通用,建议按目标市场动态加载单位词典;
  • 避免浮点精度陷阱:对金额类字段,考虑使用整数分(cents)存储,或引入 Decimal 类型(Python)/ BigDecimal(Java);
  • MongoDB 不替代 ETL:不要依赖 $convert 或聚合管道做实时单位转换——它无法理解 "Thousand" 的语义,仅能处理已知格式(如 "1234.56" → double);
  • 测试覆盖边界情况:如 "15,000 gm"(含千位逗号)、"$ 75.5 Thousand"(带小数)、"N/A"(缺失值)需有 fallback 机制。

综上,单位标准化是数据质量的第一道闸门。通过在爬虫阶段嵌入轻量、可维护的脚本化解析器(如 Norconex 的 ScriptTagger),配合结构化单位映射表,即可高效、可靠地将异构字符串转化为统一数值,确保 MongoDB 中存储的是语义清晰、可计算、可分析的高质量数据。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

40

2026.10.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

140

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

140

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

100

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

100

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

120

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

320

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

220

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

180

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL优化视频教程—布尔教育
MySQL优化视频教程—布尔教育

共24课时 | 8万人学习

UNI-APP开发(仿饿了么)
UNI-APP开发(仿饿了么)

共32课时 | 10万人学习

Uniapp微信小程序1:1仿饿了么首页
Uniapp微信小程序1:1仿饿了么首页

共5课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn