跳转到主要内容

在文本文档中查找个人身份信息(PII)可能很有用,原因有几个,但我多次遇到的一个用例是帮助匿名文本,以便:

  • 与第三方共享数据
  • 遵守GDPR等法规要求
  • 将PII替换为模拟数据,用作机器学习和其他探索性分析的训练数据

我将尝试自动化查找PII的过程,在本系列文章中,我们将探索一些流行的开源工具和技术,以便在我们自己的数据中识别不同类型的PII。

在第一部分中,我们找到了一种在文本中查找人名的方法,让我们看看我们还可以找到其他类型的PII。

介绍Duckling

Duckling是一个Haskell库,由Facebook开源,用于将文本解析为结构化数据。Duckling可以帮助我们在文本中找到不同类型的信息,包括信用卡号码、电子邮件地址和电话号码。

现在别担心,如果你不是了解Haskell的三个人之一,我们可以将Duckling与任何编程语言一起使用。

Python示例

让我们看看我们将如何用一种不需要关于副作用的害处的演讲的语言来使用Duckling。

先决条件:

安装Git、Docker和Docker-compose

步骤1:

git clone git@github.com:facebook/duckling.git

第2步:

在克隆的Duckling repo中制作一个docker compose文件。

docker-compose.yml:

version: '3'

services:
  duckling:
    build:
      context: .
    ports:
      - 8000:8000

步骤3:

开始Ducking作为Docker服务:

docker-compose up duckling

现在,Duckling服务通过我们本地主机上的端口8000通过HTTP API提供。让我们开始对API进行一些调用,看看我们得到了什么:

import requests

text = 'My email address is spy@ninja.com and my number is +1 (650) 123-4567 so call me maybe?'

response = requests.post('http://localhost:8000/parse', {'locale': 'en_US', 'text': text})

entities = response.json()

for entity in entities:
    print( entity['dim'] +": "+ entity['body'])

这将打印以下内容:

email: spy@ninja.com
phone-number: +1 (650) 123-4567

美好的Duckling在我们的文本中找到了电子邮件地址和电话号码,并确认此文本包含PII。现在让我们看看它是如何处理信用卡号的:

import requests

text = 'Last Christmas I gave you my card 4111-1111-1111-1111 But the very next day you gave it away'

response = requests.post('http://localhost:8000/parse', {'locale': 'en_US', 'text': text, 'dims': ["credit-card-number"]})

entities = response.json()

for entity in entities:
    print( entity['dim'] +": "+ entity['body'])

迫不及待地想看到那个甜蜜的信用卡号被打印出来。让我们看看它打印了什么:

credit-card-number: 4111-1111-1111-1111
phone-number: 4111-1111-1111-1111

呃…它检测到我们的号码是电话号码和信用卡号码。我想安全总比抱歉好。

Duckling可以帮助我们找到其他类型的数据,或者用Duckling的语言称为“维度”,所以请随意浏览该项目的Github页面,看看还有什么可用的。

结论

我们现在可以添加到我们能够找到的PII类型列表中:人名、电子邮件地址、电话号码和信用卡号。我们已经看到还有改进的空间,例如,我们可以使用Luhn算法来确认一个号码是信用卡号码,而不是电话号码,但这超出了本系列的范围,因为每个人都需要在这里讨论的主题的基础上构建自己的用例。

在接下来的文章中,我们将看到其他工具是如何执行的,以及它们可以帮助我们找到哪些其他类型的PII。