Presidio 中的即时拒绝列表?

问题描述 投票:0回答:1

加载 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)
时,我得出的结论是值没有改变!

python nlp named-entity-recognition anonymize presidio
1个回答
0
投票

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
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.