我正在尝试用人类可读的替换来匿名化生产数据——这不仅会掩盖实际数据,还会给它一个可调用的身份以供识别。请帮助我了解如何在 Scala 中使用其他可发音的英文单词匿名化数据框列,如名字、姓氏、全名:
- 它必须将一个真实世界名称转换为另一个可发音和可识别的真实世界名称。
- 必须可以分别转换名字、姓氏和全名,使得全名=名字和姓氏之间用空格隔开。
- 它应该在每次迭代中为名称生成相同的匿名化名称。
- 目标数据集将有超过一百万条不同的记录。
我曾尝试遍历名词和形容词词典以达到两个可发音单词的组合,但它不会给我一百万个不同的组合。下面的代码:
def anonymizeString(s: Option[String]): Option[String] = {
val AsciiUpperLetters = ('A' to 'Z').toList.filter(_.isLetter)
val AsciiLowerLetters = ('a' to 'z').toList.filter(_.isLetter)
val UtfLetters = (128.toChar to 256.toChar).toList.filter(_.isLetter)
val Numbers = ('0' to '9')
s match {
//case None => None
case _ =>
val seed = scala.util.hashing.MurmurHash3.stringHash(s.get).abs
val random = new scala.util.Random(seed)
var r = ""
for (c <- s.get) {
if (Numbers.contains(c)) {
r = r + (((random.nextInt.abs + c) % Numbers.size))
} else if (AsciiUpperLetters.contains(c)) {
r = r + AsciiUpperLetters(((random.nextInt.abs) % AsciiUpperLetters.size))
} else if (AsciiLowerLetters.contains(c)) {
r = r + AsciiLowerLetters(((random.nextInt.abs) % AsciiLowerLetters.size))
} else if (UtfLetters.contains(c)) {
r = r + UtfLetters(((random.nextInt.abs) % UtfLetters.size))
} else {
r = r + c
}
}
Some(r)
}