Spacy短语匹配器添加具有相同匹配ID的模式

时间:2019-12-17 01:14:10

标签: python-3.x spacy

我正在使用spacy的PhraseMatcher来标识用户评论中的药品名称。当应用程序服务器启动时,我正在从一个大文件中预加载名称,但是不想在每个文档过程中都这样做,因为这需要一段时间。 在处理新文档时,我想将识别出的新药添加到词组匹配器中,以便识别新名称。但是,spacy不会接受具有相同match_id的新药。任何帮助将不胜感激。

# Global preload when application server starts
import spacy
from spacy.matcher import PhraseMatcher
nlp = spacy.blank("en")

drug_list = []  # file import with 15k drug names
phrasematcher = PhraseMatcher(nlp.vocab, attr='LOWER')
phrasematcher.add('drug', [nlp(itm) for itm in drug_list])
# The above process takes about couple of seconds to load so this process cannot run everytime

# Post process new documents
phrasematcher.add('drug', [nlp(itm) for itm in ['new drug 1', 'new drug 2']])

我收到以下错误。

span = Span(doc_pm, start, end, label=match_id)
File "span.pyx", line 118, in spacy.tokens.span.Span.__cinit__
ValueError: [E084] Error assigning label ID 16065740214838660377 to span: not in StringStore.

当我使用match_id查找哈希值然后使用它时,会出现另一个错误。

phrasematcher.add(phrasematcher.vocab.strings['drug'], [nlp(itm) for itm in ['new drug 1', 'new drug 2']])

错误:

File "phrasematcher.pyx", line 222, in spacy.matcher.phrasematcher.PhraseMatcher.add
TypeError: an integer is required
Spacy 2.2 
Ubuntu 16 
Python 3.6

1 个答案:

答案 0 :(得分:0)

问题可能是doc_pm未被用于创建nlp的相同PhraseMatcher管道处理,因此他们无法访问相同的基础{{ 1}}。检查是否为StringStore。如果它们不相同,那就是导致doc_pm.vocab == phrasematcher.vocab出现StringStore错误的原因。

最直接的解决方案是在整个过程中始终使用相同的Span管道,因此所有组件只有一个vocab。如果由于某种原因这不可行,也应该在nlp vocab中明确查找标签:

PhraseMatcher