近百个商标名称却没有一个通过好的!

近日遇到朋友要注册商标,给普推知产商标老杨发来一大堆名称,没有一百个也差不多八九十个,都给检索了下,绝大多数是预估通过率低,有些稍好的预估通过率不是很高。

图片

这些起的商标名称主要存在问题,带有产品的通用字词,这样两个字名称相当一个字,四个字名称相当三个字,近似比较多,普推老杨建议前期可以不加所属产品通用词,下证后加在后面也可以。另外都是常见词的组合,现在这样组合基本上别人早想过了,相同及近似也很多。还有朋友想把功效词加在商标名称中,这样的商标名称基本会被直接驳回,最好不要加功效词,有的名称用的是常见口语词,可能会以缺显被驳回。

在起商标名称要想通过率好些,尽量避免使用产品通用词和功效词,还有常见字词组合及口语词,有的名称在前几年可能容易过,但近年来不太好过。

<think> 我们确实可以使用国内的一些优秀OCR服务,例如百度智能云、阿里云、腾讯云等提供的OCR服务,它们对中文的识别效果通常比Tesseract更好。下面我将介绍如何使用百度智能云的OCR服务来解析扫描版PDF。 ### 步骤概述: 1. **注册百度智能云账号并创建OCR应用**:获取API Key和Secret Key。 2. **安装百度AI的Python SDK**:使用pip安装。 3. **将PDF转换为图片**:使用`pdf2image`库。 4. **调用百度OCR接口识别图片中的文字**。 5. **解析识别结果**:提取关键字段。 ### 代码实现: 首先,安装必要的库: ```bash pip install baidu-aip pdf2image ``` 然后,使用以下代码: ```python from aip import AipOcr from pdf2image import convert_from_path import os import time import re # 百度OCR应用的配置信息 APP_ID = '你的App ID' API_KEY = '你的API Key' SECRET_KEY = '你的Secret Key' # 初始化百度OCR客户端 client = AipOcr(APP_ID, API_KEY, SECRET_KEY) class BaiduOCRProcessor: def __init__(self): # 字段映射,同之前 self.field_map = { '产品名称': ['品名', '名称', '物料名称', '产品描述'], '结构式': ['分子式', '化学式', '结构'], 'CAS号': ['CAS', 'CAS NO.', 'CAS编号'], '货号': ['编号', '产品编号', '物料编码', '编码'], '品牌': ['品牌', '原厂品牌', '商标'], '厂家': ['生产厂家', '制造商', '原厂'], '证书': ['资质', '认证', '证书'], '规格': ['包装规格', '规格型号', '型号'], '数量': ['订货数量', '采购数量', '数量'], '单价': ['价格', '报价', '含税单价'], '总价': ['金额', '小计', '总计'], '货期': ['交货期', '交付周期', '生产周期'], '备注': ['说明', '附加信息', '备注'] } def pdf_to_images(self, pdf_path, temp_dir): """将PDF转换为图像列表""" images = convert_from_path( pdf_path, dpi=300, output_folder=temp_dir, fmt='jpeg', thread_count=4 ) return images def recognize_text(self, image_path): """调用百度OCR识别单张图片""" with open(image_path, 'rb') as fp: image = fp.read() # 调用通用文字识别(高精度版) result = client.basicAccurate(image) return result def parse_ocr_result(self, ocr_result): """解析百度OCR返回结果,提取文本""" if 'words_result' not in ocr_result: return "" words_result = ocr_result['words_result'] text = '\n'.join([item['words'] for item in words_result]) return text def process_pdf(self, pdf_path): """处理扫描版PDF文件""" print(f"开始处理PDF: {pdf_path}") start_time = time.time() # 创建临时目录 temp_dir = tempfile.mkdtemp() try: # 将PDF转换为图像 images = self.pdf_to_images(pdf_path, temp_dir) all_text = "" for i, image in enumerate(images): # 保存临时图像 temp_image_path = os.path.join(temp_dir, f"page_{i+1}.jpg") image.save(temp_image_path, 'JPEG') # 识别图像 ocr_result = self.recognize_text(temp_image_path) page_text = self.parse_ocr_result(ocr_result) all_text += page_text + "\n--- 页面分隔符 ---\n" # 解析文本 records = self.parse_text_to_records(all_text) return records finally: # 清理临时文件 import shutil shutil.rmtree(temp_dir) print(f"PDF处理完成: {pdf_path}, 耗时: {time.time()-start_time:.2f}秒") print(f"提取了 {len(records)} 条记录") def parse_text_to_records(self, text): """将识别的文本解析为结构化记录""" # 按页面分隔符分割文本 pages = text.split('--- 页面分隔符 ---') records = [] for page_text in pages: # 按空行分割记录块(假设每个记录块由空行分隔) blocks = re.split(r'\n{2,}', page_text) for block in blocks: record = self.parse_block(block) if record: # 如果解析到有效记录 records.append(record) return records def parse_block(self, block): """解析单个文本块为记录""" record = {} lines = block.split('\n') # 遍历每一行,尝试匹配字段 for line in lines: # 尝试匹配键值对,例如:“产品名称:乙酸乙酯” # 匹配模式:中文键名(可能包含空格)后跟冒号(中文或英文)和值 match = re.search(r'^([\u4e00-\u9fa5\s]+)[::]\s*(.+)$', line) if match: key = match.group(1).strip() value = match.group(2).strip() # 将key映射到标准字段 std_key = self.map_to_standard_field(key) if std_key: record[std_key] = value # 检查记录是否包含必要字段(产品名称和单价/总价) if '产品名称' in record and ('单价' in record or '总价' in record): # 创建物料标识 if '货号' in record and '规格' in record: record['物料标识'] = f"{record['货号']}_{record['规格']}" elif '产品名称' in record and '规格' in record: record['物料标识'] = f"{record['产品名称']}_{record['规格']}" return record return None # 不是有效记录 def map_to_standard_field(self, key): """将识别的字段名称映射到标准字段""" key = key.strip() # 遍历字段映射表 for std_field, aliases in self.field_map.items(): if key in aliases: return std_field # 也可以尝试模糊匹配,例如通过字符串相似度,这里简单返回None return None ``` ### 代码说明: 1. **百度OCR初始化**: ```python client = AipOcr(APP_ID, API_KEY, SECRET_KEY) ``` - 使用百度AI开放平台提供的应用凭证初始化客户端。 2. **PDF转图像**: - 使用`pdf2image`库将PDF每一页转换为图像,保存在临时目录中。 3. **调用百度OCR接口**: ```python result = client.basicAccurate(image) ``` - 使用高精度版接口,适用于扫描文档。 4. **解析OCR结果**: - 百度OCR返回的结果是JSON格式,其中`words_result`是一个包含每行文字及其位置的列表。我们将其合并为文本。 5. **文本解析为结构化记录**: - 将整个文本按页面分割,再按空行分割成记录块。 - 对每个记录块,逐行解析键值对。 - 使用字段映射表将识别出的字段名映射到标准字段。 6. **创建物料标识**: - 与之前相同,使用货号+规格或产品名称+规格创建物料标识,用于后续比价。 ### 注意事项: - **百度OCR服务费用**:百度OCR有免费额度,超出后按量计费,具体请参考百度智能云官网。 - **网络请求**:由于需要调用网络API,处理速度受网络影响。对于大量文件,可能需要异步处理。 - **错误处理**:在实际应用中,应增加重试机制和错误处理。 ### 与其他OCR服务对比 除了百度,还可以考虑: - **阿里云OCR**:同样提供文档识别服务,对表格支持更好。 - **腾讯云OCR**:通用印刷体识别。 这些服务的调用方式类似,都有Python SDK。 §§相关问题§§: 1. 如何处理PDF中复杂表格的识别? 2. 如何提升OCR后文本的结构化解析准确率? 3. 在无法联网的情况下,有哪些离线的中文OCR方案? 4. 如何设计重试机制来处理OCR服务的网络波动? </think> # 优化中文OCR效果:国内最佳方案与实现 针对Tesseract中文识别效果差的问题,国内确实有更优秀的中文OCR解决方案。以下是我精心设计的综合方案,结合了当前国内最先进的OCR技术和优化方法: ## 综合解决方案:多OCR引擎集成 + 深度学习优化 ```python import os import time import base64 import json import requests import numpy as np import cv2 from pdf2image import convert_from_path from paddleocr import PaddleOCR import cnocr from cnocr import CnOcr class AdvancedChineseOCR: def __init__(self): # 初始化多个OCR引擎 self.paddle_ocr = PaddleOCR(use_angle_cls=True, lang="ch") self.cn_ocr = CnOcr() # 百度OCR配置(需要申请API密钥) self.baidu_api_key = "YOUR_BAIDU_API_KEY" self.baidu_secret_key = "YOUR_BAIDU_SECRET_KEY" self.baidu_token = self.get_baidu_token() # 字段映射配置 self.field_map = { '产品名称': ['品名', '名称', '物料名称', '产品描述'], '规格': ['包装规格', '规格型号', '型号'], '数量': ['订货数量', '采购数量', '数量'], '单价': ['价格', '报价', '含税单价'], # 其他字段... } def get_baidu_token(self): """获取百度OCR访问令牌""" token_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={self.baidu_api_key}&client_secret={self.baidu_secret_key}" response = requests.get(token_url) return response.json().get('access_token', '') def preprocess_image(self, image): """高级图像预处理:提高中文识别率""" # 转换为OpenCV格式 img = np.array(image) # 1. 灰度转换 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # 2. 自适应直方图均衡化 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) enhanced = clahe.apply(gray) # 3. 非局部均值去噪 denoised = cv2.fastNlMeansDenoising(enhanced, h=10, templateWindowSize=7, searchWindowSize=21) # 4. 锐化处理 kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]) sharpened = cv2.filter2D(denoised, -1, kernel) return sharpened def recognize_with_paddleocr(self, image): """使用PaddleOCR识别中文文本""" # 转换为OpenCV格式 img = np.array(image) img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # 调用PaddleOCR result = self.paddle_ocr.ocr(img, cls=True) # 提取识别结果 text_lines = [] if result and result[0]: for line in result[0]: if line and line[1]: text_lines.append(line[1][0]) return '\n'.join(text_lines) def recognize_with_cnocr(self, image): """使用CnOCR识别中文文本""" # CnOCR可以直接处理PIL图像 result = self.cn_ocr.ocr(image) return '\n'.join(result) def recognize_with_baidu(self, image): """使用百度OCR API识别文本(在线服务)""" # 将图像转换为base64 buffered = BytesIO() image.save(buffered, format="JPEG") img_base64 = base64.b64encode(buffered.getvalue()).decode() # 调用百度OCR接口 url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={self.baidu_token}" headers = {'Content-Type': 'application/x-www-form-urlencoded'} payload = {'image': img_base64, 'language_type': 'CHN_ENG'} try: response = requests.post(url, headers=headers, data=payload) result = response.json() # 提取识别结果 if 'words_result' in result: text_lines = [item['words'] for item in result['words_result']] return '\n'.join(text_lines) except Exception as e: print(f"百度OCR调用失败: {e}") return "" def ocr_voting(self, image): """多OCR引擎投票机制:综合多个引擎结果提高准确性""" # 获取不同引擎的识别结果 results = [ self.recognize_with_paddleocr(image), self.recognize_with_cnocr(image), self.recognize_with_baidu(image) ] # 简单投票机制:取多数引擎一致的结果 lines = [res.split('\n') for res in results] max_lines = max(len(l) for l in lines) final_result = [] for i in range(max_lines): line_votes = {} for res in lines: if i < len(res): line = res[i].strip() if line: line_votes[line] = line_votes.get(line, 0) + 1 # 选择得票最高的行 if line_votes: best_line = max(line_votes, key=line_votes.get) if line_votes[best_line] > 1: # 至少两个引擎同意 final_result.append(best_line) return '\n'.join(final_result) def parse_pdf(self, pdf_path): """解析扫描版PDF文件""" print(f"开始处理扫描版PDF: {pdf_path}") start_time = time.time() # 将PDF转换为图像 images = convert_from_path(pdf_path, dpi=300) # 处理每页图像 all_text = "" for i, image in enumerate(images): print(f"处理第 {i+1}/{len(images)} 页...") # 图像预处理 processed_img = self.preprocess_image(image) # OCR识别(使用投票机制) page_text = self.ocr_voting(processed_img) all_text += page_text + "\n--- 页面分隔符 ---\n" # 解析识别出的文本 records = self.parse_ocr_text(all_text) print(f"PDF处理完成: {pdf_path}, 耗时: {time.time()-start_time:.2f}秒") print(f"提取了 {len(records)} 条记录") return records def parse_ocr_text(self, text): """解析OCR识别的文本(优化中文处理)""" # 1. 中文文本清洗 cleaned_text = self.clean_chinese_text(text) # 2. 分割文本为记录块 blocks = re.split(r'\n{2,}', cleaned_text) records = [] for block in blocks: # 3. 中文特征检测(跳过页眉页脚) if self.is_header_footer(block): continue # 4. 调用高级中文解析 record = self.parse_chinese_block(block) if record: records.append(record) return records def clean_chinese_text(self, text): """中文文本清洗:处理常见OCR错误""" # 常见OCR错误映射(可根据实际情况扩展) correction_map = { r'[0-9]+\s*[件台套箱瓶包]\s*$': '', # 移除结尾的数量单位 r'(\d{3,})\-(\d{3,})': r'\1-\2', # 修复CAS号中的连字符 r'[O0]{2,}': '00', # 修复连续O/0错误 r'[^a-zA-Z0-9\u4e00-\u9fa5\.,;:()\-]': ' ', # 移除特殊字符 r'\s+': ' ', # 合并多个空格 } cleaned = text for pattern, replacement in correction_map.items(): cleaned = re.sub(pattern, replacement, cleaned) return cleaned def is_header_footer(self, text): """检测页眉页脚(中文特征)""" # 中文页眉页脚常见特征 patterns = [ r'第\s*[0-9一二三四五六七八九十]+\s*页', r'共\s*[0-9一二三四五六七八九十]+\s*页', r'报价单编号\s*:\s*\w+', r'日期\s*:\s*\d{4}年\d{1,2}月\d{1,2}日' ] for pattern in patterns: if re.search(pattern, text[:50]) or re.search(pattern, text[-50:]): return True return False def parse_chinese_block(self, block): """高级中文文本块解析""" # 1. 键值对提取(支持中文冒号) key_value_pairs = {} lines = block.split('\n') # 中文键值对正则(支持:中文键名 + 中文/英文冒号) pattern = r'([\u4e00-\u9fa5]+)\s*[::]\s*([^\n]+)' matches = re.findall(pattern, block) for key, value in matches: std_key = self.map_to_standard_field(key) if std_key: key_value_pairs[std_key] = value.strip() # 2. 表格型数据提取(当键值对不足时) if len(key_value_pairs) < 3: # 尝试表格解析(基于位置对齐) table_pattern = r'(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)' table_matches = re.findall(table_pattern, block) if len(table_matches) > 1: # 假设第一行是表头 headers = table_matches[0] values = table_matches[1] for header, value in zip(headers, values): std_header = self.map_to_standard_field(header) if std_header: key_value_pairs[std_header] = value.strip() # 3. 创建有效记录 if '产品名称' in key_value_pairs and '单价' in key_value_pairs: # 创建物料标识 if '货号' in key_value_pairs and '规格' in key_value_pairs: key_value_pairs['物料标识'] = f"{key_value_pairs['货号']}_{key_value_pairs['规格']}" elif '产品名称' in key_value_pairs and '规格' in key_value_pairs: key_value_pairs['物料标识'] = f"{key_value_pairs['产品名称']}_{key_value_pairs['规格']}" # 数值转换 for field in ['数量', '单价', '总价']: if field in key_value_pairs: # 中文数字转换(如:一万 → 10000) converted = self.convert_chinese_number(key_value_pairs[field]) if converted: key_value_pairs[field] = converted return key_value_pairs return None def map_to_standard_field(self, key): """将识别字段映射到标准字段(支持模糊匹配)""" key = key.strip() # 1. 精确匹配 for std_field, aliases in self.field_map.items(): if key in aliases: return std_field # 2. 模糊匹配(编辑距离) min_distance = float('inf') best_match = None for std_field, aliases in self.field_map.items(): for alias in aliases: distance = self.edit_distance(key, alias) if distance < min_distance and distance <= 2: # 允许最多2个字符差异 min_distance = distance best_match = std_field return best_match def edit_distance(self, s1, s2): """计算两个字符串的编辑距离""" if len(s1) > len(s2): s1, s2 = s2, s1 distances = range(len(s1) + 1) for i2, c2 in enumerate(s2): distances_ = [i2 + 1] for i1, c1 in enumerate(s1): if c1 == c2: distances_.append(distances[i1]) else: distances_.append(1 + min(distances[i1], distances[i1 + 1], distances_[-1])) distances = distances_ return distances[-1] def convert_chinese_number(self, text): """将中文数字转换为阿拉伯数字""" # 中文数字映射 chinese_numbers = { '零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9, '十': 10, '百': 100, '千': 1000, '万': 10000, '亿': 100000000 } # 尝试解析中文数字 if any(char in chinese_numbers for char in text): try: total = 0 current = 0 prev = 0 for char in text: if char in chinese_numbers: value = chinese_numbers[char] if value >= 10: # 单位 if current == 0: current = 1 total += current * value current = 0 else: # 数字 current = value else: # 非中文数字部分,尝试直接转换 return float(re.sub(r'[^\d.]', '', text)) return total + current except: pass # 常规数字清洗 try: return float(re.sub(r'[^\d.]', '', text)) except ValueError: return None ``` ## 解决方案详解 ### 1. 三大中文OCR引擎集成 我集成了当前国内最先进的三种OCR技术: 1. **PaddleOCR(百度开源)** - 目前中文OCR领域的领先开源方案 - 基于深度学习,支持多种文本方向和大角度旋转 - 使用方式:`result = self.paddle_ocr.ocr(img)` 2. **CnOCR(开源中文OCR)** - 专注于中文场景的OCR库 - 对小字号、低质量图片有更好支持 - 使用方式:`result = self.cn_ocr.ocr(image)` 3. **百度OCR API(商业服务)** - 百度智能云提供的商业级OCR服务 - 识别准确率高,支持表格、印章等复杂场景 - 需要申请API密钥(免费额度足够日常使用) ### 2. 多引擎投票机制 ```python def ocr_voting(self, image): """多OCR引擎投票机制""" results = [ self.recognize_with_paddleocr(image), self.recognize_with_cnocr(image), self.recognize_with_baidu(image) ] # ... best_line = max(line_votes, key=line_votes.get) if line_votes[best_line] > 1: # 至少两个引擎同意 final_result.append(best_line) ``` - **优势**:克服单一引擎的局限性,合并多个引擎的结果 - **逻辑**:对每一行文本,选择至少两个引擎一致的结果 - **效果**:显著提高识别准确率,减少错误 ### 3. 高级图像预处理 ```python def preprocess_image(self, image): # 1. 灰度转换 # 2. 自适应直方图均衡化 # 3. 非局部均值去噪 # 4. 锐化处理 ``` - **CLAHE增强**:改善光照不均问题 - **非局部去噪**:有效去除扫描文档中的噪声 - **锐化处理**:增强文字边缘清晰度 ### 4. 中文特色文本处理 ```python def parse_chinese_block(self, block): # 中文键值对正则 pattern = r'([\u4e00-\u9fa5]+)\s*[::]\s*([^\n]+)' # 中文数字转换 converted = self.convert_chinese_number(text) # 模糊字段匹配 distance = self.edit_distance(key, alias) ``` - **中文冒号支持**:同时识别中文(:)和英文(:)冒号 - **中文数字转换**:自动处理"一万两千三百" → 12300 - **模糊匹配**:即使字段名有轻微差异也能正确匹配 ## 安装与配置 1. **安装依赖库**: ```bash pip install pdf2image paddlepaddle paddleocr cnocr requests opencv-python ``` 2. **百度OCR API申请**(可选): - 访问[百度智能云](https://cloud.baidu.com/product/ocr_general) - 创建应用,获取API Key和Secret Key 3. **性能优化建议**: - 对于大批量处理,使用GPU加速PaddleOCR - 设置`dpi=200-300`平衡质量和处理速度 - 启用多线程处理多个PDF文件 ## 替代方案推荐 如果不想使用百度API,以下纯开源方案效果也很好: 1. **PaddleOCR + CnOCR组合**: ```python # 仅使用开源引擎 def ocr_voting(self, image): results = [ self.recognize_with_paddleocr(image),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值