数量英文完整示例:3个实战项目攻克翻译难题
数量英文完整示例:3个实战项目攻克翻译难题 看了一堆教程还是不会写项目?这是很多刚接触编程或自然语言处理(NLP)的朋友最真实的写照。你背熟了单词,理解了语法,但一旦要把“3个苹果”这种带有数量关系的英文文本转换成结构化数据,或者在电商系统中准确解析商品描述,瞬间就卡壳了。别慌,问题不在于你不够努力,而在于缺少一个完整示例作为骨架。 今天不聊虚的,直接上干货。我们将通过三个由浅入深的实战项目,彻底搞懂“数量英文”在工程中的处理逻辑。从最基础的字符串解析,到结合正则表达式的自动化清洗,再到利用Python库进行半结构化提取,每一步都给你最扎实的代码实现。目标只有一个:让你看完就能跑,跑完就能用。 项目目标:定义“数量英文”的工程边界 在动手之前,我们必须明确:在编程语境下,“数量英文”到底指什么?它不仅仅是“one, two, three”这些单词,更包括数字与英文量词的复杂组合,如“two hundred units”、“a dozen eggs”甚至“3.5 kilograms”。 我们的核心目标不是做一个完美的翻译机,而是构建一个能够稳定提取文本中“数量+单位”结构的小工具。这在实际开发中极为常见:电商订单解析:用户输入“2箱牛奶,5瓶水”,后端需要拆解为 {product: 'milk', qty: 2, unit: 'box'}。 日志清洗:从服务器日志中提取“Allocated 4 GB memory”中的资源配额。 库存管理:处理供应商传来的非标准格式库存报表。这三个场景共同点在于:数据源是自然语言或半结构化文本,但我们需要的是机器可读的数值和单位。接下来的三个项目,将分别对应这三个复杂度的场景。 目录结构:搭建可复用的工程骨架 很多新手喜欢把所有代码扔进一个 main.py 里,这在学习阶段没问题,但一旦进入实战,维护噩梦就开始了。我们采用标准的模块化结构,确保代码可复用、易测试。 创建如下目录结构: quantity_english/ ├── data/ │ └── test_samples.txt # 存放测试用的原始文本数据 ├── utils/ │ ├── __init__.py │ ├── number_parser.py # 负责将英文单词转换为数字 │ └── unit_mapper.py # 负责单位词的同义词映射 ├── core/ │ ├── __init__.py │ └── extractor.py # 核心提取逻辑,调用utils模块 ├── main.py # 入口文件,运行三个项目 └── tests/└── test_extractor.py # 单元测试这种结构的好处是:职责分离。number_parser 只关心“two”变成2,“thirty”变成30;unit_mapper 只关心“kg”、“kilogram”、“kgs”都映射到标准的“kilogram”。当需求变更时,比如增加新的单位支持,你只需要修改 unit_mapper.py,而不需要动核心提取逻辑。 核心代码实现:从正则到语义映射 这是最关键的部分。我们将分三步走,逐步构建完整示例。 第一步:基础正则提取(项目一) 最直观的方法是使用正则表达式匹配“数字+空格+单词”的模式。虽然简单,但能跑通90%的简单场景。 import redef extract_basic_quantities(text):基础提取:匹配 [数字] [英文单词] 的组合# 匹配模式:一个或多个数字,后跟一个空格,再跟一个或多个字母pattern = r'(\d+)\s+([a-zA-Z]+)'matches = re.findall(pattern, text)results = []for num_str, unit_str in matches:# 简单清洗:将单位转为小写unit = unit_str.lower()results.append({'quantity': int(num_str),'unit': unit})return results# 测试用例 sample_1 = I have 5 apples and 3 oranges. print(extract_basic_quantities(sample_1)) # 输出: [{'quantity': 5, 'unit': 'apples'}, {'quantity': 3, 'unit': 'oranges'}]避坑指南:这个正则有个致命弱点,它无法处理“two apples”这种纯英文数字,也无法处理“3.5 kg”这种小数。但在处理机器生成的、格式相对固定的日志时,它足够快且轻量。 第二步:英文数字转数值(项目二) 当用户输入“two hundred boxes”时,上面的代码就失效了。我们需要一个模块将英文单词转换为阿拉伯数字。这里我们不引入庞大的NLP库,而是手写一个轻量级的映射逻辑,既高效又可控。 在 utils/number_parser.py 中: class NumberParser:def __init__(self):# 基础数字映射self.number_map = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5,'six': 6, 'seven': 7, 'eight': 8, 'nine': 9, 'ten': 10,'eleven': 11, 'twelve': 12, 'thirteen': 13, 'fourteen': 14,'fifteen': 15, 'sixteen': 16, 'seventeen': 17, 'eighteen': 18,'nineteen': 19, 'twenty': 20, 'thirty': 30, 'forty': 40,'fifty': 50, 'sixty': 60, 'seventy': 70, 'eighty': 80, 'ninety': 90,'hundred': 100, 'thousand': 1000}self.current_value = 0self.total_value = 0def parse_english_number(self, text):解析英文数字文本,如 'two hundred and five' - 205self.current_value = 0self.total_value = 0words = text.lower().replace(' and ', ' ').split()for word in words:if word in self.number_map:value = self.number_map[word]if value 100:self.current_value += valueelif value == 100:if self.current_value == 0:self.current_value = 1 # 处理 'hundred'self.current_value *= valueelse: # thousandif self.current_value == 0:self.current_value = 1self.current_value *= valueself.total_value += self.current_valueself.current_value = 0# 累加剩余的部分self.total_value += self.current_valuereturn self.total_value# 测试 parser = NumberParser() print(parser.parse_english_number(two hundred)) # 输出: 200 print(parser.parse_english_number(fifty)) # 输出: 50注意:这个实现是简化的,适用于常见场景。在生产环境中,如果涉及极其复杂的数字表述,建议参考 inflect 或 word2number 等成熟库,但理解底层逻辑对你调试问题至关重要。 第三步:单位标准化映射(项目三) “kg”、“kgs”、“kilogram”、“kilograms”在业务上是同一个概念。如果数据库里存的是“kg”,而用户输入“kilograms”,直接匹配会失败。我们需要一个标准化层。 在 utils/unit_mapper.py 中: class UnitMapper:def __init__(self):# 定义同义词组,第一个值为标准名self.synonyms = {'kg': ['kg', 'kgs', 'kilogram', 'kilograms', 'kilos'],'g': ['g', 'gs', 'gram', 'grams'],'box': ['box', 'boxes', 'carton', 'cartons'],'unit': ['unit', 'units', 'piece', 'pieces', 'pcs']}# 构建反向映射:{同义词: 标准名}self.reverse_map = {}for std, syns in self.synonyms.items():for syn in syns:self.reverse_map[syn] = stddef normalize_unit(self, unit_str):将任意单位字符串转换为标准单位如果无法识别,返回原字符串的小写形式if not unit_str:return Noneunit_lower = unit_str.lower()return self.reverse_map.get(unit_lower, unit_lower)# 测试 mapper = UnitMapper() print(mapper.normalize_unit(Kilograms)) # 输出: kg print(mapper.normalize_unit(Boxes)) # 输出: box print(mapper.normalize_unit(Unknown)) # 输出: unknown运行与测试:验证你的完整示例 现在,我们将所有模块整合到 core/extractor.py 中,形成一个完整的提取器。 import re import sys sys.path.append('..') # 确保能导入utilsfrom utils.number_parser import NumberParser from utils.unit_mapper import UnitMapperclass QuantityExtractor:def __init__(self):self.num_parser = NumberParser()self.unit_mapper = UnitMapper()# 增强正则:匹配 [数字或英文数字] [单位]# 这里简化处理,主要匹配纯数字或常见的英文数字组合# 实际生产中,正则可能更复杂,需要预处理self.pattern = r'((?:\d+\.?\d*)|(?:\w+\s+)?(?:\w+\s+)?(?:\w+))\s+([a-zA-Z]+)'def extract(self, text):matches = re.findall(self.pattern, text)results = []for num_part, unit_part in matches:# 尝试解析数字qty = self._parse_quantity(num_part)if qty is None:continue# 标准化单位std_unit = self.unit_mapper.normalize_unit(unit_part)results.append({'quantity': qty,'unit': std_unit,'raw': f{num_part} {unit_part}})return resultsdef _parse_quantity(self, text):text = text.strip().lower()# 1. 尝试直接转int/floattry:if '.' in text:return float(text)return int(text)except ValueError:pass# 2. 尝试英文解析# 简单启发式:如果包含已知数字单词,则尝试解析if any(word in text for word in self.num_parser.number_map):return self.num_parser.parse_english_number(text)return None# 主程序入口 if __name__ == __main__:extractor = QuantityExtractor()test_cases = [Order 5 boxes of milk,I need two hundred eggs,Weight is 3.5 kilograms,Send 10 units immediately]for case in test_cases:print(fInput: {case})result = extractor.extract(case)print(fResult: {result}\n)运行结果预期: 对于 I need two hundred eggs,程序会先尝试转int失败,然后调用 NumberParser 解析出 200,再调用 UnitMapper 将 eggs 映射(假设未定义则保留原样,或需补充 egg 到映射表)。 测试建议:不要只测快乐路径。一定要测试边界情况:全大写输入:FIVE BOXES 多余空格:5 boxes 无单位输入:5 干扰文本:I love apples. Buy 5.优化扩展:从玩具到生产级 上述代码是一个很好的起点,但要用于生产环境,还需考虑以下几点:性能优化: 如果文本量极大(如百万级日志),每次创建 NumberParser 对象会有开销。可以将 NumberParser 设计为单例,或者将常用的英文数字映射缓存起来。容错机制: 如果正则匹配到了错误的组合怎么办?例如 5 star rating,这里 star 不是单位。需要引入一个单位白名单。只有当匹配到的单位在白名单中时,才视为有效的数量-单位对。 # 在 UnitMapper 中增加白名单校验 def is_valid_unit(self, unit_str):return unit_str in self.reverse_map.keys()多语言支持: 虽然本篇聚焦英文,但同样的架构可以扩展到中文。只需替换 NumberParser 为中文数字解析逻辑,UnitMapper 为中文单位映射即可。核心提取逻辑(正则+映射)保持不变。数据持久化: 将提取结果写入数据库或CSV文件。使用 pandas 库可以轻松将 results 列表转换为 DataFrame 并导出,便于后续分析。权威参考:在处理英文数字和单位的标准化时,建议参考 MDN Web Docs 中关于字符串处理的API文档,以及 Unicode Standard 中关于数字字符的定义。虽然MDN主要面向Web,但其对字符串规范的处理逻辑对Python字符串操作也有很好的借鉴意义,特别是在处理Unicode字符集时。 小结:从教程到项目的跨越 回顾这三个项目,我们完成了一次从“知道”到“做到”的跨越。项目一 让你理解了正则表达式在文本提取中的基本作用。 项目二 让你掌握了如何将非结构化的英文数字转化为机器可理解的数值。 项目三 让你学会了如何通过映射表解决同义词歧义问题,这是数据清洗的核心技能。完整示例 的价值不在于代码本身,而在于它展示了解决问题的思维路径:拆解问题 - 模块化实现 - 集成测试 - 优化扩展。 很多应届生在面试中被问到“如何从非结构化文本中提取数据”,往往只能背出“用正则”或“用NLP库”。而如果你能像今天这样,清晰地讲出“我会先定义单位白名单,然后编写英文数字解析器,最后通过单元测试覆盖边界情况”,面试官会立刻意识到:你不仅懂代码,更懂工程。 这个知识点你面试被问过吗?留言说说

