加载 Presidio 分析引擎需要一些时间。我想过滤掉特定名称,但我想过滤掉每个文档的不同名称。我不明白如何使用 Presidio 执行这个看似简单的任务。 不知何故,我可以将allow_list传递给分析函数,但不能传递deny_list。 我需要创建一个识别器,每次都可以采用不同的拒绝列表。 但我不想每次都重新加载分析引擎,因为我不需要每次都重新加载 NLP 模型。
如何在 Presidio 中构建一个识别器,每次调用时都会采用不同的拒绝列表(或更好的拒绝字典)?
我发现有一个功能
my_analyzer_first.registry.remove_recognizer
但这似乎不起作用,因为它永久地改变了分析器。运行下面的代码,即使识别器已被移除,也能将“Bob”识别为患者。
from presidio_analyzer import PatternRecognizer, EntityRecognizer, RecognizerResult, AnalyzerEngine, nlp_engine
from presidio_analyzer.nlp_engine import NlpArtifacts
import time
my_analyzer_first = AnalyzerEngine(
supported_languages=["en"], default_score_threshold=0.5
)
def on_the_fly_without_loading(text : str, deny_list : list[str]):
denylist_recognizer = PatternRecognizer(supported_entity="[PATIENT]", deny_list=deny_list)
my_analyzer_first.registry.add_recognizer(denylist_recognizer)
entities = my_analyzer_first.analyze(text=text, language="en")
my_analyzer_first.registry.remove_recognizer(denylist_recognizer)
return entities
def sanity_check(text : str):
entities = my_analyzer_first.analyze(text=text, language="en")
return entities
if __name__=="__main__":
N = 10
text = 4 * "I went to the zoo and said hello to Bob the tiger."
deny_list = ["Bob"]
print(on_the_fly_without_loading(text, deny_list))
print(sanity_check(text))
您希望“Bob”仅在第一种情况下被删除,但它每次都会被删除。 当比较
my_analyzer_first.registry
前后的注册表my_analyzer_first.registry.remove_recognizer(denylist_recognizer)
时,我得出的结论是值没有改变!
Presidio 具有“临时”识别器功能,允许将识别器传递到分析器的“分析”方法中。这样,您可以实例化多个识别器(拒绝列表或模式识别器)并传递它们,而无需更改AnalyzerEngine实例。
根据您的尝试:
from presidio_analyzer import PatternRecognizer, EntityRecognizer, RecognizerResult, AnalyzerEngine, nlp_engine
from presidio_analyzer.nlp_engine import NlpArtifacts
import time
denylist_recognizer = PatternRecognizer(supported_entity="[PATIENT]", deny_list=["Bob"])
text = 4 * "I went to the zoo and said hello to Bob the tiger."
my_analyzer_first = AnalyzerEngine(
supported_languages=["en"], default_score_threshold=0.5
)
print(len(my_analyzer_first.analyze(text=text, language="en"))) # Prints 4
print(len(my_analyzer_first.analyze(text=text, language="en", ad_hoc_recognizers=[denylist_recognizer]))) # Prints 8