如何在 Python 中从德语文本中提取日期和时间表达式?

问题描述 投票:0回答:1

我想从德语的非结构化书面文本中提取日期和其他时间表达式,包括诸如

  • 'Es ist der 1. Januar 2020.'
  • 'Gestern hat es geschneit.'
  • 'Heute Abend ab 18 Uhr eine Stunde'
  • '2023-02-28'
  • '4 Tage ab Montag'
  • 'Bis 20.03.2023'
  • 'Von Donnerstag den 18. bis zum 21. Mai'
  • 'Samstag 18.03.'
  • '2023-03-15.' 我想提取的其他时间表达式包括
  • 'nächste Woche'
  • 'im letzten Monat'
  • 'in 2 Stunden'
  • 等等。

我按照 本指南 进行命名实体识别,并将测试用例应用于以下 python 包:

  • spaCy 模型(de_core_news_md、de_core_news_lg、de_dep_news_trf、en_core_web_lg)
  • spaCy_stanza (
    nlp = spacy_stanza.load_pipeline("de", package="hdt")
    )
  • 约会者
  • htmldate,读完这篇说服文章
  • dateutil 解析器(和其他解析器)

为了比较,我使用谷歌翻译翻译了上述指南中的英文文本。然后我对文本以及给定的文本片段执行了不同的工具。

英语 spaCy 模型 en_core_web_lg 能够找到 596 个日期和时间表达式,包括“2020 年 1 月 1 日”等特定日期以及“下一个十年”和“圣诞假期”等更笼统的表达式。它还可以识别时间段,例如“1989 年夏天”和“1950 年代初期”,以及“四个星期后”、“六个月后”和“两天后”等相关表达。

但是,我无法让德语 spaCy 模型识别翻译文本或上面给出的文本片段中的单个日期或时间表达式。我将翻译保存在本地文件中,它易于阅读,包含字符串片段,如“im Jahr 1907”和“Zwischen 1994 und 1998”。只是为了检查,我在终端上打印了一个摘录并检查了类型,是 。有趣的是,英语 spaCy 模型能够识别德语文本中的 333 个日期!其他包 spacy_stanza、datefinder 和 htmldate 也无法识别德语文本中的任何日期。

这是我使用的基本设置:

nlp = spacy.load("de_core_news_lg")
doc = nlp(text)
for ent in filter(lambda e: e.label_=='DATE',doc.ents):
    print(ent.text)

分配给上述请求日期的标签:

1. ADJA adjective, attributive
Januar NN noun, singular or mass
2020. NE proper noun
Gestern ADV adverb
21. ADJA adjective, attributive
Mai NN noun, singular or mass
heute ADV adverb

查阅 spaCy 文档后,我注意到德语单词列表 de_core_news_lg 不包含任何日期或其他时间表达式的 NER 标签。为了确认这一点,我使用以下代码检索了可用标签列表:

for label in label_list:
  print(label, spacy.explain(label))

(不幸的是,

PDAT
标签原来是
attributive demonstrative pronoun
。)与英语单词列表相比,德语单词列表中唯一可用的NER相关标签是
LOC
MISC
ORG 
,和
PER
。因此,四个德语 spaCy 单词列表都不适合识别日期或时间表达式。

在 stackoverflow 上的类似线程中,建议使用正则表达式。正则表达式可能是一种有效的方法,尽管它仅限于涵盖的日期格式。不过,我读到 NLTK 提供了一种正则表达式方法,我可以将其包含在最终解决方案中(连同一些 NER 模型训练)。现在我正在寻找 Python 中的解决方案,它可以达到与英语文本的英语模型相当的效率。

总而言之,应用的 NER 方法无法识别日期,因为它们缺少特定的 NER 标签。但是,我发现用于英语日期识别的 en_core_web_lg 模型能够检测到英语文本中的日期,而在德语文本中检测到大约一半的日期。

目前,我能想到的最好的解决方案是将文本翻译成英文,并使用英文模型进行日期识别。但是,这将是一种解决方法。

python date nlp spacy named-entity-recognition
1个回答
0
投票

根据 de_core_news_lg SpaCy 文档,德语模型不包含受支持的 NER 标签的“DATE”标签,而英语 en_core_web_lg 确实包含它。

解决方案可能是创建自定义命名实体识别 (NER)。使用自定义 NER,您可以创建自己的标签。因此,您将能够自己创建“DATE”标签。您可以在线找到大量关于如何设置此类模型的教程,并且可以在 此链接 上找到相关文档。这种方法的缺点是您需要自己训练自定义 NER,这将非常耗时并且需要训练数据集。请注意,这是一个全新的模型,它不会检测 de_core_news_lg 中存在的标签。

如果您还需要 de_core_news_lg 模型中的标签,您可以尝试结合本教程中解释的两个训练模型。

Prodigy是一个很好的获取训练数据集的工具,是SpaCy的开发者开发的产品。但是,它不是免费的。如果不想花钱,什么都可以自己做。

© www.soinside.com 2019 - 2024. All rights reserved.