Различные результаты от DLP API в зависимости от того, все ли входные данные находятся в одной строке или отправлены как набор подстрок

Я вижу поведение в библиотеке Google DLP, которое озадачивает меня, и я надеюсь на некоторые разъяснения. Я использую библиотеку Java-оболочки google-cloud-dlp версии 0.34.0-beta. Учитывая вход:

Collection<String> input = Lists.newArrayList("Jenny Tutone  2665 Agua Vista Dr Los Gatos CA 95030 (408) 867-5309 or 408.867.5309x100" 

Я вижу вывод:

███  █ ████ or █

Если я передам в той же строке, что и коллекция подстрок:

Collection<String> input = Lists.newArrayList("Jenny Tutone", "2665 Agua Vista Dr", "Los Gatos", "CA 95030", "(408) 867-5309", "or", "408.867.5309x100");

Я вижу очень разные результаты:

███, 2665 █, █ Gatos, █ 95030, █, or, █

Я использую все InfoType типы, которые я мог найти, что составляет 67 из них. Я что-то здесь не так делаю? Это основная часть кода, который вызывает библиотеку Google DLP:

private Collection<String> redactContent(Collection<String> input,
                                String replacement,
                                Likelihood minLikelihood,
                                List<InfoType> infoTypes) {
    // Replace select info types with chosen replacement string
    final Collection<RedactContentRequest.ReplaceConfig> replaceConfigs = infoTypes.stream()
            .map(it -> RedactContentRequest.ReplaceConfig.newBuilder().setInfoType(it).setReplaceWith(replacement).build())
            .collect(Collectors.toCollection(LinkedList::new));

    final InspectConfig inspectConfig =
            InspectConfig.newBuilder()
                    .addAllInfoTypes(infoTypes)
                    .setMinLikelihood(minLikelihood)
                    .build();

    long itemCount = 0;

    try (DlpServiceClient dlpClient = DlpServiceClient.create(settings)) {
        // Google's DLP library is limited to 100 items per request, so the requests need to be chunked if the
        // number of input items is greater.

        Stream.Builder<Stream<ContentItem>> streamBuilder = Stream.builder();

        for (long processed = 0; processed < input.size(); processed += maxItemsPerRequest) {
            Collection<ContentItem> items =
                    input.stream()
                            .skip(processed)
                            .limit(maxItemsPerRequest)
                            .filter(item -> item != null && !item.isEmpty())
                            .map(item ->
                                    ContentItem.newBuilder()
                                            .setType(MediaType.PLAIN_TEXT_UTF_8.toString())
                                            .setData(ByteString.copyFrom(item.getBytes(Charset.forName("UTF-8"))))
                                            .build()
                            )
                            .collect(Collectors.toCollection(LinkedList::new));
            RedactContentRequest request = RedactContentRequest.newBuilder()
                    .setInspectConfig(inspectConfig)
                    .addAllItems(Collections.unmodifiableCollection(items))
                    .addAllReplaceConfigs(replaceConfigs)
                    .build();

            RedactContentResponse contentResponse = dlpClient.redactContent(request);
            itemCount += contentResponse.getItemsCount();
            streamBuilder.add(contentResponse.getItemsList().stream());
        }

        return streamBuilder.build()
                        .flatMap(stream -> stream.map(item -> item.getData().toStringUtf8()))
                        .collect(Collectors.toCollection(LinkedList::new));
    }
}

1 ответ

Решение

Контекст может влиять на результаты. Также в случае адреса части адреса могут влиять на другие части. Например, "Mountain View CA 94043" может соответствовать как МЕСТО, но просто "94043" может не совпадать. При выполнении этого анализа мы не пересекаем границы ячеек при выборе контекста, поэтому во втором примере ArrayList каждая строка рассматривается отдельно (в своем собственном контексте).

Примечание. Я - премьер-министр DLP API.

Другие вопросы по тегам