相关新闻

3分钟搞定最近中文字幕视频2019一页实战项目避坑指南

3分钟搞定最近中文字幕视频2019一页实战项目避坑指南

3分钟搞定最近中文字幕视频2019一页实战项目避坑指南 看着满屏红色的 StackTrace,是不是感觉脑子像被塞进了水泥?别慌,这就像工地上的脚手架没搭稳,看着吓人,其实只要找到受力点,一推就直。很多新手在跑这个名为“最近中文字幕视频20…

2026/9/22 4:33:57 阅读更多 →
星之海洋2性能优化踩坑实录:3个致命Bug让你少熬3夜

星之海洋2性能优化踩坑实录:3个致命Bug让你少熬3夜

星之海洋2性能优化踩坑实录:3个致命Bug让你少熬3夜 版本升级后 API 全变了,代码跑起来却慢得像蜗牛。很多老哥在重构星之海洋2相关模块时,第一反应是“怎么这么卡”,第二反应是“是不是我电脑不行”。别怪硬件,问题出在你没看懂新版底层逻辑…

2026/9/22 4:33:57 阅读更多 →
5种方法解决img文件怎么打开,附最佳实践避坑指南

5种方法解决img文件怎么打开,附最佳实践避坑指南

5种方法解决img文件怎么打开,附最佳实践避坑指南 刚学完代码,拿到一个 .img 文件却打不开?别慌,这不是你的错。 很多开发者都栽在这上面: 学会语法却不知怎么搭项目 。你以为 img 就是网页里那个 <img>…

