You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用spaCy拆分提取句子中的独立日期实体

解决spaCy提取日期时将日期范围识别为单个实体的问题

你遇到的情况是spaCy默认NER模型把30 June 2019 to 1 January 2022整个识别成了一个DATE实体,而你需要拆分出两个独立的日期。下面提供两种可行的解决方法:

方法1:手动拆分已识别的DATE实体

既然spaCy会把连续的日期范围合并为单个实体,我们可以在提取后检查实体文本中是否包含to(注意前后空格,避免误分割其他含"to"的文本),如果存在就拆分后分别加入结果列表。

修改后的代码:

def extract_dates_with_year(text):
    doc = nlp(text)
    dates_with_year = []
    for ent in doc.ents:
        if ent.label_ == "DATE":
            # 检查是否包含日期范围分隔符" to "
            if " to " in ent.text:
                # 拆分后将每个日期添加到列表
                dates_with_year.extend(ent.text.split(" to "))
            else:
                dates_with_year.append(ent.text)
    return dates_with_year

测试该函数后,目标文本的返回结果为['30 June 2019', '1 January 2022'],符合预期。

方法2:用spaCy Matcher自定义匹配规则

如果需要更通用的日期提取逻辑(不依赖"to"这类连接词),可以使用spaCy的Matcher定义单独日期的匹配模式,直接定位符合格式的独立日期片段。

示例代码:

from spacy.matcher import Matcher

def extract_dates_with_year(text):
    doc = nlp(text)
    matcher = Matcher(nlp.vocab)
    # 定义匹配规则:数字 + 首字母大写的月份(专有名词) + 4位年份
    pattern = [
        {"POS": "NUM"},
        {"POS": "PROPN", "IS_TITLE": True},
        {"POS": "NUM", "LENGTH": 4}
    ]
    matcher.add("DATE_PATTERN", [pattern])
    matches = matcher(doc)
    
    dates_with_year = []
    for match_id, start, end in matches:
        span = doc[start:end]
        dates_with_year.append(span.text)
    return dates_with_year

这种方法直接匹配数字+月份+4位年份的格式片段,不管中间的连接词是什么,都能精准提取独立日期。

内容的提问来源于stack exchange,提问作者Muhammad Kamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:32:03