脱敏:对关键字相互包含的情况下,脱敏 顺序不受控制

您好:
在测试中 如果出现脱敏的关键字 互相包含, 脱敏是按照什么顺序脱敏的?

test_num.pdf (31.5 KB)
在样本 ,同时对关键字:
202212300000000
2212300000
3000000
进行脱敏。

测试结果 是对3000000进行屏蔽。
image.png (52.8 KB)

image.png (33.0 KB)
在另一个测试样本中, 对关键字:
1234 5678 90
5678 9098
5678
进行脱敏测试。

测试结果 对 1234 5678 90 进行了屏蔽
image.png (36.4 KB)

这个测试顺序是按照什么顺序, 在实际业务中 我期望能最大长度进行屏蔽,所以在脱敏的时候我按照长度进行排序,字符串最长的屏蔽串放到最前面, 但脱敏结果不受排序控制。

代码:
OCR 返回结果处理

在 recognize(InputStream imageStream) 方法中
// 遍历排序后的列表
for (JSONObject coordinate : jsonList) {
String key = coordinate.getString(“key”);
JSONArray boxes = coordinate.getJSONArray(“value”);
ArrayList fragments = new ArrayList<>();
for (int i = 0; i < boxes.length(); i++) {
JSONObject box = boxes.getJSONObject(i);
Rectangle rect = new Rectangle(box.getInt(“left”), box.getInt(“top”), box.getInt(“width”), box.getInt(“height”));
fragments.add(new TextFragment(key, rect));
}
lines.add(new TextLine(fragments.toArray(new TextFragment[0])));
}

return new RecognizedImage(lines.toArray(new TextLine[0]));

脱敏调用过程:
RedactorSettings settings = new RedactorSettings(connector);
Redactor redactor = new Redactor(redactionOptions.getSourcePath(), new LoadOptions(), settings); //new Redactor(redactionOptions.getSourcePath());
List redactions = getRedactions(redactionOptions);
RedactorChangeLog redactorChangeLog = redactor.apply(redactions.toArray(new Redaction[]{}));

@weilin
我们已在内部问题跟踪系统中打开以下新票证,并将根据 Free Support Policies 中提到的条款提供修复。

 问题 ID:REDACTIONJAVA-184

如果您需要优先支持,以及直接联系我们的付费支持管理团队,您可以获取 Paid Support Services

@weilin

密文以相同的顺序应用,因为它们被传递到数组中的 Apply() 方法,因此使用了 FIFO 原则。 如果应用一个修订,第二个修订将使用其结果作为输入 - 因此顺序非常重要。 我们看不到代码(“List redactions = getRedactions(redactionOptions)”没有告诉我任何信息),但我们认为您错了。 我们有时间只检查第一种情况,test_num.pdf 的模式:
202212300000000
2212300000
300万
这一系列的编辑

Redaction[] items = new Redaction[] {
    new ExactPhraseRedaction("202212300000000", true, new ReplacementOptions("[big]")),
    new ExactPhraseRedaction("2212300000", true, new ReplacementOptions("[middle]")),
    new ExactPhraseRedaction("3000000", true, new ReplacementOptions("[small]"))
};

给出这个结果(文本部分):
[大]2
[大]1
[大]3
[大]9
[大]7
20[中]0019
20[中]0016
按倒序排列,从小“3000000”到大“202212300000000”:
202212[小]002
202212[小]001
202212[小]003
202212[小]009
202212[小]007
202212[小]019
202212[小]016
正如我们所看到的,序列很重要,并且在图片上按预期工作(对于小优先)
image.png (52.8 KB)

聚苯乙烯
还有一点需要注意的是:在幕后,ExactPhraseRedaction 是一个简单的正则表达式,因此如果您可以提供涵盖所有情况的通用正则表达式,那么使用数十个精确短语(数字等)没有任何好处,例如 “(202212)(3000000)(\d{3})”。 它只是为每个要处理的模式增加了额外的负载。

非常感谢您的回复, 应该是我之前测试的问题, 在代码中 我显式的对OCR返回的结果进行了排序, 但没有对Apply() 方法(“List redactions = getRedactions(redactionOptions)”) 进行排序, 所以出现了上述测试的结果。 复测后 显示按照 Apply() 方法 的顺序进行屏蔽的。

@weilin

感谢您的反馈。 我们将继续调查并通知您任何进一步的进展。