SiameseUIE实操手册:test.py中正则规则扩展支持时间/机构等新实体类型

1. 概述

信息抽取是自然语言处理中的核心任务之一,而SiameseUIE模型在实体抽取方面表现出色。本镜像已经完成了SiameseUIE模型的全流程部署,特别适配系统盘≤50G、PyTorch版本不可修改、重启不重置的受限云实例环境。

无需额外安装任何依赖包,您可以直接使用这个部署好的环境进行人物和地点实体的抽取。模型经过多场景测试验证,能够处理历史人物、现代人物、单地点、多地点以及无实体等多种文本场景,抽取结果直观且无冗余。

2. 环境准备与快速验证

2.1 登录与激活环境

通过SSH登录部署了本镜像的云实例后,系统默认已激活torch28环境。如果遇到环境未激活的情况,只需执行以下命令:

source activate torch28

2.2 运行基础测试

执行以下命令进入模型目录并启动测试:

# 回到上级目录(适配镜像默认路径)
cd ..
# 进入SiameseUIE模型工作目录
cd nlp_structbert_siamese-uie_chinese-base
# 运行测试脚本,验证基础功能
python test.py

运行后会看到模型加载成功的提示,以及5类测试例子的实体抽取结果。权重未初始化的警告属于正常现象,不会影响实际使用效果。

3. 理解test.py的核心结构

3.1 文件组成与作用

test.py是SiameseUIE模型的核心测试脚本,包含以下关键组成部分:

  • 模型加载模块:处理模型和分词器的初始化,屏蔽环境依赖冲突
  • 实体抽取逻辑:实现两种抽取模式(自定义实体模式和通用规则模式)
  • 测试用例集合:内置5类典型测试场景
  • 正则规则系统:支持基础实体类型的识别和抽取

3.2 现有正则规则分析

当前脚本中的正则规则主要针对人物和地点实体:

# 人物识别规则(2-4字中文人名)
person_pattern = r'[\\u4e00-\\u9fa5]{2,4}(?=\\s|\\b|\\p{P})'

# 地点识别规则(包含特定地点关键词)
location_pattern = r'[\\u4e00-\\u9fa5]+?(?:省|市|县|区|城|镇|乡|村|街道)'

这些规则已经能够较好地处理常见的人物和地点实体,但为了支持更多实体类型,我们需要进行扩展。

4. 正则规则扩展实战

4.1 时间实体规则扩展

时间信息在文本中极为常见,添加时间实体识别能极大提升信息抽取的实用性。

# 扩展时间实体识别规则
time_pattern = r'(
    # 年月日格式
    (?:\\d{4}年)?(?:\\d{1,2}月)?(?:\\d{1,2}日)?|
    # 数字+时间单位
    \\d+(?:年|月|日|天|小时|分钟|秒)|
    # 常见时间表述
    (?:今天|明天|昨天|上午|下午|晚上|凌晨)
)'

4.2 机构实体规则扩展

机构名称通常包含特定后缀,利用这一特征可以构建有效的识别规则。

# 扩展机构实体识别规则
organization_pattern = r'(
    # 公司类
    [\\u4e00-\\u9fa5]+?(?:公司|集团|有限公司|有限责任公司)|
    # 政府机构类
    [\\u4e00-\\u9fa5]+?(?:局|部|厅|处|科|办公室)|
    # 教育机构类
    [\\u4e00-\\u9fa5]+?(?:大学|学院|学校|中学|小学)|
    # 医疗机构类
    [\\u4e00-\\u9fa5]+?(?:医院|诊所|卫生院|疾控中心)
)'

4.3 整合扩展规则到抽取函数

将新定义的规则整合到实体抽取函数中:

def extract_with_regex(text, entity_type):
    """
    使用正则规则抽取指定类型的实体
    """
    patterns = {
        '人物': person_pattern,
        '地点': location_pattern,
        '时间': time_pattern,
        '机构': organization_pattern
    }
    
    if entity_type in patterns:
        matches = re.finditer(patterns[entity_type], text)
        return [match.group() for match in matches]
    return []

5. 多实体类型抽取实现

5.1 修改实体抽取逻辑

更新extract_pure_entities函数以支持多实体类型:

def extract_pure_entities(text, schema, custom_entities=None):
    """
    支持多实体类型的抽取函数
    """
    results = {}
    
    for entity_type in schema.keys():
        if custom_entities and entity_type in custom_entities:
            # 使用自定义实体列表
            results[entity_type] = [entity for entity in custom_entities[entity_type] 
                                   if entity in text]
        else:
            # 使用正则规则抽取
            results[entity_type] = extract_with_regex(text, entity_type)
    
    return results

5.2 更新测试用例

添加包含时间和机构实体的测试例子:

test_examples = [
    # 原有测试用例保持不变...
    {
        "name": "扩展测试:时间+机构实体",
        "text": "腾讯公司于2023年发布了年度报告,阿里巴巴集团在去年第一季度业绩表现优异。",
        "schema": {"机构": None, "时间": None},
        "custom_entities": None  # 使用正则规则
    },
    {
        "name": "混合实体类型测试",
        "text": "张三在2023年加入百度公司,李四将于明年入职阿里巴巴集团。",
        "schema": {"人物": None, "时间": None, "机构": None},
        "custom_entities": None
    }
]

6. 完整扩展示例与验证

6.1 扩展后的完整test.py结构

