2. 时间感知的实体识别:实体抽取中的时间属性、时间表达式归一化、实体对齐中的时间约束

好,咱们进入第二个核心话题。时间感知的实体识别。

说实话,很多做知识图谱的朋友,一开始都忽略了时间这个维度。他们觉得,实体就是实体,张三就是张三,公司就是公司。但我在实际项目中踩过坑之后才发现——没有时间标签的实体,就像没有身份证的人,你根本不知道它什么时候有效,什么时候失效。

2.1 实体抽取中的时间属性

先问一个问题:你抽取出来的“CEO”这个实体,它永远都是CEO吗?

当然不是。马化腾1998年是CEO,2023年还是CEO吗?他早就退居二线了。所以,每个实体关系,都应该带上时间戳

我个人习惯把时间属性分为三类:

  • 有效时间:这个实体或关系在现实世界中成立的时间段。比如“张三担任CEO”这个事实,有效时间是2010-2020年。
  • 事务时间:这条数据被录入到数据库的时间。比如我今天才把张三的离职信息录入系统,事务时间就是今天。
  • 业务时间:业务场景中定义的时间。比如财报中的“报告期”,就是业务时间。

重点来了:在风控场景中,有效时间是最关键的。你拿2019年的工商信息去判断2023年的企业风险,那不出事才怪。

我在项目中遇到过这样一个案例:某企业2018年变更了法人,但我们的知识图谱没有记录时间戳。结果2022年做贷后检查时,系统还在给原法人推送风险预警。嗯,这显然是个大乌龙。

2.2 时间表达式归一化

实体抽取时,时间表达式的写法五花八门。你想想看:

  • “去年三月”
  • “2023年3月”
  • “2023-03”
  • “三月份”
  • “3个月前”

这些其实都指向同一个时间点。但计算机不认识“去年”、“三个月前”这种相对表达。所以,归一化是必须的

我常用的归一化策略是这样的:

原始表达式 归一化结果 说明
去年三月 2023-03 相对时间转绝对时间
2023年3月 2023-03 中文格式标准化
2023-03-15 2023-03-15 ISO格式保留
三月份 XXXX-03 缺少年份,需上下文推断
3个月前 2024-01 基于当前时间计算

避坑指南:我曾经在处理“三月份”这种表达式时,直接默认填充了当前年份。结果发现很多历史文档中的“三月份”其实是2018年的。后来我加了一条规则——如果上下文中有明确的年份信息,优先使用上下文中的年份。

代码实现上,我一般用正则+规则引擎来做第一轮归一化。遇到模糊的,再交给模型去推理。

import re
from datetime import datetime, timedelta

def normalize_time_expression(text, context_year=None):
    """
    时间表达式归一化
    """
    # 处理"去年"、"今年"、"明年"
    now = datetime.now()
    year = context_year if context_year else now.year
    
    if '去年' in text:
        year = year - 1
        text = text.replace('去年', f'{year}年')
    elif '今年' in text:
        text = text.replace('今年', f'{year}年')
    elif '明年' in text:
        year = year + 1
        text = text.replace('明年', f'{year}年')
    
    # 处理"X个月前"
    match = re.search(r'(\d+)个月前', text)
    if match:
        months = int(match.group(1))
        target_date = now - timedelta(days=months*30)
        text = text.replace(match.group(0), target_date.strftime('%Y-%m'))
    
    # 统一格式为 YYYY-MM-DD
    # ... 更多规则
    
    return text

2.3 实体对齐中的时间约束

实体对齐,说白了就是判断两个实体是不是同一个东西。但加上时间约束后,事情就变得有趣了。

举个例子:

  • 知识图谱A中:张三,2010-2020年担任A公司CEO
  • 知识图谱B中:张三,2021-2023年担任B公司CEO

这两个“张三”是同一个人吗?

从名字上看,是的。但从时间上看,他担任CEO的公司不同,而且时间不重叠。所以,时间约束可以帮助我们做更精准的对齐

我总结了几条时间约束规则:

  1. 时间不重叠原则:同一个实体在同一时间点,不能有两个冲突的属性值。比如一个人不能同时是两家公司的法人。
  2. 时间连续性原则:某些属性应该是连续的。比如一个人的出生日期,不会变来变去。
  3. 时间顺序原则:事件的发生顺序必须合理。比如“入职”必须在“离职”之前。

注意:时间约束不是绝对的。有些场景下,一个人确实可以同时担任多家公司的法人。所以,约束规则要结合业务场景来设定,不能一刀切。

下面这张图,是我自己画的一个时间感知实体对齐的流程。你看一眼就明白了。

时间感知实体对齐流程 实体A(带时间戳) 实体B(带时间戳) 时间属性提取 时间表达式归一化 时间约束检查 对齐/不对齐 时间不重叠? 时间连续? 时间顺序合理?

你看,整个流程其实不复杂。核心就是:先提取时间,再归一化,最后用约束做判断

我记得有一次做企业工商信息对齐,两个数据源都指向同一家公司,但成立日期差了1天。一个写的是2010-03-15,另一个写的是2010-03-16。如果不用时间约束,系统就会认为这是两家不同的公司。但加上“允许1天误差”的约束后,它们就被正确对齐了。

嗯,这就是时间感知的魅力。它让实体识别不再是一个静态的快照,而是一个动态的、有生命力的过程。

总结一句话:时间不是实体的附属品,而是实体的灵魂。没有时间,实体就是一具空壳。

专注资料整理