2026/9/22 4:32:57 阅读更多 →

最新新闻

3招手写实现提速法,搞定如何提高做题速度

3招手写实现提速法,搞定如何提高做题速度

3招手写实现提速法,搞定如何提高做题速度 刚毕业那会儿,我盯着 LeetCode 题目发呆,Python 语法背得滚瓜烂熟,但一遇到“实现 LRU 缓存”或者“手写 Promise”就脑子空白。这不是你笨,是 学会语法却不知怎么搭项目…

2026/9/22 5:02:14 阅读更多 →
腾讯助手官方下载避坑速查手册:3个致命错误让你少踩10年

腾讯助手官方下载避坑速查手册:3个致命错误让你少踩10年

腾讯助手官方下载避坑速查手册:3个致命错误让你少踩10年 官方文档往往厚达数百页,新手翻两页就晕,根本抓不住重点。我在一线摸爬滚打十年,见过太多人因为“腾讯助手官方下载”这个看似简单的动作,导致项目延期、环境崩溃甚至数据丢失。今天这份…

2026/9/22 5:02:14 阅读更多 →
换边实战指南:3个坑点教你搞定完整示例

换边实战指南:3个坑点教你搞定完整示例

换边实战指南:3个坑点教你搞定完整示例 复制来的代码跑不通,报错信息一堆红字,是不是瞬间头大? 别慌,这通常是环境配置或逻辑细节没对齐。…

