如何基于textract提取的文本列表识别Word文档中的完整地址块?
识别非固定模板地址块的实现方案
输入文档示例(翻译后)
一些段落内容1 员工地址:A·约翰·多伊先生 黑客大道9号 美国某州 2192 电话:1411567323 传真:- 邮箱:someemail@gmail.com 一些段落内容2 下一页 一些段落内容3
期望输出(翻译后)
员工地址:A·约翰·多伊先生 黑客大道9号 美国某州 2192 电话:1411567323 传真:- 邮箱:someemail@gmail.com
可行实现思路
1. 定位地址块的起止边界
- 找起始点:遍历提取的文本行,优先定位带「员工地址:」这类明确标识的行作为地址块起点;如果没有明确标识,就找「电话、传真、邮编」等关键词密集出现的起始行。
- 判断终点:当遇到空行之后的普通段落(既不含地址关键词,也不符合地址格式),或者连续两行非地址内容时,停止收集。
2. 判断行内容是否属于地址块
对于起始行之后的每一行,满足任意一条就归为地址块:
- 包含「电话、传真、邮箱、街道、邮编、州」等地址相关关键词;
- 符合地址常见格式:纯数字(邮编)、带数字的街道名、含@的邮箱、纯数字电话号码;
- 前一行属于地址块且当前行非空(处理地址换行拆分的情况)。
3. 合并与格式化
把收集到的所有行合并成单个字符串,还可以按需求给子行添加缩进(比如示例中的格式)。
代码示例(Python)
# 假设textract提取的文本列表为text_lines text_lines = [ "一些段落内容1", "", "员工地址:A·约翰·多伊先生", "黑客大道9号", "美国某州", "2192", "电话:1411567323", "传真:- ", "邮箱:someemail@gmail.com", "", "一些段落内容2", "下一页", "一些段落内容3" ] address_keywords = {"员工地址:", "电话:", "传真:", "邮箱:", "街道", "邮编", "州"} address_block = [] collecting = False for line in text_lines: line_stripped = line.strip() if not line_stripped: if collecting: address_block.append(line) continue # 触发地址块收集 if "员工地址:" in line: collecting = True address_block.append(line) continue if collecting: is_address = False # 检查关键词 if any(k in line for k in address_keywords): is_address = True # 检查格式 elif "@" in line: is_address = True elif line_stripped.isdigit(): is_address = True elif any(c.isdigit() for c in line_stripped): is_address = True # 处理换行的地址内容 elif len(address_block) > 0 and address_block[-1].strip() != "": is_address = True if is_address: # 给子行加缩进(排除起始行和邮箱行) if not (address_block[0] == line or "邮箱:" in line): address_block.append(" " + line) else: address_block.append(line) else: collecting = False # 合并为单个字符串 full_address = "\n".join(address_block) print(full_address)
内容的提问来源于stack exchange,提问作者NaN
相关产品推荐
相关产品推荐

