本文旨在介绍自然语言处理(NLP)中的事件提取技术,通过一个简单的示例展示如何构建一个事件提取脚本,从而自动识别文本中的关键事件和时间信息。
随着技术的发展,每天都有大量的文本数据产生,包括新闻稿、博客、公告等。这些数据需要被有效地组织和处理。自然语言处理技术的进步使得自动识别文本中的事件变得可能。事件提取是一种常用的应用场景,它能够自动识别文本中发生的事件及其发生的时间。
例如: - 2018年10月,特朗普政府禁止伊朗石油进口,但给予七个国家豁免。 - 2019年4月,美国国务卿迈克·蓬佩奥宣布,美国不再给予更多豁免。 - 2019年5月,美国终止了允许其他国家进口伊朗石油的豁免政策。
借助上下文信息,可以关联时间上独立的事件,理解它们之间的相互影响,揭示事件随时间的发展趋势。这些技术洞察力推动了像EventRegistry和Primer.AI这样的组织利用科技服务于不同市场。
本文将构建一个简单的事例,展示如何编写一个事件提取脚本,接收新闻输入并提取事件。
首先需要收集数据。我们可以使用任何类型的文本数据,只要这些数据可以通过时间线来表示。本文选择了newsapi作为数据源,它可以轻松获取数据,且开发者计划每天可以免费获取500个请求。以下是获取数据的代码片段:
```python
```
最终,我们得到了一个包含约2000篇文章的数据集。为了简化处理过程,我们只保留文章的标题(实际上,标题通常包含文章的核心内容)。
接下来需要将文章标题转化为算法可以理解的形式。本文使用SpaCy的预训练词嵌入模型,该模型可以获取独立词语的含义,并进一步获取整个句子的含义。具体来说,本文使用的是SpaCy的大型模型(encoreweb_lg),其中包含了685k英语单词的预训练词向量。
SpaCy默认将词向量的平均值作为句子向量,这是一种简单的方法,但它忽略了句子中的词序信息。如果希望采用更精细的方法,可以考虑使用Sent2Vec或SkipThoughts等模型。
本文中使用SpaCy自带的方法:
```python
```
每篇文章被表示为一个300维的向量。
即使通过搜索方式过滤数据,同一查询也可能包含多个不同的主题。例如,“巴黎”这个关键词可以检索到不同的新闻,如巴黎的一场大火或巴西足球传奇人物贝利在巴黎住院的消息。因此,需要使用聚类算法来分组不同的主题。
本文使用DBSCAN算法,该算法不需要指定聚类的数量。它可以根据数据自动决定聚类的数量和规模。参数eps决定了两个样本之间的最大距离,从而决定它们是否被视为邻近。适当的eps值需要通过实验来确定,以保持句子间的相似度。
```python
```
通过调整eps参数,可以控制聚类的数量。总体而言,我们希望每个聚类中的句子非常相似,因此选择0.08至0.12之间的值。
对于每个聚类,我们得到了一个DataFrame。接下来的任务是按照时间线排列这些句子,并过滤掉相似的句子。每天只显示一篇文章,使时间线更加清晰一致。
由于每天可能会有多篇关于同一主题的文章,我们需要选择一个最佳的句子来代表这一天的主题。这可以通过计算每个聚类中句子的中心向量来实现。
```python
```
最后,使用Plotly绘制时间线图:
```python
```
通过上述方法,可以从2000篇文章中提取和组织事件。这种方法不仅适用于新闻数据,还可以应用于股票市场、金融分析等多个领域,为决策提供有力支持。
希望本文能够帮助你更好地理解自然语言处理中的事件提取技术。如果你有任何问题或建议,请随时联系我。