首页 > 其他分享 >【数据保护】微软开源数据保护项目Presidio-中文文本扫描以及注意事项

【数据保护】微软开源数据保护项目Presidio-中文文本扫描以及注意事项

时间:2024-08-06 19:56:30浏览次数:13  
标签:识别器 nlp 中文 zh chinese Presidio 开源 数据保护

Presidio,源自拉丁语,寓意"保护"或"驻军",是由微软推出的一项开源数据保护计划。该项目致力于协助企业与开发者在处理数据时,快速识别并脱敏敏感信息。它能够识别文本和图像中的多种敏感数据,包括但不限于信用卡号码、个人姓名、地理位置和电话号码等,并通过定制化的格式进行脱敏处理,以增强数据的安全性。

本章主要介绍Presidio对于中文文本敏感信息的扫描,关于Presidio更多了解可以参考其它文章:

Presidio中默认使用spaCy作为NLP语言分析模型,因此如果想要支持中文首先下载中文语言模型。模型下载步骤可参考spaCy语言模型下载链接。

第一步:下载安装中文语言模型。当前环境我已经安装了英语、西班牙语和两个汉语模型,可通过命令spacy info查看。

$ spacy info
============================== Info about spaCy ==============================

spaCy version    3.7.5
Location         g:\python项目\django项目\pythonproject1\venv\lib\site-packages\spacy
Platform         Windows-10-10.0.19045-SP0
Python version   3.8.10
Pipelines        en_core_web_lg (3.7.1), es_core_news_md (3.7.0), zh_core_web_lg (3.7.0), zh_core_web_sm (3.7.0)

第二步:编写配置信息,指定Presidio支持中文模型。

configure = {
    "nlp_engine_name": "spacy",
    "models": [
        {"lang_code": "zh", "model_name": "zh_core_web_lg"}
    ]
}

第三步:基于Presidio模块创建NLP引擎对象。

provider = NlpEngineProvider(nlp_configuration=configure)
nlp_engine_with_chinese = provider.create_engine()

第四步:基于Presidio模块创建基于正则表达式的中文识别器。本例中编写的识别器识别两个中文词语"帽衫"和"忠诚"。

chinese_pattern = Pattern(name="chinese_pattern", regex="(帽衫|忠诚)", score=0.5)
chinese_recognizer = PatternRecognizer(supported_entity="CHINESE", patterns=[chinese_pattern],
                                       supported_language="zh")

第五步:基于Presidio模块创建识别器并指定NLP引擎,并将中文识别器添加到分析器列表中。

analyze = AnalyzerEngine(
     nlp_engine=nlp_engine_with_chinese, supported_languages=["zh"])
analyze.registry.add_recognizer(chinese_recognizer)

第六步:扫描中文文本。

result = analyze.analyze(text=text, language="zh", entities=["CHINESE"])
print("result = ", result)

综上,整个扫描过程代码如下:

from presidio_analyzer import Pattern, AnalyzerEngine, PatternRecognizer
from presidio_analyzer.nlp_engine import NlpEngineProvider


text = "你好我有一个帽衫,我想在网上问问,为什么我带着显得这么忠诚。"
# 第一步:下载安装中文语言模型。模型名称为zh_core_web_lg
# 第二步:编写配置信息,指定Presidio支持中文模型。
configure = {
    "nlp_engine_name": "spacy",
    "models": [
        {"lang_code": "zh", "model_name": "zh_core_web_lg"}
    ]
}

# 第三步:基于Presidio模块创建NLP引擎对象。
provider = NlpEngineProvider(nlp_configuration=configure)
nlp_engine_with_chinese = provider.create_engine()

# 第四步:基于Presidio模块创建基于正则表达式的中文识别器。
chinese_pattern = Pattern(name="chinese_pattern", regex="(帽衫|忠诚)", score=0.5)
chinese_recognizer = PatternRecognizer(supported_entity="CHINESE", patterns=[chinese_pattern],
                                       supported_language="zh")

