Nlp 空间查找标点干扰

Nlp 空间查找标点干扰,nlp,spacy,text-processing,Nlp,Spacy,Text Processing,是非常大的字典的实体匹配器,它使用FlashText模块。 下面第二种情况中的标点符号似乎阻止它与实体匹配 有人知道为什么会发生这种情况以及如何解决吗 import spacy from spacy_lookup import Entity nlp = spacy.load("en_core_web_sm", disable = ['NER']) entity = Entity(keywords_list=['vitamin D']) nlp.add_pipe(entity, last=Tru

是非常大的字典的实体匹配器,它使用FlashText模块。
下面第二种情况中的标点符号似乎阻止它与实体匹配

有人知道为什么会发生这种情况以及如何解决吗

import spacy
from spacy_lookup import Entity

nlp = spacy.load("en_core_web_sm", disable = ['NER'])
entity = Entity(keywords_list=['vitamin D'])
nlp.add_pipe(entity, last=True)

#works for this sentence:
doc = nlp("vitamin D is contained in this.")
print([token.text for token in doc if token._.is_entity])
#['vitamin D']

#does not work for this sentence:
doc = nlp("This contains vitamin D.")
print([token.text for token in doc if token._.is_entity])
#[]

编辑:有趣的是,直接使用flashtext库(空间查找基于flashtext库)时不会出现这种情况:

编辑:正如Anwarvic指出的,问题来自默认标记器拆分字符串的方式。

编辑:我试图找到一个通用的解决方案,例如不涉及在每个标点之前添加空格。(基本上是寻找一种不需要重新格式化输入文本的解决方案)

解决方案非常简单。。。将空格放在“D”之后,如下所示:

>>doc=nlp(“此含有维生素D”)#>>打印([token.text表示doc中的token,如果token.is是实体])
[“维生素D”]

为什么会这样?仅仅是因为斯帕西将“D”视为一个完整的标记,就像名字“D.Cooper”中的“D”被视为一个完整的标记一样

谢谢你的回答(我投了更高的票),它让我意识到问题在于标记器。我将研究调整标记器使用的规则。但是,添加额外的预处理步骤以添加空格(如您所述)在我的应用程序中不起作用,因为关键字列表将包含数千个关键字,并且在标点之前系统地添加空格可能会导致应用程序的其他部分无法正常工作。您只能在有“维生素D”的情况下添加空格最后,“维生素D”只是出现这种现象的一个例子。还有许多其他的,如“蛋白激酶C”等。。为了实现addingspaces方法,我必须运行flashtext作为预处理步骤,以检测应该在何处添加空格,然后通过spacy查找再次运行它来标记实体。这种方法的计算效率不高。我将尝试修改标记器或spacy查找的源代码,以生成计算速度快且内存使用率低的解决方案。感谢您发现问题来自标记器。
from flashtext import KeywordProcessor
keyword_processor = KeywordProcessor()
keyword_processor.add_keyword('vitamin D')
keywords_found = keyword_processor.extract_keywords("This contains vitamin D.", span_info=True)
print(keywords_found)
# [('vitamin D', 14, 23)]

>>> doc = nlp("This contains vitamin D .") #<-- space after D
>>> print([token.text for token in doc if token._.is_entity])
['vitamin D']