我正在使用spacy在网页上识别街道地址。
我的模型基本上是使用spacy的新实体类型示例代码初始化的,该代码可在此处找到:https://github.com/explosion/spaCy/blob/master/examples/training/train_new_entity_type.py
我的训练数据包括纯文本网页及其相应的街道地址实体和字符位置。
我能够快速建立一个spacy模型来开始进行预测,但我发现它的预测速度非常慢。
我的代码通过迭代几个原始HTML页面,将每个页面的纯文本版本作为输入传递给spacy。由于某些原因我不能详述,我需要在迭代循环内部逐页使用Spacy进行预测。
加载模型后,我使用标准方法进行预测,我将其称为预测/评估阶段:
doc = nlp(plain_text_webpage)
if len(doc.ents) > 0:
print ("found entity")
问题:
我如何加速实体预测/识别阶段? 我在AWS上使用一个c4.8xlarge实例,当spacy正在评估数据时,所有36个核心都被不断地占满。Spacy将处理几百万个网页的工作从1分钟变成了1小时以上。
随着我的模型变得更加准确,实体识别的速度会提高吗?
有没有办法在这个阶段移除像标记器这样的管道,ER是否可以分离开来而仍然保持准确性?删除其他管道会影响模型本身还是只是暂时的事情?
我看到可以在ER训练阶段使用GPU,它能否在我的代码中用于评估阶段以获得更快的预测?
更新:
我成功大幅缩短了处理时间:
使用自定义分词器(使用文档中的分词器)
禁用其他不是用于命名实体识别的管道
不再将每个网页的整个正文传递给spacy,而是只发送最多5000个字符
我的更新代码来加载模型:
nlp = spacy.load('test_model/', disable=['parser', 'tagger', 'textcat'])
nlp.tokenizer = WhitespaceTokenizer(nlp.vocab)
doc = nlp(text)
然而,它依然太慢了(比我需要的慢20倍)
问题:
有什么其他的改进方法可以加速实体识别吗? Spacy中是否可以减少一些负担?
我还在寻找基于GPU的解决方案是否会有所帮助 - 我看到GPU在命名实体识别训练阶段支持使用,它能否在我的代码中用于此评估阶段以进行更快的预测?