跳转到主要内容

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

  • 与第三方共享数据
  • 遵守GDPR等法规要求
  • 用作机器学习和其他探索性分析的训练数据
  • 你是Facebook,你终于想做正确的事情了(/S)

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

介绍spaCy

命名实体识别(NER)试图识别文本数据中有意义的单词,如人名、地点、日期等。有几个开源工具使用NER来帮助识别有意义的词,我们将在本文中重点介绍的一个非常受欢迎的项目叫做spaCy。

spaCy是一个用于自然语言处理的免费开源python库,具有NER功能,可以帮助我们识别人名、地点和其他潜在有用的信息。

Python示例

先决条件:

pip install -U pip setuptools wheel
pip install -U spacy
python -m spacy download en_core_web_sm

现在,让我们假设我们有一些非结构化文本,并想看看它是否包含任何PII:

import spacy
text = "My secret agent name is John McClane from Boston, hope my identity remains anonymous."
nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
for entity in doc.ents:
    print(entity.label_ +": "+ entity.text)

让我们看看这个代码打印的内容:

PERSON: John McClane
GPE: Boston

好极了我们已经检测到一个人和一个地点的名字(GPE=地缘政治实体,即国家、城市、州),现在我们可以选择对这些信息做些什么,也许在存储之前从文本中删除它,或者使用工业强度加密来保护我们特工的生命。

spaCy并不总是那么准确,让我们看看另一个spaCy做得不好的例子:

import spacy

text = "The writings of Ludwig von Mises are more relevant now than ever before."

nlp = spacy.load("en_core_web_sm")

doc = nlp(text)

for entity in doc.ents:
    print(entity.label_ +": "+ entity.text)

现在,上述结果并不是我们所希望的那样:

ORG: Ludwig von Mises

哦,不!它发现了我最喜欢的奥地利经济学家作为一个组织。公平地说,现在有一个名为路德维希·冯·米塞斯奥地利经济研究所或米塞斯研究所的组织,所以spaCy可能感到困惑,你会在现实世界的数据中看到这样的错误。

结论

因此,我们现在有了一种在文本中查找人名的方法,这并不完美,但spaCy将比大多数试图自己从头开始查找的人做得更好。实际上,它非常善于查找人名、国家、城市、州、公司等。

这是一个很好的起点,您可以(也应该)在此基础上进行构建,使您的流程对您自己的数据和域更加准确。

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