1

我有一个包含几篇新闻文章(Text_4)的数据集(df_test)。使用 SpaCy,我提取了“日期”实体。对于那些我想查看与文章的发布日期(RP_DateFormatted)相比它们是在未来还是过去(以识别引用未来事件(例如产品发布)的新闻文章)的人

我目前的代码是

for index, row in df_test.iterrows():
doc = nlp(row.Text_4)
entities = {key: list(g) for key, g in groupby(sorted(doc.ents, key=lambda x: x.label_), lambda x: x.label_)}

...一些其他步骤...然后:

        ListDATE3 = [dateparser.parse(replace_all((i.text), od), languages=['en'],
                 settings={'RELATIVE_BASE': datetime.strptime(row.RP_DateFormatted, '%Y-%m-%d'),
                           'PREFER_DAY_OF_MONTH': 'last',
                           'PREFER_DATES_FROM': 'future'}) for i in entities['DATE']]
        df_test.PY_Entities_DatesParsed[index] = ListDATE3

我对这行有疑问'PREFER_DATES_FROM': 'future',例如:文章写于 2005 年 8 月 15 日,但文中没有给出年份。SpaCy 将“Aug 15”提取为日期。dateparser 将年份设置为 2006 年(因为它在未来)。因此,我会相信新闻文章谈论的是未来——但事实并非如此。

'PREFER_DATES_FROM': 'past'如果描述了 2 月发生的事件(文本中没有给出年份),设置也无济于事。这可能是明年二月,但日期解析器会将其设置为今年的二月。

有没有办法在设置中添加 if 语句或基于 dateparser 创建一个新函数?请注意,每篇新闻文章都可以有多个日期(entities['DATE'] 是我数据框中每一行的列表)。

我正在使用 Python 3.8

4

1 回答 1

-1

我认为您无法仅使用 DateParser 的选项来解决此问题。这会在给定字符串的情况下机械地解释日期,但是为了判断这些日期是过去还是将来,您需要使用周围单词和文章上下文的知识(“在明年二月的节日......”)。

这在自动化系统中是一件非常困难的事情。在 NLP 研究中,这被称为“接地”,包括相关的问题,比如告诉谁“美国总统”指的是谁(是哪一年?),或者“红色”是什么颜色(是不是像停车标志,还是像红头发一样的红色?)。

我要做的是首先使用基于规则的技术来识别日期是过去还是未来,然后再将它们传递给日期解析器。因此,从日期实体中提取一些单词,如果“最后一个”在那里,那么它是过去,如果“下一个”在那里,那么它在未来,诸如此类。看看效果如何。(您可能认为您可以只在日期实体之前使用单词,但您也可以使用“去年 2 月真的很冷”之类的。)

如果你想在那之后尝试一个统计系统,你可以考虑在 spaCy 中使用带有不同类型上下文窗口的 spancat 来将日期分类为“未来”或“过去”。

于 2021-11-10T04:38:34.177 回答