我正在使用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
答案 0 :(得分:0)
问题可能是doc_pm
未被用于创建nlp
的相同PhraseMatcher
管道处理,因此他们无法访问相同的基础{{ 1}}。检查是否为StringStore
。如果它们不相同,那就是导致doc_pm.vocab == phrasematcher.vocab
出现StringStore
错误的原因。
最直接的解决方案是在整个过程中始终使用相同的Span
管道,因此所有组件只有一个vocab。如果由于某种原因这不可行,也应该在nlp
vocab中明确查找标签:
PhraseMatcher