在交通事故处理中,数据的准确性与完整性至关重要。传统上,交通事故报告通常以 PDF 格式呈现,这使得手动提取数据成为一项繁琐且容易出错的任务。随着人工智能与数据处理技术的发展,如何自动化这一过程并提升数据质量,成为了一个重要的研究方向。
在这篇博客中,我将分享一个基于 Python 的智能交通事故报告解析系统,它结合了 PDF 文本解析、AI 大模型分析以及数据标准化与导出功能。这一系统能够从交通事故报告中提取关键信息,并将其标准化为统一格式,最终导出为可用的 Excel 文件或 JSON 数据,为后续的数据分析与决策提供坚实基础。
项目概述
本项目的核心目标是通过以下几步自动化交通事故报告数据的处理:
- PDF 文本解析:从 PDF 文件中提取文本内容。
- AI 模型分析:利用大语言模型对事故报告进行智能分析,自动提取关键字段。
- 数据标准化:将提取的字段进行标准化处理,确保数据一致性。
- 结果导出:将处理后的数据导出为 Excel 或 JSON 格式,以便后续使用。
这四个步骤贯穿了整个流程,从数据提取到数据导出都实现了自动化,并确保了数据的质量与一致性。
1. PDF 文件解析:提取文本信息
PDF 文件由于其固定格式,给数据提取带来了不少挑战。幸运的是,pdfplumber
这一 Python 库能够高效地从 PDF 中提取文本。以下是我们在代码中用到的核心方法:
import pdfplumber
def extract_cases_from_text(text):
"""
从完整文本中提取每个事故案例
"""
pattern = r"\d+[\.:]\sARB Number:.*?(?=\d+[\.:]\sARB Number:|$)"
cases = re.findall(pattern, text, re.DOTALL)
logger.info(f"共提取到 {len(cases)} 个事故案例")
return cases
在这段代码中,正则表达式被用来从整个报告中提取每个单独的事故案例。通过这种方式,我们可以确保从 PDF 中提取的每个案例都是完整的,便于后续分析。
2. AI 模型分析:自动化提取关键信息
通过与通义千问大语言模型的结合,我们可以自动化地将事故报告转化为标准化的 JSON 数据。这一过程的核心是 analyze_with_qwen()
方法,它调用了大语言模型 API,并传递给它一个包含事故数据的文本块:
def analyze_with_qwen(self, text_block):
"""
调用通义千问大模型,将文本转换为标准JSON格式
"""
try:
response = dashscope.Generation.call(
"qwen-max",
messages=[{
'role': 'user',
'content': (
'请将以下交通事故报告数据转换为标准的JSON字典格式,一定要确保所有字段完整且准确。'
'固定字段包括:ARB Number, Severity, Site, TD Site, Police Grid, Police Map Grid, Time, '
'Natural Light, Road Condition, Weather, At or Near, Acc. CF, Precise Location, How it happened。'
'其中ARB Number 作为唯一的主键。'
'另外,请提取所有涉及的车辆和伤亡信息,使用Vehicle_1, Vehicle_2,… 和 Casualty_1, Casualty_2,… 的格式。'
'每辆车的字段包括:Vehicle No., Class, Age, Collided with, Manoeuvre, Dri. CF, Veh. CF。'
'每个伤亡的字段包括:Casualty No., Role, Age, Injury, Location, Bound, Cas. CF。'
'请仅返回纯JSON格式的数据,不要包含任何额外的文本或标记。'
'以下是事故报告数据:\n' + text_block
)
}],
api_key=self.api_key,
result_format='message'
)
AI 模型通过解析交通事故的描述性文本,自动识别出如 ARB Number、Severity、Vehicles 和 Casualties 等关键信息,并返回结构化的 JSON 数据。
3. 数据标准化:统一字段格式
一旦模型提取了数据,接下来的任务是确保这些数据的一致性。我们使用了字段标准化的方法,将所有数据统一格式化为一个标准化的 JSON 结构。以下是相关代码:
def standardize_fields(parsed_data):
"""
根据 FIXED_FIELDS 和 POSSIBLE_SUFFIX_FIELDS 标准化字段
"""
standardized_data = {}
# 添加固定字段
for field in FIXED_FIELDS:
standardized_data[field] = parsed_data.get(field, "N/A")
# 处理车辆信息
vehicles = parsed_data.get("Vehicles", "N/A")
standardized_data["Vehicles"] = vehicles if vehicles else "N/A"
# 处理伤亡信息
casualties = parsed_data.get("Casualties", "N/A")
standardized_data["Casualties"] = casualties if casualties else "N/A"
# 处理 Police Grid 为空的情况
if not standardized_data.get("Police Grid") or standardized_data["Police Grid"].strip() == "":
police_map_grid = parsed_data.get("Police Map Grid", "")
if police_map_grid.strip():
standardized_data["Police Grid"] = police_map_grid.strip()
logger.info("从Police Map Grid填充Police Grid字段")
else:
standardized_data["Police Grid"] = "N/A"
logger.warning("Police Grid和Police Map Grid均为空,填充为 'N/A'")
return standardized_data
这段代码确保了所有的固定字段都被填充,并且对车辆信息和伤亡信息进行了标准化处理。此外,如果 Police Grid
字段为空,还会自动尝试从 Police Map Grid
中获取数据。
4. 数据导出:从 JSON 到 Excel
将处理后的数据导出为 Excel 格式,是本项目的另一个重要功能。我们使用了 pandas
库来处理这一操作:
def export_flattened_json_to_excel(flattened_data, output_excel_path):
"""
将扁平化后的JSON数据导出为Excel文件。
"""
# 创建DataFrame
df = pd.json_normalize(flattened_data)
# 确保固定列的顺序
df = df.reindex(columns=fixed_columns_order)
# 导出到Excel
df.to_excel(output_excel_path, index=False, engine='openpyxl')
logger.info(f"成功将数据导出到 {output_excel_path}")
通过这一方法,我们能够将最终的数据保存为 Excel 文件,并确保所有列按照固定的顺序排列,缺失的数据会被填充为 N/A
。
总结
通过将 PDF 文件解析、AI 智能分析、数据标准化和结果导出这四个步骤结合,我们实现了一个高效的交通事故报告自动处理系统。这不仅大大提升了工作效率,还确保了数据的准确性和一致性。在未来,随着 AI 技术的不断进步,自动化数据处理将会变得更加智能和精准,为各种领域的数据分析提供强大的支持。
你可以如何利用这个系统?
- 交通事故数据管理:自动化地从事故报告中提取并标准化数据,节省大量的人工录入工作。
- 决策支持:通过结构化的数据,可以更好地进行事故原因分析、事故模式识别等数据驱动的决策。
- 报告生成与统计:将提取的结构化数据导出为 Excel 或 JSON,方便生成定期报告,支持进一步的统计分析。