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天。一个写的是2010-03-15,另一个写的是2010-03-16。如果不用时间约束,系统就会认为这是两家不同的公司。但加上“允许1天误差”的约束后,它们就被正确对齐了。
嗯,这就是时间感知的魅力。它让实体识别不再是一个静态的快照,而是一个动态的、有生命力的过程。
总结一句话:时间不是实体的附属品,而是实体的灵魂。没有时间,实体就是一具空壳。