Skip to content

时间语义实体抽取

dongrixinyu edited this page Oct 31, 2024 · 22 revisions

时间语义实体抽取

这项工作最适合用 LLM 来完成,单纯靠 jio.ner.extract_time 难以满足召回率。

适合的 prompt

prompt 主要包括简洁和详细几种,针对不同的模型和方式。

  • 详细版,适用于直接调用大公司 api,如 gpt、豆包等

     ```
     ”直到8月21日,“股神”的直播号、微信公众号以及APP全部关闭,电话也停机后,全国一百多名股民这才恍然大悟。
     ```
    
     按以下字段抽取上文中的时间实体,
    - time_string:时间实体字符串,即在原文中的形式。
    - complete_time_string:时间实体明确语义的形式,需要结合时间基点来进行确定,如果信息不充分的情况下,保持原字符串即可,不要联想和编造时间实体。
    - time_type: 时间类型,包括
        - time_point:时间点, 即事件发生如果在一刻完成,类型即为时间点;
        - time_span:一段时间, 即事件发生如果持续一段事件,时间实体类型就是该类型;
        - time_delta:时间长度, 即不做时间状语的时间长度表达,如`十七年时间`,`4秒钟`等;
        - time_period:时间周期, 即周期性事件发生时间;
        - time_query:时间问词, 即不确定的时间疑问,如`哪天`, `几月几号` 等;
        - time_other:其它时间类型, 即不属于以上类型的时间实体,一般抽取意义不大。
    - event: 时间对应关联的发生事件,该字段应当尽量简短。
    - parsable: 时间实体是否可解析(可选,如果时间实体可以解析,该字段可以不标出,如果不可解析,则必须标出)
    
    其中,文本的时间基点是 "2024-11-17 18:06:59"。
    返回结果以 json 形式给出,若有多条时间实体,每一条时间实体json占据一行(不格式化),按序给出。
    
  • 输出:

    {"time_string": "8月21日", "complete_time_string": "2022年8月21日", "time_type": "time_point"}

简洁版,适用于微调

 ```
 每次下雨的周末,提醒我检查窗户。
 ```

 按以下字段抽取上文中的时间实体,
- time_string:时间实体字符串
- complete_time_string:时间实体明确语义的形式
- time_type: 时间类型
- event: 时间关联的事件
- parsable: 时间实体是否可解析
以 json 形式返回。其中,文本的时间基点是 "2024-11-17 18:06:59"。
  • 输出:

{"time_string": "每次下雨的周末", "complete_time_string": "每个下雨的周末", "time_type": "time_period", "parsable": false}

数据集说明

抽取哪些时间实体?

抽取的时间实体应当是在句子中充当时间状语的,表达了某一件事发生的时间。比如:

  • 各位观众大家晚上好今天是12月15日(星期三,农历十一月十二),欢迎收看今天的焦点访谈节目,这里,时间实体 今天是12月15日(星期三,农历十一月十二) 应当被抽取出来;

  • 那个,记得喊我一下,大后天上午十点钟整,我给孩子老师打电话。 ,这里 大后天上午十点钟整 应当被抽取出来;

  • 但三年后,也就是1996年,一度申请了破产保护, 其中 三年后 实际上和 1996年 是一个含义,重复含义的时间实体不应当被多次抽取,所以不能被当作时间实体,只保留 1996年 即可,因为这个时间更加明确;

某些文本中包括时间字符串,但这些并非真的指时间,此时需要删除,LLM 不应当返回这种实体。例如,

  • 据《每日经济新闻》记者早前多次调查显示,其中 每日 不能被当作时间实体;

  • 微信图片_20191105103151.jpg 下载附件 保存到相册 7小时前 上传, 其中 20191105 虽然是时间字符串,但它表示的是一个文件名,不能被当作时间实体;

  • “毋忘在莒”2019莒县国际半程马拉松赛事, 其中 2019 指的是一个赛事名,不能被当作时间实体;

  • 工业和信息化部发布《中国区块链技术和应用发展白皮书(2016)》, 其中 2016 不能被当作时间实体;

  • 但三年后,也就是1996年,一度申请了破产保护, 其中 三年后 实际上和 1996年 是一个含义,所以不能被当作时间实体,只保留 1996年 即可;

  • 秦皇岛港煤炭库存持续减少,4月底跌至466万吨,按月下降41%, 其中 按月 是指的一种计算方式,不能被当作时间实体;

  • 也因为有你,从此不再深夜仿徨,其中 深夜 实际上并不具体特指,不能被当作时间实体;

  • 今天的镇江发生了翻天覆地的变化,其中 今天 是虚指,不能被当作时间实体;

  • 截至目前,QDII总规模为855.08亿元,较去年同期902.88亿元的规模同比下滑5.6%。,其中,去年 仅仅修饰数字信息,一词不能被列为实体。但如果真的把该实体当作时间类型抽取出来,那么其类型也必须为 time_other

