点击蓝字 关注我们
日期:2023-11-08 作者:H4y0 介绍:数据安全比赛中常有数据溯源与数据验真类的题目,学到了很多有意思的东西,将这个有趣的过程分享给大家。
0x00 前言
相对于固定格式的数字或字母,正则表达式处理中文就有些力不从心了。而数据安全中需要处理中文部分一般都是含有一定语义的自然语言,可以通过自然语言处理来获取其中的敏感数据。
0x01 NLP与NER
1.1 NLP
自然语言处理(英语:Natural Language Processing
,缩写作 NLP
)是人工智慧和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言处理包括多方面和步骤,基本有认知、理解、生成等部分。简单来说,NLP
就是让计算机去理解自然语言,包括分析语句的意思、拆分语句、分析词性等。以HanLP
为例:
1.2 NER
命名实体识别(英语:Named Entity Recognition
,简称NER
),又称作专名识别、命名实体,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等,以及时间、数量、货币、比例数值等文字。同样以HanLP
为例:
可见NER
可以识别自然语言中的人名、地名、机构等。结合赛题的题目要求,以某数据安全竞赛决赛题目为例:
题目中明确提出了可使用NER
等手段提取数据,根据题目要求和线下环境,如何使用NER
提取数据,且看下文。
0x02 HanLP
2.1 安装
HanLP
是一个开源的面向研究人员和公司的多语种NLP
库,提供了轻量级RESTful API
,使用起来非常方便,可以申请免费公益API
,具体可见:
https://github.com/hankcs/HanLP
但线下赛无法接入互联网,HanLP
也可以搭建在本地。直接使用pip
安装即可。
pip install hanlp[full]
2.2 NER demo
以提取学校名为例:
import hanlp
import hanlp.utils
import os
import json
HanLP = hanlp.pipeline()
.append(hanlp.utils.rules.split_sentence, output_key='sentences')
.append(hanlp.load('FINE_ELECTRA_SMALL_ZH'), output_key='tok')
.append(hanlp.load('MSRA_NER_ELECTRA_SMALL_ZH'), output_key='ner', input_key='tok')
# 测试文本
text = '那些那些会员学习我的有关,阜阳市第四初中其实设计感觉免费自己记者一般。'
#分词
result = HanLP(text, tasks='ner/msra')
names = []
addresses = []
schools = []
#print(result)
for sentence in result['ner']:
if len(sentence)!=0:
for tup in sentence:
if tup[1]=='ORGANIZATION':
schools.append(tup[0])
print(schools)
当然,也可以通过读取文件的方式提取一个
txt
中所有的学校名。
由于提取的内容为所有的组织机构,所以最终的结果除了学校之外还会有其他机构,该类题目的评分标准与准确率有关,如何提高准确率成为了新的问题。
2.3 准确率相关
一个简单的办法,我们可以进行后处理来提高准确率,方法如下:
1
使用正则表达式匹配学校名称(不推荐)。
2
使用上下文信息,例如“大学”、“初中”、“小学”等词汇,可筛选含有这些上下文信息的实体。
3
训练模型,通过标注等方式训练模型提取学校信息。
4
如果有给定数据,可通过白名单的方式进行筛选,提取数据后与白名单比较,匹配则保留。
回到上文提取姓名、地址,要注意的是题目中给出了省市数据
address.txt
,所以地址的提取可通过白名单的方式进行实体的筛选。姓名的提取往往较为准确,一般不需要筛选。
0x03 总结
NER
提取自然语言中的敏感信息是一种非常方便且有效的方式,但是要注意对实体的筛选及处理来提高准确率。如果可以的话可以针对数据类型去训练模型,这才能最好地发挥NER
的优势。推荐阅读
06-02 特稿
07-26 特稿
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。 点此亲启
原文始发于微信公众号(宸极实验室):『杂项』数据溯源与验真的探索之路(3)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论