You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:34:10