如何确定时间类型?

需要根据时间实体所描述的事件针对性判断。例如,

  • 国庆节期间原则上不安排大规模的国省干线公路养护施工, 其中,国庆节期间 描述了持续的一段时间,因此类型就是 time_span

  • 截至2019年9月底,全县自种自养达省发展标准贫困户4339户,其中,2019年9月底 虽然是一段模糊的时间,但该句中,实际上指的是一个时间点,因此,时间类型就是 time_point

  • 取得3:30以内完赛成绩的男跑者和取得4:00以内完赛成绩的女跑者,其中,3:304:00 指的是比赛的时间长度,因此类型是 time_delta

  • 11月13日,傅村所民警在义乌将涉嫌盗窃的犯罪嫌疑人邹某抓获。,其中,11月13日 虽然指的是一天的时间,但句子描述的是一个事件的发生时间点,因此类型是 time_point

  • 陈鸿志就在选举那天早上起来把他家门堵住,不让他出来,让他没机会参加选举。,其中,那天早上 指的是一段时间,描述事件也是一个持续的过程,因此类型是 time_span

  • 每一年生产力必须再提升三三%。,其中,每一年 已经涉及到时间周期,因此类型是 time_period

  • 唐军入选2017年福布斯中国30U30金融与风险投资行业代表性人物, 其中,2017 虽然也代表了时间含义,但它并非表示一个时间状语,也就是它不表示一种具体事件发生的时间,因此,类型是 time_other

  • 轮流于每年十月展出四十天。,其中,每年十月time_period 类型,四十天time_delta 类型,时间长度。

  • 张俊,男,汉族,1963年3月出生,安徽濉溪人,其中,1963年3月,虽然长度跨度较长,但它仅指事件发生的时间点,time_point 类型,时间点。

  • 小伙子哪年参加工作的啊?哪年 是一种时间状语,但它属于疑问类型,time_query 类型。

  • 考核不合格者将被清退出乳山市房产销售市场,五年内不许再入市五年内 指的是未来五年内,但是,它指的是一种假定时间,它依赖的时间基点不是固定的,而是基于 被清退出销售市场 的一种抽象假定时间,因此,该时间类型应该是 time_other 类型。

从上面的例子可以看出:

  • time_pointtime_span 类型的差别主要在于所在时间发生的事件,究竟是一刻即发生完,还是整个时间段内持续发生。发生一刻,就是 time_point,持续时间内均有效,则是 time_span 类型。

  • time_spantime_delta 类型的主要差别在于持续时间究竟是否能映射到现实时间轴中。如果指现实当中的一段具体时间段,则是 time_span 类型,如果指的是单纯的一段时间长度,如 5天, 两个半月,则是 time_delta 类型。

如何补全语义不全的实体?