# 第五步:基于Presidio模块创建识别器并指定NLP引擎,并将中文识别器添加到分析器列表中。
analyze = AnalyzerEngine(
     nlp_engine=nlp_engine_with_chinese, supported_languages=["zh"])
analyze.registry.add_recognizer(chinese_recognizer)

# 第六步:扫描中文文本。
result = analyze.analyze(text=text, language="zh", entities=["CHINESE"])
print("result = ", result)

上面代码执行结果如下:

result =  [type: CHINESE, start: 6, end: 8, score: 0.5, type: CHINESE, start: 27, end: 29, score: 0.5]

在使用Presidio对中文文本进行扫描时,可能会遇到以下问题:

问题一:遇到ValueError: No matching recognizers were found to serve the request.

出现此问题是因为分析器在扫描中文文本时没有找到对应的识别器。需要注意,在创建分析器对象PatternRecognizer时supported_language参数一定要设置成"zh",否则默认为"en",则Presidio认为此识别器识别的语言为英语。创建分析器对象AnalyzerEngine时,supported_languages参数也要将"zh"加入支持列表中。调用分析器的analyze函数时也要设置language参数为"zh"。

问题二:创建敏感词语列表识别器却不起作用。

这个是Presidio当前对中文支持不完善的地方,我们深入Presidio源码可以发现,Presidio在PatternRecognizer类的构造函数中,判断如果创建的是敏感列表,它会将敏感列表转换成正则表达式。例如我们的敏感列表中包含"帽衫"、"忠诚"两个词,Presidio会将其转换成正则表达式"(?:^|(?<=\W)(帽衫|忠诚)(?:(?=\W)|$)",转化代码如下。

def _deny_list_to_regex(self, deny_list: List[str]) -> Pattern:
    """
    Convert a list of words to a matching regex.
    To be analyzed by the analyze method as any other regex patterns.
    :param deny_list: the list of words to detect
    :return:the regex of the words for detection
    """

    # Escape deny list elements as preparation for regex
    escaped_deny_list = [re.escape(element) for element in deny_list]
    regex = r"(?:^|(?<=\W))(" + "|".join(escaped_deny_list) + r")(?:(?=\W)|$)"
    return Pattern(name="deny_list", regex=regex, score=self.deny_list_score)

比如说我们分析下面这段文本:"你好我有一个帽衫,我想在网上问问,为什么我带着显得这么忠诚。",敏感器列表是扫描不到"帽衫"和"忠诚",但是下面这段文本却可以扫描到:"你好我有一个 帽衫 ,我想在网上问问,为什么我带着显得这么 忠诚 。",没错,在"帽衫"和"忠诚"前后加上空格就可以了。就是这段正则表达式"(?:^|(?<=\W)(帽衫|忠诚)(?:(?=\W)|$)"导致的。因为英语来说,单词之间是有空格分隔的,所以Presidio默认敏感列表中单词前后都应该有空格,否则可能是其它单词中的一部分,而中文文本中单词之间是没有空格的,所以会出现这个问题。

针对这问题,我们可以使用正则表达式的识别器或者自定义识别器替代就好了,中文情况下尽量不要使用敏感列表识别器。

标签:识别器,nlp,中文,zh,chinese,Presidio,开源,数据保护
From: https://blog.csdn.net/qq_29490749/article/details/140938216

