首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速空间命名实体识别

加速空间命名实体识别
EN

Stack Overflow用户
提问于 2018-04-06 23:44:54
回答 1查看 8.3K关注 0票数 18

我用spacy来识别网页上的街道地址。

我的模型基本上是使用spacy的新实体类型示例代码初始化的:type.py

我的培训数据包括纯文本网页及其相应的街道地址实体和字符位置。

我能够快速地建立一个空间模型来开始预测,但我发现它的预测速度非常慢。

我的代码的工作方式是遍历原始的HTML页面,然后在迭代时将每个页面的纯文本版本输入spacy。由于无法进入的原因,我需要在迭代循环中逐页地使用Spacy进行预测。

在加载模型之后,我使用了进行预测的标准方法,我将其称为预测/评估阶段:

代码语言:javascript
复制
  doc = nlp(plain_text_webpage)

  if len(doc.ents) > 0:

         print ("found entity")

问题:

  1. 如何加快实体预测/识别阶段?我在AWS上使用了一个c4.8xlarge实例,当spacy对数据进行评估时,所有的36个核都会被最大化。Spacy正在将处理几百万个网页的工作从1分钟的工作转变为1 hour+的工作。
  2. 当我的模型变得更精确时,实体识别的速度会提高吗?
  3. 在这个阶段中,是否有一种方法可以去除像tagger这样的管道,ER可以像这样解耦,并且仍然是精确的吗?删除其他管道会影响模型本身,还是只是暂时的事情?
  4. 我看到您可以在ER培训阶段使用GPU,在我的代码中也可以使用GPU进行更快的预测吗?

更新:

我设法通过以下方式大大缩短了处理时间:

  1. 使用自定义令牌程序(使用文档中的标记程序)
  2. 禁用其他不用于命名实体识别的管道
  3. 与其将整个文本从每个网页输入到spacy中,我只发送超过5000个字符。

加载模型的更新代码:

代码语言:javascript
复制
nlp = spacy.load('test_model/', disable=['parser', 'tagger', 'textcat'])
nlp.tokenizer = WhitespaceTokenizer(nlp.vocab)
doc = nlp(text)

然而,仍然是太慢(比我需要的慢20倍)。

问题:

  1. 我还能做什么其他改进来加速命名实体的识别吗?我能从斯派西减掉什么脂肪吗?
  2. 我仍然在寻找一个基于GPU的解决方案是否会有所帮助--我看到在命名实体识别培训阶段支持GPU的使用,它也能在我的代码中用于这个评估阶段以获得更快的预测吗?
EN

回答 1

Stack Overflow用户

发布于 2018-04-07 20:10:06

有关速度故障排除的详细信息,请参阅此处:https://github.com/explosion/spaCy/issues/1508

最重要的事情是:

1)检查链接到哪个BLAS库numpy,并确保它在您的机器上编译得很好。使用conda很有帮助,因为您可以得到Intel的mkl

2)

在AWS上有c4.8个大型实例,当spacy对数据进行评估时,所有36个核都会被最大化。

那可能很糟糕。我们现在只能并行矩阵乘法,因为我们使用的是numpy --所以没有方法来处理更大的块。这意味着BLAS库可能启动了太多线程。一般情况下,每个过程只能使用3-4个核心。尝试设置BLAS库的环境变量以限制线程数。

3)使用nlp.pipe()对数据进行批量处理。这使得矩阵乘法更大,处理效率更高。

4)您的“通过我的处理管道提供数据”的外部循环可能是令人尴尬的并行。那么,并行化它。要么使用Python的多处理,要么使用just之类的东西,或者像Spark之类的东西,或者只是并行地启动10个bash脚本。但是拿出你能做的最外层、最高层次的工作,并尽可能独立地运行它。

实际上,与一个大型VM相比,运行多个较小的VM更好。这在操作上是很烦人的,但它意味着资源共享的减少。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49702372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档