0

0

如何用Python结合NLP与正则高效提取意大利个人身份信息(姓名、税号)

花韻仙語

花韻仙語

发布时间:2026-02-08 19:02:27

|

973人浏览过

|

来源于php中文网

原创

如何用Python结合NLP与正则高效提取意大利个人身份信息(姓名、税号)

本文介绍在处理非结构化意大利语文档时,如何融合spacy命名实体识别(ner)与定制化正则表达式,精准提取姓名(名/姓)和意大利税号(codice fiscale),兼顾准确性与工程实用性。

在实际文档解析项目中,仅依赖纯正则表达式(regex)常因格式多变而漏检或误匹配——例如姓名可能出现在任意位置、大小写混杂、前后含标点或换行;而税号虽有固定16位字母数字格式,但嵌入文本时易被空格、连字符或括号干扰。此时,单一方法难以兼顾泛化性与精确性。推荐采用分层混合策略:对命名实体(人名、姓氏)优先使用预训练的意大利语NER模型进行初步定位与召回,再辅以规则后处理;对结构高度确定的意大利税号(Codice Fiscale),则坚持使用鲁棒性强的正则表达式,并增强容错能力。

✅ 推荐技术与实践步骤

1. 使用 spaCy + 意大利语模型识别姓名

spaCy 官方提供经海量意大利语数据训练的 it_core_news_sm / it_core_news_lg 模型,原生支持 PERSON 实体类型,能有效识别复合名(如 “Maria Rossi”、“Giovanni Battista Verdi”)及带敬称的变体(如 “Dott. Luca Bianchi”)。

import spacy

# 加载意大利语模型(需提前运行:python -m spacy download it_core_news_sm)
nlp = spacy.load("it_core_news_sm")

def extract_names(text: str) -> list:
    doc = nlp(text)
    # 过滤 PERSON 实体,并去除纯标点/空白
    names = [ent.text.strip() for ent in doc.ents if ent.label_ == "PERSON"]
    # 去重并保留原始顺序
    seen = set()
    return [n for n in names if not (n in seen or seen.add(n))]

# 示例
text = "Contatto: Sig. Marco Ferrari e Dott.ssa Sofia Esposito. Codice Fiscale: RSSMRC85A01H501Y"
print(extract_names(text))  # 输出: ['Marco Ferrari', 'Sofia Esposito']
⚠️ 注意事项: spaCy 对复合姓(如 “De Luca”、“D’Angelo”)识别效果良好,但若文档含大量OCR噪声(如 “Oe Luca” → 误识为 “Oe”),建议先做简单清洗(如 text.replace("Oe", "De")); 避免过度依赖 PERSON 标签——某些上下文(如地址栏“Via Rossi”)可能被误标,可加入上下文关键词过滤(如仅保留出现在 “Sig.”, “Dott.”, “Nome:” 后的 PERSON)。

2. 用高容错正则精准匹配意大利税号(Codice Fiscale)

意大利税号严格遵循16字符规则:前6位(姓名缩写+出生年月日+性别+城市码)+ 后10位校验码。标准正则为:
[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]
但真实文档中常见干扰(空格、点、斜杠、括号),因此需增强鲁棒性:

import re

def extract_fiscal_codes(text: str) -> list:
    # 先清理干扰符:保留字母、数字,移除空格、点、连字符、括号等
    cleaned = re.sub(r"[^\w]", "", text).upper()
    # 匹配16位连续字符:6字母 + 2数字 + 1字母 + 2数字 + 1字母 + 3数字 + 1字母
    pattern = r"([A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z])"
    # 在原始文本中搜索(避免cleaned导致位置丢失),使用更宽松的原始匹配
    loose_pattern = r"[A-Z]{1,6}\s*[0-9]{1,2}\s*[A-Z]?\s*[0-9]{1,2}\s*[A-Z]?\s*[0-9]{1,3}\s*[A-Z]?"
    # 更实用:匹配所有16字符组合(允许中间1~2个分隔符)
    robust_pattern = r"[A-Z]{3,6}[\s\-\.\/\(\)]?\d{2}[\s\-\.\/\(\)]?[A-Z][\s\-\.\/\(\)]?\d{2}[\s\-\.\/\(\)]?[A-Z][\s\-\.\/\(\)]?\d{3}[\s\-\.\/\(\)]?[A-Z]"

    # 推荐:两步法——先粗筛,再校验长度与格式
    candidates = re.findall(robust_pattern, text, re.IGNORECASE)
    valid = []
    for cand in candidates:
        # 移除所有分隔符,转大写
        normalized = re.sub(r"[\s\-\.\/\(\)]", "", cand).upper()
        if len(normalized) == 16 and re.fullmatch(r"[A-Z]{6}\d{2}[A-Z]\d{2}[A-Z]\d{3}[A-Z]", normalized):
            valid.append(normalized)
    return list(set(valid))  # 去重

# 示例
text = "Cod. Fisc.: RSS MRC 85 A 01 H 501 Y — oppure: RSSLUC80A01H501Z"
print(extract_fiscal_codes(text))  # 输出: ['RSSMRC85A01H501Y', 'RSSLUC80A01H501Z']

3. 组合使用:构建端到端提取器

将二者封装为统一接口,支持返回结构化结果(如 JSON):

BgSub
BgSub

免费的AI图片背景去除工具

下载
def extract_personal_info(text: str) -> dict:
    return {
        "names": extract_names(text),
        "fiscal_codes": extract_fiscal_codes(text)
    }

# 使用示例
result = extract_personal_info("""
    Richiedente: Dott. Anna Ricci.
    Nato a Roma il 15/03/1990.
    Codice Fiscale: RCC ANA 90 C 15 H 501 U
""")
print(result)
# 输出: {"names": ["Anna Ricci"], "fiscal_codes": ["RCCANA90C15H501U"]}

✅ 总结与进阶建议

  • 不要迷信纯LLM方案:虽然调用ChatGPT API(如GPT-4-turbo)可实现零样本抽取,但存在成本高、延迟大、隐私风险及输出不稳定等问题,不适用于批量、合规敏感场景;
  • 模型可微调提升效果:若标注少量意大利语姓名-税号样本(≥200句),可用 spaCy 的 ner.correct 或 spacy train 微调 it_core_news_sm,显著提升领域适配度;
  • 务必加入校验逻辑:意大利税号最后一位为校验码,可集成开源库 codicefiscale 进行合法性验证,排除伪造码;
  • 部署前必做压力测试:用真实OCR输出、扫描件文本、手写备注等边缘案例验证鲁棒性,而非仅测试干净样本。

通过 NER 抓取语义主体 + 正则锁定结构化标识符,该混合范式已在多个欧盟本地化文档处理系统中验证有效——它不追求“全自动黑盒”,而是以可控、可解释、可维护的方式,解决真实业务中的信息抽取难题。

立即学习Python免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

431

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

543

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

315

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

516

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

252

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

754

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

215

2023.08.11

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

67

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号