补全语义信息要限定在 JioNLP 时间解析工具 可以解决的范围内,并且模型补全语义,要限定在模型充分信息基础上,不能在信息不充分的时候开始臆想和编造。例如:

  • 时间字符串,今天, 类型为 time_point, 时间基点 2025-01-12,那么,补全后的时间字符串就可以改成 2025年1月12日,或 2025-01-12;因为结合时间基点,日期是完全确定的。

  • 时间字符串,2-3年,类型为 time_delta,时间基点 2014-05-10 08:50:39,那么,该时间字符串不需要补全,原封不动即可,jionlp 解析工具可以处理该类型。

  • 时间字符串,7月以来,类型为 time_span,时间基点为 2004-08-01 19:04:00,那么,该时间字符串可以补全为 2004年7月以来,因为结合时间基点,仅需要补全年份,而年份是完全确定的。

  • 时间字符串,五年内,类型为 time_span,所在句子为 五年内不许再踏入此地一步,时间基点是 2014-07-26 12:57:50。由此可以看出,句子中的时间指的是 未来五年内。因此,年份是确定的,可以将字符串补全为 2014年7月26日至2019年7月26日

  • 时间字符串,去年10月,类型为 time_point,时间基点是 2029-08-07 04:42:12。由此可以看出,句子中语义补全的仅仅是年份,可以补全为 2028年10月

  • 时间字符串,第二天,类型为 time_point ,时间基点是 2024-12-31 20:20:12。可以简单判断,基点为公历2024年最后一天,第二天就是公历2025年第一天,因此可以补全为 2025年1月1日

  • 时间字符串 下半年,类型为 time_span,时间基点为 2007-10-20 08:03:10。由此可以推理,下半年其实是2007年的下半年,可以补全为 2007年下半年

  • 时间字符串 下个周末,类型为 time_point,所在句子为 设定下个周末的露营行程闹钟。,时间基点是 2024-06-10 00:09:37,由此可以看出,计算下一周,以及下一周末其实需要依赖日历查询,因为周信息很难用 LLM 来存储,所以,直接保持该信息固定不变,不进行补全,交由 jionlp 解析工具处理即可。

  • 时间字符串 下周三早上七点钟,类型为 time_point,所在句子是 嘿,小爱,下周三早上七点钟,我要去赶飞机,能帮我设个闹钟吗? 。时间基点是 2024-08-24 21:59:27,由于不确定星期的具体信息,也就无从确定具体是哪一天,因此就无法做到利用模型来推理,所以保持时间实体信息不变,交给jionlp来处理。同理,凡是涉及周的信息,都需要利用规则来解析,不能让大模型来补全。

  • 时间字符串 明年的春分,时间基点是 2029-07-20 14:08:16,由此可以看出,仅需确定是哪一年的春分即可,而春分的具体日期,属于农历,每年会有变动,此时信息不充分,不能判断准确的春分日期,因此需要交由jionlp来处理。由此,可将时间实体补全为 2030年春分。同理,凡是涉及节日、农历等日期,都是不方便进行补全的,保持原样即可。

  • 时间字符串 万圣节那天晚上,句子是 小爱同学,万圣节那天晚上,记得提醒我准备糖果,孩子们会来要糖的。, 时间基点是 2024-05-10 20:28:04,因此可以确定万圣节年份是固定的,即2024年,但具体万圣节是哪一天,不太确定,需要更充分的信息才行,因此,可以将实体补全为 2024年万圣节晚上

  • 时间字符串 下个月最后一天下午6点前,时间基点 2024-09-22 19:04:02,由此可以看出,下个月也就是10月,10月有 31天,下午6点,也就是标准时间 18:00:00 。所以,可以把时间实体补全为 2024年10月31日18:00:00

综上例子可以看出:

  • 当要补全的信息比较固定,比如公历年份、月份,日期等,标准计时等,都可以通过 LLM 自动补全;

  • 当要补全的信息每年都有变动,比如农历月份、日期,节假日等,需要参考额外的信息,此时就保留信息,交给 jionlp 解析器去处理。

对于不可解析的时间实体

有些时间实体,可以抽取,但是不可解析的。因此在返回结果的时候,如果时间实体不可解析,那么就需要多标出一个字段 parsable=False ,但是 如果可以解析,那么就可以忽略不做标出,当然如果标出 parsable=True 也是正确的。

  • 2012年7月的那个月圆之夜,他吻了我,其中,2012年7月的那个月圆之夜 信息不充分,难以确定具体是哪一天,因此,该实体可以抽取为 time_point。但是无法解析,可以标记一个解析字段 parsable=False

  • 后来,他下江闯荡,成了汉口最大的船货商,其中,后来,是时间字符,但信息不充分,不可解析,因此,可以抽取为 time_span,但需要标出 parsable=False

  • 每次月食的时候,提醒我观看,其中,指定时间不明确,需要标出 parsable=False