以下是整合了所有扩展功能的脚本结构示意:

import re
import torch
from transformers import BertTokenizer, BertModel

# 屏蔽视觉和检测相关依赖
import sys
sys.modules['torchvision'] = None
sys.modules['detectron2'] = None

# 定义扩展的正则规则
person_pattern = r'[\\u4e00-\\u9fa5]{2,4}'
location_pattern = r'[\\u4e00-\\u9fa5]+?(?:省|市|县|区|城|镇|乡|村|街道)'
time_pattern = r'(?:\\d{4}年)?(?:\\d{1,2}月)?(?:\\d{1,2}日)?|\\d+(?:年|月|日|天|小时|分钟|秒)|(?:今天|明天|昨天|上午|下午|晚上|凌晨)'
organization_pattern = r'[\\u4e00-\\u9fa5]+?(?:公司|集团|有限公司|有限责任公司|局|部|厅|处|科|办公室|大学|学院|学校|中学|小学|医院|诊所|卫生院|疾控中心)'

# 实体抽取函数(支持多类型)
def extract_with_regex(text, entity_type):
    # 实现如前文所示

def extract_pure_entities(text, schema, custom_entities=None):
    # 实现如前文所示

# 模型加载和测试代码
def main():
    # 模型加载代码
    print("✅ 分词器+模型加载成功!")
    
    # 测试例子集合(包含扩展的测试用例)
    test_examples = [
        # 原有测试用例
        {
            "name": "例子1:历史人物+多地点",
            "text": "李白出生在碎叶城,杜甫在成都修建了杜甫草堂,王维隐居在终南山。",
            "schema": {"人物": None, "地点": None},
            "custom_entities": {"人物": ["李白", "杜甫", "王维"], "地点": ["碎叶城", "成都", "终南山"]}
        },
        # 新增扩展测试用例
        {
            "name": "扩展测试:时间+机构实体",
            "text": "腾讯公司于2023年发布了年度报告,阿里巴巴集团在去年第一季度业绩表现优异。",
            "schema": {"机构": None, "时间": None},
            "custom_entities": None
        }
    ]
    
    # 执行测试
    for i, example in enumerate(test_examples, 1):
        print(f"========== {i}. {example['name']} ==========")
        print(f"文本:{example['text']}")
        
        results = extract_pure_entities(
            text=example["text"],
            schema=example["schema"],
            custom_entities=example.get("custom_entities")
        )
        
        print("抽取结果:")
        for entity_type, entities in results.items():
            if entities:
                print(f"- {entity_type}:{', '.join(entities)}")
        print("----------------------------------------")

if __name__ == "__main__":
    main()

6.2 验证扩展效果

运行扩展后的脚本,您应该能看到类似以下的输出:

✅ 分词器+模型加载成功!

========== 1. 例子1:历史人物+多地点 ==========
文本:李白出生在碎叶城,杜甫在成都修建了杜甫草堂,王维隐居在终南山。
抽取结果:
- 人物:李白, 杜甫, 王维
- 地点:碎叶城, 成都, 终南山
----------------------------------------

========== 2. 扩展测试:时间+机构实体 ==========
文本:腾讯公司于2023年发布了年度报告,阿里巴巴集团在去年第一季度业绩表现优异。
抽取结果:
- 机构:腾讯公司, 阿里巴巴集团
- 时间:2023年, 去年
----------------------------------------

7. 高级扩展技巧

7.1 处理复杂时间表达式

对于更复杂的时间表达式,可以进一步扩展时间规则:

# 增强版时间识别规则
enhanced_time_pattern = r'(
    # 完整日期格式
    \\d{4}年\\d{1,2}月\\d{1,2}日|
    # 相对时间表述
    (?:最近|近期|日前|即将|计划)|
    # 时间段表述
    \\d+(?:个)?(?:月|周|天|小时)内|
    # 季度表述
    (?:第一|第二|第三|第四)季度
)'

7.2 提高机构识别准确率

通过添加排除规则减少误识别:

# 改进的机构识别(添加上下文约束)
improved_org_pattern = r'(
    # 前置约束:避免普通词语被误识别
    (?<!的)(?<!之)(?<!和)(?<!与)
    # 机构主体
    [\\u4e00-\\u9fa5]{2,10}?
    # 机构后缀
    (?:公司|集团|有限公司|局|部|厅|大学|学院|医院)
    # 后置约束:避免匹配后续文字
    (?!的)(?!是)(?!有)
)'

8. 总结

通过本文的实操指南,您已经学会了如何在SiameseUIE模型的test.py脚本中扩展正则规则,以支持时间、机构等新实体类型。关键要点包括:

  1. 规则设计原则:基于实体特征设计精准的正则表达式,平衡召回率和准确率
  2. 渐进式扩展:从简单规则开始,逐步添加复杂模式和处理边界情况
  3. 多场景验证:使用多样化的测试用例确保扩展功能的可靠性
  4. 性能考量:在保证准确性的前提下,注意正则表达式的效率影响

扩展实体类型后,SiameseUIE模型的信息抽取能力得到了显著增强,能够处理更丰富的文本内容和更复杂的应用场景。您可以根据实际需求,继续扩展其他实体类型,如货币、百分比、专业术语等。

实践中建议持续收集和分析抽取结果,不断优化正则规则,提升实体识别的准确性和覆盖范围。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