2026/9/22 5:02:13 阅读更多 →
lolig队员面试必问:3个核心源码解析避开StackTrace报错

lolig队员面试必问:3个核心源码解析避开StackTrace报错

lolig队员面试必问:3个核心源码解析避开StackTrace报错 满屏红色的StackTrace像天书一样砸在脸上,你甚至分不清哪行是业务代码,哪行是框架内部抛出的。这种崩溃感,每个被【lolig队员】这类小众技术标签“背刺”过的开发者…

2026/9/22 5:02:13 阅读更多 →
3个致命坑:步距角配置错误导致电机抖动,源码解析避坑指南

3个致命坑:步距角配置错误导致电机抖动,源码解析避坑指南

3个致命坑:步距角配置错误导致电机抖动,源码解析避坑指南 刚升级完运动控制库版本,发现电机一通电就狂抖,甚至发出刺耳的啸叫?别慌,这大概率不是硬件坏了,而是你被 步距角 的新 API…

2026/9/22 5:02:13 阅读更多 →
3天搞定逗拍下载:手写实现核心逻辑,避开90%新手坑

3天搞定逗拍下载:手写实现核心逻辑,避开90%新手坑

3天搞定逗拍下载:手写实现核心逻辑,避开90%新手坑 看了一堆教程还是不会写项目?别慌,问题不在你笨,而在你一直在“抄”代码,没在“懂”原理。今天聊的 逗拍下载…

2026/9/22 5:01:13 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事&#xff1a;用Flutter给OpenHarmony做一款游戏集合类的App&#xff0c;说白了就是把若干小游戏塞进一个壳里&#xff0c;用统一入口分发。这个方向本身不算新鲜&#xff0c;真正让我花了不少心思的&#xff0c;是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档&#xff0c;最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事&#xff1a;今天在表后面多加了两个空白行&#xff0c;明天给客户交稿前发现整个章节的编号全部错位&#xff0c;光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年&#xff0c;说实话&#xff0c;第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年&#xff0c;流量惨淡、功能臃肿、代码自己都懒得看第二遍之后&#xff0c;我才慢慢琢磨明白一个道理&#xff1a;第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →