加快模式创建,同时生成要添加到 Spacy 中的短语匹配器的模式

Speed up patterns creation while generating patterns to be added to Phrase Matcher in Spacy

尝试在 Flask 应用程序中使用 Spacy 的 phraseMatcher 从给定的文本片段中识别实体。

我有一个自定义的实体列表(大约 150 K),我想使用 Spacy 的 phraseMatcher 进行匹配。我正在使用最快的推荐方法,使​​用 tokenizer.pipe 指定的 here,同时创建模式并添加到 PhraseMatcher。

with open('entities_index_keys.pkl', 'rb')as f:
    entities_list=pickle.load(f)

print (len(entities_list))

phrase_matcher_obj = PhraseMatcher(nlp.vocab)

# create doc for each entity from entities_list
patterns = list(nlp.tokenizer.pipe(entities_list))
phrase_matcher_obj.add('my_entities', None, *patterns)

下一行需要一段时间才能完成。我成功地处理了一个大小为 1200 的实体列表,并且在运行时也非常快。但是当转到 150 K 实体时,它会显着减慢。

patterns = list(nlp.tokenizer.pipe(entities_list))

我宁愿避免在运行时创建模式,但由于某种原因,对使用上述代码创建的 "docs"/模式列表进行酸洗会损坏对象。那么有没有一种方法可以创建模式并快速添加到 phrasmatcher 对象而不会受到速度影响?

另一种替代方法是将 PhraseMatcher 保存到磁盘并在 flask 应用程序路由执行期间快速加载它。 (尝试酸洗但没有成功)

你应该可以 pickle PhraseMatcher。 Unpickling 不是非常快,因为它必须重建一些内部数据结构,但它不必重新标记文本并且应该比从头开始构建更快。由于修复了一些错误,我推荐 v2.2.2+。

如果您 运行 在 picking PhraseMatcher 时出错,请在问题跟踪器中提交错误报告。