一文带你读懂自然语言处理 - 事件提取
作者头像
  • 2022-04-02 15:59:40 19

自然语言处理——事件提取

每天产生的文本信息令人叹为观止。数百万数据源以新闻稿、博客、消息、手稿和无数其他形式发布,因此自动组织和处理变得必不可少。

随着神经网络算法的进步、计算能力的显著提升以及大量涌现的理解框架,自然语言处理的能力正在被前所未有的探索。其中一种常见应用是事件提取,即处理和识别文本中某个阶段内发生的事件,自动判断发生了什么以及何时发生。

例如: - 2018年10月,唐纳德·特朗普总统的政府禁止了几个国家从伊朗进口石油,但对七个国家豁免。 - 2019年4月,美国国务卿迈克·蓬佩奥宣布,该国不会在截止日期之后再提供豁免。 - 2019年5月,美国结束了对那些允许从伊朗进口石油而不受美国制裁影响的国家的豁免。

通过获得信息的上下文,我们可以关联时间上相互独立的事件,了解它们的影响,并发现事件序列如何随时间展开。这些科技洞察力正推动诸如EventRegistry和Primer.AI等组织,利用科技服务于各个市场。

本文将构建一个简单的事件提取脚本,接收新闻输入处理后输出事件。

获取数据

首先需要收集数据。我们可以用任何形式的文本,只要这些文字的内容可以通过时间线表示。本文选用newsapi,从该数据源获取数据非常容易,其开发者计划每天可获取500个免费请求。以下是处理请求的代码:

```python

代码示例

```

最后一个函数返回特定查询的结果列表,大约包含2000篇文章。我们的目的是从这些文章中提取总体事件。为了简化这个过程,我们只保留文章标题(理论上,标题应包含新闻的核心内容)。

执行后得到一个数据框,其内容如下,包括日期、标题和描述:

```python

数据框示例

```

获取句子含义

我们已经有了文章标题,现在需要将这些标题转化为算法能够理解的形式。虽然本文跳过了整个文本预处理环节,但如果你是新手,应用模型前务必进行预处理。SpaCy的预训练词嵌入模型可以帮助获取独立词语的含义,进一步获得整句句子的含义。具体来说,本文使用的是SpaCy large model (encoreweb_lg),它包含685k个英语单词的预训练词向量。当然,也可以使用任意其他预训练词向量表示(如Word2Vec、FastText、GloVe等)。

SpaCy默认将词向量的平均值作为句子向量,这是一种简易处理方法,忽略了句子中的词序信息。如果你想使用更精细的策略,可以考虑Sent2Vec、SkipThoughts等模型。这篇文章详细介绍了SkipThoughts如何使用无监督方法提取摘要。

本文中使用SpaCy自带的方法:

```python

代码示例

```

可以看到每篇文章被表示为300维的数组,如下:

```python

结果示例

```

向量聚类

即使采用搜索方式过滤获取数据,同一查询中仍可能出现不同的主题。例如,搜索关键词“巴黎”可以得到: - 巴黎在一场毁灭性的火灾后团结起来 或: - 巴西足球传奇人物贝利因病住院于巴黎

现在使用聚类算法对不同的主题进行分组。本文中使用DBSCAN算法,该算法不需要指定聚类簇的数量。算法自行决定聚类簇的数量和规模。

算法中的epsilon参数决定两个样本之间的最大距离,从而判断它们是否临近。这意味着如果eps设置过大,形成的簇就会较少;如果设置过小,大多数点都无法被临近聚类,于是被分到默认簇(-1)里,产生的簇也不多。下图显示了聚类簇的数量与eps的关系:

```python

图表示例

```

调参eps是最为关键的一步,因为聚类结果会有所变化。通过试验找到合适的值,既能保持句子间的相似度,又不至于将相近的句子分到不同组。总的来说,由于我们期望同一组中包含非常相似的句子,因此选择0.08~0.12之间的值。参见Scikit Learn中关于eps和其他参数的说明。

现在看一下每个类中包含的数量:

```python

数量统计示例

```

-1类表示未明确聚类的句子,其他是已被分类的句子。我们分析一下最大的类,表示最重要的主题(或者讨论最多的那个)。

抽样一下其中一个类:

```python

示例数据

```

转换为事件

对于每个分类,我们得到了如上形式的数据框。接下来按照时间线排列这些句子,并过滤掉相似的句子。每天只呈现一篇文章,这样实现出来的事件时间线就干净而统一。

由于每天关于同一主题会产生许多标题,我们将使用一个条件来过滤。该句子将最好地表达事件,即蕴含着这些标题的核心内容。

按天聚类句子,在每个组中选择其最接近中心的句子。以下是从一组向量中找出中心向量的函数:

```python

函数示例

```

这样我们就得到了干净整洁的结果。最后使用Plotly绘制一下时间线图:

```python

时间线图示例

```

这就是全部内容。通过一个脚本从2000篇文章中提取和组织事件。现在可以想象每天将这一技术应用于上百万篇文章的巨大潜力。仅以股票市场的每日新闻影响为例,事件提取可以说是非常有价值的。

可以增加许多步骤来提升事件提取的效果,如更好的预处理(包括词性标注和命名实体识别)、使用更好的句子向量模型等。不过,本文的方法已经可以快速达到理想的结果。

感谢阅读本文。本文聚焦于自然语言处理及事件提取。如果想了解更多有关数据科学和机器学习的信息,请关注我的账号。有任何想法、评论或问题,请随时联系我。

    本文来源:图灵汇
责任编辑: :
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
一文自然语言提取事件处理
    下一篇