相关文章

  • LlamaCoder:一款开源的平替 Claude Artifacts 项目
    LlamaCoder是一个开源项目,旨在提供一种替代ClaudeArtifacts的解决方案。ClaudeArtifacts是一个商业软件,可能包含一些专有技术或特定的功能集,而LlamaCoder则致力于提供类似的功能,但以开源的形式,允许更广泛的社区参与和贡献。由于LlamaCoder是一个假想的开源项目,我将......
  • .NET 开源权限认证项目 MiniAuth上线
    前言在Web应用项目中权限认证是个绕不开的话题,传统方法复杂又耗时。MiniAuth推出专为.NET开发者设计的简单、实用的权限认证项目。MiniAuth,作为ASP.NETCore的插件,让我们快速轻松实现用户登录、权限检查等功能。它支持多种认证方式,如JWT、Cookie,且易于集成到现有项目中。无论是......
  • 【人工智能LLM】开源 LLM 大模型汇总以及微调策略_有哪些开源的大模型可以微调(1)
    目录前言LLaMA*[stanfordAlpaca](https://blog.csdn.net/qq_36287702/article/details/131138356#stanford_Alpaca_11"stanfordAlpaca")GuanacoVicunaChinese-LLaMA-AlpacaChinese-VicunaLuotuo-ChineseFalcon*[OpenBuddy-Falcon](https://blog.csdn.......
  • 1、消息队列框架:Kafka - 开源项目研究文章
    ApacheKafka是一个高性能的分布式发布-订阅消息队列系统,最初由LinkedIn公司开发,并在2010年贡献给了Apache基金会成为顶级开源项目。Kafka的主要应用场景包括日志收集、消息系统、用户活动跟踪、运营指标记录和流式处理等。Kafka的架构包括以下几个核心组件:Topic:......
  • 开源文档协作平台比较:哪个最适合你?
    国内外主流的10款开源文档协作平台对比:PingCode、Worktile、蚂蚁笔记(Leanote)、Wizard、Kooteam、ShowDoc、MrDoc、DooTask、语雀、WookTeam。在今天的数字化时代,寻找一个能够提高团队合作效率并确保信息共享流畅的解决方案,成了许多企业和个人的迫切需求。开源文档协作平台以其......
  • C#自定义快捷操作键的实现 - 开源研究系列文章
          这次想到应用程序的快捷方式使用的问题。      Windows已经提供了API函数能够对窗体的热键进行注册,然后就能够在窗体中使用这些注册的热键进行操作了。于是笔者就对这个操作进行了整理,将注册热键操作写成了帮助类,并且用此博文来记录这个使用DEMO,便于其他读者......
  • FLUX.1最强AI绘画开源新模型,本地部署教程!
    原文链接:FLUX.1最强AI绘画开源新模型,本地部署教程!(chinaz.com)Flux最近收到了很多模型爱好者的好评,出图质量超越SD3和MJ,许多人说Flux才是大家心目中的SD3,所以我也是非常好奇FLux的实力在这里把本地部署的过程分享给大家官网参考图:Flux官网首页:https://blackforestlabs.ai......
  • 精美小剧场短剧影视短视频小程序源码+支付收益+付费短剧小程序源码,全开源支持二开
    精美小剧场短剧影视短视频小程序源码+支付收益+付费短剧小程序源码,全开源支持二开###精美小剧场短剧影视短视频小程序源码+支付收益+付费短剧小程序源码,全开源支持二开在数字化时代,短视频和小剧场短剧已成为人们日常生活中不可或缺的娱乐方式。随着技术的进步和市场的需求,......
  • 开源模型应用落地-LangChain实用小技巧-ChatPromptTemplate的各种花样(三)
    一、前言  在当今的自然语言处理领域,LangChain框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧,能够让您在使用LangChain框架时更加得心应手,从而更高效地开发出优质的自然语言处理应用。二、术语2.1.LangChain  是一个全方位的、基于大语言模型这......
  • 实用好软-----pc端开源万能下载工具 支持任何视频界面 包括网页抖音等
            很多网友喜欢刷刷视频,对于有些特殊爱好或者教程的视频想保存下来后续观看。但苦于找不到类似工具,今天分享的这款工具可以嗅探当前视频。还可以轻松嗅探并下载网络上的各种宝藏,比如视频、音频、图片、m3u8等等.支持下载各大热门平台的资源,比如微信视频......