如何通过Google DLP Java库获取准确的去标识单词/字符串数量?
解决Google DLP去标识单词计数重复的问题
我之前也踩过这个坑!你的推测完全正确——Steve Jobs同时匹配了FIRST_NAME、LAST_NAME和PERSON_NAME三个InfoType,导致TransformationSummary里的计数重复累加,才会算出3这个不符合预期的结果。要统计实际被去标识的单词/字符串数量,得换个思路避开重复计数的坑,这里有两种靠谱的实现方式:
方法一:通过定位信息去重计数
DLP的响应里其实包含了每个敏感信息的具体字符偏移位置,我们可以利用这些位置提取原始片段,再通过集合去重,这样就能得到唯一的被替换内容数量。
如果是处理表格每行的输入,就逐行单独处理,代码示例如下:
DeidentifyContentResponse response = dlpClient.deidentifyContent(request); String originalText = "Steve Jobs"; // 这里替换为当前行的原始输入文本 Set<String> uniqueRedactedSegments = new HashSet<>(); // 遍历所有转换摘要里的定位信息 for (TransformationSummary summary : response.getOverview().getTransformationSummariesList()) { for (FindingLocation location : summary.getFindingLocationsList()) { // 根据偏移量提取原始内容中的敏感片段 String segment = originalText.substring(location.getStart(), location.getEnd()); uniqueRedactedSegments.add(segment); } } // 集合的大小就是实际被去标识的单词/片段数量 int actualRedactionCount = uniqueRedactedSegments.size(); // 这里会得到预期的2
这个方法的核心是利用HashSet自动去重的特性,确保同一个敏感片段不会被重复计数,不管它匹配了多少个InfoType。
方法二:对比原始内容与去标识后内容
如果你的去标识策略是用统一标记(比如默认的[REDACTED])替换敏感内容,那直接统计去标识后文本中标记的出现次数更简单:
DeidentifyContentResponse response = dlpClient.deidentifyContent(request); String redactedText = response.getItem().getValue().getStringValue(); // 统计替换标记的出现次数 Pattern redactionPattern = Pattern.compile("\\[REDACTED\\]"); int actualRedactionCount = (int) redactionPattern.matcher(redactedText).results().count();
这种方法不需要处理位置信息,但前提是你的替换策略是统一的。如果不同类型的敏感信息用了不同的替换标记,那还是方法一更通用。
额外优化建议
从根源上减少重复匹配的话,你可以调整InfoType的配置:比如只保留PERSON_NAME(它已经包含了对名字、姓氏的识别),或者通过设置检测优先级让PERSON_NAME优先匹配,避免同一个内容被多个InfoType重复识别。如果业务上必须保留三个InfoType,那还是用上面的计数方法更稳妥。
内容的提问来源于stack exchange,提问作者user2337270
相关产品推荐
相关产品推荐

