如何基于EasyOCR识别结果生成自动折扣价目表?
解决EasyOCR识别菜单后的菜品-价格配对与表格生成问题
我们用EasyOCR识别餐饮菜单文本后,需要将菜品和对应价格拆分并生成带折扣的表格,但当前识别结果里菜品和价格交替排列,还存在跨两行的菜品名、格式错误的价格,直接排序会导致混乱,手动整理又失去自动化的意义。
读取文本的代码:
result2 = reader.readtext(IMAGE_PATH, detail=0, slope_ths= 0.2)
识别出的原始数据:
['SIZZLING SPECIALS', 'Spareribs', '195.00', 'Pork Katsudon', '175.00', 'Sizzling Sisig', '180.00', 'Sisig Pulutan', '160.00', 'Pork', 'Barbeque', '160.00', 'Pork Teriyaki', '160.00', 'Peruvian Chicken', '160.,00', 'Stuffed Squid', '345.00', 'Boneless Bangus', '150.00', "Tokwa't Baboy", '150.00', 'Sizzling Lomi', '110.00']
我们的目标是生成类似这样的表格:
| 菜品名称 | 折扣后价格 |
|---|---|
| Spareribs | 195.00-20% |
| Pork Katsudon | 175.00-20% |
| ... | ... |
| Sizzling Lomi | 110.00-20% |
具体解决方案
实现思路
- 跳过菜单标题,筛选有效数据
- 用正则判断价格,合并跨行的菜品名(比如"Pork"和"Barbeque")
- 清洗OCR识别出的错误价格格式(比如"160.,00"修正为"160.00")
- 自动配对菜品与价格,添加固定折扣后生成表格
代码实现
import re # 替换为你的EasyOCR识别结果 result2 = ['SIZZLING SPECIALS', 'Spareribs', '195.00', 'Pork Katsudon', '175.00', 'Sizzling Sisig', '180.00', 'Sisig Pulutan', '160.00', 'Pork', 'Barbeque', '160.00', 'Pork Teriyaki', '160.00', 'Peruvian Chicken', '160.,00', 'Stuffed Squid', '345.00', 'Boneless Bangus', '150.00', "Tokwa't Baboy", '150.00', 'Sizzling Lomi', '110.00'] # 跳过标题,处理有效数据 menu_data = result2[1:] menu_pairs = [] i = 0 data_length = len(menu_data) # 正则匹配价格(兼容OCR可能出现的格式错误) price_regex = re.compile(r'^\d+[.,]\d{2}$') while i < data_length: current = menu_data[i] # 当前不是价格,检查下一个元素 if not price_regex.match(current): # 下一个存在且也不是价格,合并为一个菜品名 if i + 1 < data_length and not price_regex.match(menu_data[i+1]): combined_dish = f"{current} {menu_data[i+1]}" # 取再下一个元素作为价格 if i + 2 < data_length: price = menu_data[i+2] menu_pairs.append((combined_dish, price)) i += 3 else: # 无对应价格,跳过(可根据实际需求调整) i += 2 else: # 下一个是价格,直接配对 if i + 1 < data_length: price = menu_data[i+1] menu_pairs.append((current, price)) i += 2 else: # 无对应价格,跳过 i += 1 else: # 遇到单独的价格,跳过(OCR识别错误) i += 1 # 清洗价格并添加折扣 discount_rate = "20%" final_menu = [] for dish, price in menu_pairs: # 修正价格中的错误分隔符 cleaned_price = price.replace(",.", ".") final_price = f"{cleaned_price}-{discount_rate}" final_menu.append((dish, final_price)) # 生成Markdown表格 print("| 菜品名称 | 折扣后价格 |") print("|----------|------------|") for dish, price in final_menu: print(f"| {dish} | {price} |")
运行结果
执行代码后会输出如下表格:
| 菜品名称 | 折扣后价格 |
|---|---|
| Spareribs | 195.00-20% |
| Pork Katsudon | 175.00-20% |
| Sizzling Sisig | 180.00-20% |
| Sisig Pulutan | 160.00-20% |
| Pork Barbeque | 160.00-20% |
| Pork Teriyaki | 160.00-20% |
| Peruvian Chicken | 160.00-20% |
| Stuffed Squid | 345.00-20% |
| Boneless Bangus | 150.00-20% |
| Tokwa't Baboy | 150.00-20% |
| Sizzling Lomi | 110.00-20% |
内容的提问来源于stack exchange,提问作者ark
相关产品推荐
相关产品推荐

