Crea un detector de diccionarios personalizado normal

Los diccionarios personalizados proporcionan la capacidad simple pero potente de hacer coincidir una lista de palabras o frases. Esto puede funcionar como su propio detector único y se puede usar a fin de crear una lista de excepciones para detectores incorporados. También puedes usar diccionarios personalizados a fin de mejorar los detectores de Infotipo incorporados para que coincidan con los resultados adicionales.

Anatomía de un detector de Infotipo personalizado de diccionario

Como se resume en la Descripción general de la API, para crear un detector de Infotipo personalizado de diccionario, debes definir un objeto CustomInfoType que contenga lo siguiente:

  • El nombre que desees darle al detector de Infotipo personalizado, dentro de un objeto InfoType.
  • Un valor Likelihood opcional. Si omites esto, las coincidencias con los elementos del diccionario mostrarán una probabilidad predeterminada POSSIBLE.
  • Objetos DetectionRule opcionales o reglas de palabra clave. Estas reglas ajustan la probabilidad de resultados dentro de una proximidad determinada de las palabras clave específicas. Obtén más información sobre las reglas de palabras clave en Personaliza la probabilidad de coincidencia.
  • Un Dictionary, como una WordList que contiene una lista de palabras para analizar o una CloudStoragePath a un archivo de solo texto que contiene una lista de palabras delimitadas por saltos de línea que se analizarán.

Como un objeto JSON, un detector de Infotipo personalizado de diccionario que incluye todos los componentes opcionales se ve de la siguiente manera. (Este JSON incluye una ruta de acceso a un archivo de texto del diccionario almacenado en Cloud Storage; si deseas ver una lista de palabras intercaladas, consulta la sección Ejemplos, más adelante en este tema).

{
  "customInfoTypes":[
    {
      "infoType":{
        "name":"[CUSTOM_INFOTYPE_NAME]"
      },
      "likelihood":"[LIKELIHOOD_VALUE]",
      "detectionRules":[
        {
          "hotwordRule":{
            [HOTWORDRULE_OBJECT]
          }
        },
        ...
      ],
      "dictionary":
      {
        "cloudStoragePath":
        {
          "path": "gs://[PATH_TO_TXT_FILE]"
        }
      }
    }
  ],
  ...
}

Diccionarios personalizados almacenados

Cloud DLP también admite diccionarios personalizados almacenados para inspeccionar repositorios de almacenamiento. Mediante un diccionario personalizado almacenado, Cloud DLP puede buscar, por ejemplo, cientos de millones de nombres de usuario, direcciones de correo electrónico o cualquier otra string, como se define en “Detalles de coincidencia en el diccionario”. Además, Cloud DLP incluye una funcionalidad integrada para que puedas volver a compilar tu diccionario personalizado almacenado de manera programática según sea necesario.

Los diccionarios personalizados almacenados se compilan a partir de recolecciones de frases ubicadas en un depósito de Cloud Storage o en una tabla de BigQuery de tu organización. La primera vez que crees un diccionario personalizado almacenado, debes ingresar las frases que quieras buscar en Cloud Storage o BigQuery y, luego, usar Cloud DLP para generar el diccionario personalizado almacenado. El diccionario personalizado se almacena en Cloud Storage. Cuando agregas o quitas palabras del depósito de Cloud Storage o de la tabla de BigQuery donde las almacenas, usa Cloud DLP para volver a compilar el diccionario personalizado almacenado.

Para obtener más información sobre la creación de diccionarios personalizados almacenados, consulta Crea un detector de diccionario personalizado almacenado.

Detalles de coincidencias en el diccionario

Aquí tienes una guía sobre cómo Cloud DLP detecta coincidencias entre palabras y frases del diccionario. Estos puntos se aplican a los diccionarios personalizados normales y almacenados:

  • Las palabras del diccionario no distinguen entre mayúsculas y minúsculas. Si tu diccionario incluye Abby, coincidirá con abby, ABBY, Abby, etcétera.
  • Todos los caracteres, en los diccionarios o en el contenido que se va a analizar, excepto las letras y los dígitos en el plano multilingüe básico de Unicode, se consideran como espacios en blanco cuando se buscan coincidencias. Si el diccionario busca Abby Abernathy, coincidirá con abby abernathy, Abby, Abernathy, Abby (ABERNATHY), etcétera.
  • Los caracteres que rodean cualquier coincidencia deben ser de un tipo diferente (letras o dígitos) de los caracteres adyacentes dentro de la palabra. Si tu diccionario analiza Abi, coincidirá con los tres primeros caracteres de Abi904, pero no de Abigail.
  • Las palabras del diccionario que contienen una gran cantidad de caracteres que no son letras o dígitos pueden generar resultados inesperados, ya que esos caracteres se tratan como espacios en blanco.

Ejemplos

Lista de palabras simples

Supongamos que tienes datos que incluyen en qué habitación de hospital se trató a un paciente durante una visita. Estas ubicaciones se pueden considerar sensibles en un conjunto de datos en particular, pero no son algo que los detectores integrados de Cloud DLP identifiquen.

Las habitaciones se catalogaron de la siguiente manera:

  • “RM-Orange”
  • “RM-Yellow”
  • “RM-Green”

Protocolo

En el siguiente ejemplo de JSON, se define un diccionario personalizado que podrías usar para desidentificar los números de habitaciones personalizados.

Entrada de JSON:

POST https://dlp.googleapis.com/v2/projects/[PROJECT_ID]/content:deidentify?key={YOUR_API_KEY}

{
  "item":{
    "value":"Patient was seen in RM-YELLOW then transferred to rm green."
  },
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "primitiveTransformation":{
            "replaceWithInfoTypeConfig":{

            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "customInfoTypes":[
      {
        "infoType":{
          "name":"CUSTOM_ROOM_ID"
        },
        "dictionary":{
          "wordList":{
            "words":[
              "RM-GREEN",
              "RM-YELLOW",
              "RM-ORANGE"
            ]
          }
        }
      }
    ]
  }
}

Salida de JSON:

Cuando publicamos la entrada JSON en content:deidentify, se muestra la siguiente salida de JSON:

{
  "item":{
    "value":"Patient was seen in [CUSTOM_ROOM_ID] then transferred to [CUSTOM_ROOM_ID]."
  },
  "overview":{
    "transformedBytes":"17",
    "transformationSummaries":[
      {
        "infoType":{
          "name":"CUSTOM_ROOM_ID"
        },
        "transformation":{
          "replaceWithInfoTypeConfig":{

          }
        },
        "results":[
          {
            "count":"2",
            "code":"SUCCESS"
          }
        ],
        "transformedBytes":"17"
      }
    ]
  }
}

Cloud DLP identificó de forma correcta los números de sala especificados en el mensaje WordList del diccionario personalizado. Ten en cuenta que los elementos coinciden incluso cuando falta la mayúscula y el guion (-), como en el segundo ejemplo, “rm green”.

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.CustomInfoType;
import com.google.privacy.dlp.v2.CustomInfoType.Dictionary;
import com.google.privacy.dlp.v2.CustomInfoType.Dictionary.WordList;
import com.google.privacy.dlp.v2.DeidentifyConfig;
import com.google.privacy.dlp.v2.DeidentifyContentRequest;
import com.google.privacy.dlp.v2.DeidentifyContentResponse;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InfoTypeTransformations;
import com.google.privacy.dlp.v2.InfoTypeTransformations.InfoTypeTransformation;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.PrimitiveTransformation;
import com.google.privacy.dlp.v2.ReplaceWithInfoTypeConfig;
import java.io.IOException;

public class DeIdentifyWithSimpleWordList {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String textToDeIdentify = "Patient was seen in RM-YELLOW then transferred to rm green.";
    deidentifyWithSimpleWordList(projectId, textToDeIdentify);
  }

  public static void deidentifyWithSimpleWordList(String projectId, String textToDeIdentify)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {

      // Specify what content you want the service to DeIdentify.
      ContentItem contentItem = ContentItem.newBuilder().setValue(textToDeIdentify).build();

      // Construct the word list to be detected
      Dictionary wordList =
          Dictionary.newBuilder()
              .setWordList(
                  WordList.newBuilder()
                      .addWords("RM-GREEN")
                      .addWords("RM-YELLOW")
                      .addWords("RM-ORANGE")
                      .build())
              .build();

      // Specify the word list custom info type the inspection will look for.
      InfoType infoType = InfoType.newBuilder().setName("CUSTOM_ROOM_ID").build();
      CustomInfoType customInfoType =
          CustomInfoType.newBuilder().setInfoType(infoType).setDictionary(wordList).build();
      InspectConfig inspectConfig =
          InspectConfig.newBuilder().addCustomInfoTypes(customInfoType).build();

      // Define type of deidentification as replacement.
      PrimitiveTransformation primitiveTransformation =
          PrimitiveTransformation.newBuilder()
              .setReplaceWithInfoTypeConfig(ReplaceWithInfoTypeConfig.getDefaultInstance())
              .build();

      // Associate deidentification type with info type.
      InfoTypeTransformation transformation =
          InfoTypeTransformation.newBuilder()
              .addInfoTypes(infoType)
              .setPrimitiveTransformation(primitiveTransformation)
              .build();

      // Construct the configuration for the Redact request and list all desired transformations.
      DeidentifyConfig deidentifyConfig =
          DeidentifyConfig.newBuilder()
              .setInfoTypeTransformations(
                  InfoTypeTransformations.newBuilder().addTransformations(transformation))
              .build();

      // Combine configurations into a request for the service.
      DeidentifyContentRequest request =
          DeidentifyContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(contentItem)
              .setInspectConfig(inspectConfig)
              .setDeidentifyConfig(deidentifyConfig)
              .build();

      // Send the request and receive response from the service
      DeidentifyContentResponse response = dlp.deidentifyContent(request);

      // Print the results
      System.out.println(
          "Text after replace with infotype config: " + response.getItem().getValue());
    }
  }
}

C#


using System;
using Google.Api.Gax.ResourceNames;
using Google.Cloud.Dlp.V2;

public class DeidentifyWithSimpleWordList
{
    public static DeidentifyContentResponse Deidentify(string projectId, string text)
    {
        // Instantiate a client.
        var dlp = DlpServiceClient.Create();

        var contentItem = new ContentItem { Value = text };

        var wordList = new CustomInfoType.Types.Dictionary.Types.WordList
        {
            Words = { new string[] { "RM-GREEN", "RM-YELLOW", "RM-ORANGE" } }
        };

        var infoType = new InfoType
        {
            Name = "CUSTOM_ROOM_ID"
        };

        var customInfoType = new CustomInfoType
        {
            InfoType = infoType,
            Dictionary = new CustomInfoType.Types.Dictionary
            {
                WordList = wordList
            }
        };

        var inspectConfig = new InspectConfig
        {
            CustomInfoTypes =
            {
                customInfoType,
            }
        };
        var primitiveTransformation = new PrimitiveTransformation
        {
            ReplaceWithInfoTypeConfig = new ReplaceWithInfoTypeConfig { }
        };

        var transformation = new InfoTypeTransformations.Types.InfoTypeTransformation
        {
            InfoTypes = { infoType },
            PrimitiveTransformation = primitiveTransformation
        };

        var deidentifyConfig = new DeidentifyConfig
        {
            InfoTypeTransformations = new InfoTypeTransformations
            {
                Transformations = { transformation }
            }
        };

        var request = new DeidentifyContentRequest
        {
            Parent = new LocationName(projectId, "global").ToString(),
            InspectConfig = inspectConfig,
            DeidentifyConfig = deidentifyConfig,
            Item = contentItem
        };

        // Call the API.
        var response = dlp.DeidentifyContent(request);

        // Inspect the results.
        Console.WriteLine($"Deidentified content: {response.Item.Value}");
        return response;
    }
}

Lista de excepciones

Supongamos que tienes datos de registro que incluyen identificadores de clientes, como direcciones de correo electrónico, y deseas ocultar esta información. Sin embargo, estos registros también incluyen las direcciones de correo electrónico de los desarrolladores internos y no quieres ocultarlas.

Protocolo

En el siguiente ejemplo de JSON, se crea un diccionario personalizado que enumera un subconjunto de direcciones de correo electrónico dentro del mensaje WordList (jack@example.org y jill@example.org) y les asigna el nombre de Infotipo personalizado DEVELOPER_EMAIL. Con este JSON, se le indica a Cloud DLP que ignore las direcciones de correo electrónico especificadas y que reemplace todas las direcciones de correo electrónico que detecte por una string que corresponda a su Infotipo (en este caso, EMAIL_ADDRESS):

Entrada de JSON:

POST https://dlp.googleapis.com/v2/projects/[PROJECT_ID]/content:deidentify?key={YOUR_API_KEY}

{
  "item":{
    "value":"jack@example.org accessed customer record of user5@example.com"
  },
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "primitiveTransformation":{
            "replaceWithInfoTypeConfig":{

            }
          },
          "infoTypes":[
            {
              "name":"EMAIL_ADDRESS"
            }
          ]
        }
      ]
    }
  },
  "inspectConfig":{
    "customInfoTypes":[
      {
        "infoType":{
          "name":"DEVELOPER_EMAIL"
        },
        "dictionary":{
          "wordList":{
            "words":[
              "jack@example.org",
              "jill@example.org"
            ]
          }
        }
      }
    ],
    "infoTypes":[
      {
        "name":"EMAIL_ADDRESS"
      }
    ]
  }
}

Salida de JSON:

Cuando publicamos este JSON en content:deidentify, se muestra la siguiente salida de JSON:

{
  "item":{
    "value":"jack@example.org accessed customer record of [EMAIL_ADDRESS]"
  },
  "overview":{
    "transformedBytes":"17",
    "transformationSummaries":[
      {
        "infoType":{
          "name":"EMAIL_ADDRESS"
        },
        "transformation":{
          "replaceWithInfoTypeConfig":{

          }
        },
        "results":[
          {
            "count":"1",
            "code":"SUCCESS"
          }
        ],
        "transformedBytes":"17"
      }
    ]
  }
}

La salida identificó de forma correcta que el detector de Infotipo EMAIL_ADDRESS y el detector de Infotipo personalizado DEVELOPER_EMAIL coincidieron con user1@example.com y jack@example.org. Observa que, debido a que elegimos transformar solo EMAIL_ADDRESS, la dirección jack@example.org se mantuvo intacta.

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.CustomInfoType;
import com.google.privacy.dlp.v2.CustomInfoType.Dictionary;
import com.google.privacy.dlp.v2.CustomInfoType.Dictionary.WordList;
import com.google.privacy.dlp.v2.DeidentifyConfig;
import com.google.privacy.dlp.v2.DeidentifyContentRequest;
import com.google.privacy.dlp.v2.DeidentifyContentResponse;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InfoTypeTransformations;
import com.google.privacy.dlp.v2.InfoTypeTransformations.InfoTypeTransformation;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.PrimitiveTransformation;
import com.google.privacy.dlp.v2.ReplaceWithInfoTypeConfig;
import java.io.IOException;

public class DeIdentifyWithExceptionList {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String textToDeIdentify = "jack@example.org accessed customer record of user5@example.com";
    deIdentifyWithExceptionList(projectId, textToDeIdentify);
  }

  public static void deIdentifyWithExceptionList(String projectId, String textToDeIdentify)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create()) {

      // Specify what content you want the service to DeIdentify.
      ContentItem contentItem = ContentItem.newBuilder().setValue(textToDeIdentify).build();

      // Construct the custom word list to be detected.
      Dictionary wordList =
          Dictionary.newBuilder()
              .setWordList(
                  WordList.newBuilder()
                      .addWords("jack@example.org")
                      .addWords("jill@example.org")
                      .build())
              .build();

      // Construct the custom dictionary detector associated with the word list.
      InfoType developerEmail = InfoType.newBuilder().setName("DEVELOPER_EMAIL").build();
      CustomInfoType customInfoType =
          CustomInfoType.newBuilder().setInfoType(developerEmail).setDictionary(wordList).build();

      // Specify the word list custom info type and build-in info type the inspection will look for.
      InfoType emailAddress = InfoType.newBuilder().setName("EMAIL_ADDRESS").build();
      InspectConfig inspectConfig =
          InspectConfig.newBuilder()
              .addInfoTypes(emailAddress)
              .addCustomInfoTypes(customInfoType)
              .build();

      // Define type of deidentification as replacement.
      PrimitiveTransformation primitiveTransformation =
          PrimitiveTransformation.newBuilder()
              .setReplaceWithInfoTypeConfig(ReplaceWithInfoTypeConfig.getDefaultInstance())
              .build();

      // Associate de-identification type with info type.
      InfoTypeTransformation transformation =
          InfoTypeTransformation.newBuilder()
              .addInfoTypes(emailAddress)
              .setPrimitiveTransformation(primitiveTransformation)
              .build();

      // Construct the configuration for the de-id request and list all desired transformations.
      DeidentifyConfig deidentifyConfig =
          DeidentifyConfig.newBuilder()
              .setInfoTypeTransformations(
                  InfoTypeTransformations.newBuilder().addTransformations(transformation))
              .build();

      // Combine configurations into a request for the service.
      DeidentifyContentRequest request =
          DeidentifyContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString())
              .setItem(contentItem)
              .setInspectConfig(inspectConfig)
              .setDeidentifyConfig(deidentifyConfig)
              .build();

      // Send the request and receive response from the service
      DeidentifyContentResponse response = dlp.deidentifyContent(request);

      // Print the results
      System.out.println(
          "Text after replace with infotype config: " + response.getItem().getValue());
    }
  }
}

C#


using System;
using Google.Api.Gax.ResourceNames;
using Google.Cloud.Dlp.V2;

public class DeidentifyWithExceptionList
{
    public static DeidentifyContentResponse Deidentify(string projectId, string text)
    {
        // Instantiate a client.
        var dlp = DlpServiceClient.Create();

        var contentItem = new ContentItem { Value = text };

        var wordList = new CustomInfoType.Types.Dictionary.Types.WordList
        {
            Words = { new string[] { "jack@example.org", "jill@example.org" } }
        };

        var exclusionRule = new ExclusionRule
        {
            MatchingType = MatchingType.FullMatch,
            Dictionary = new CustomInfoType.Types.Dictionary
            {
                WordList = wordList
            }
        };

        var infoType = new InfoType { Name = "EMAIL_ADDRESS" };

        var inspectionRuleSet = new InspectionRuleSet
        {
            InfoTypes = { infoType },
            Rules = { new InspectionRule { ExclusionRule = exclusionRule } }
        };

        var inspectConfig = new InspectConfig
        {
            InfoTypes = { infoType },
            RuleSet = { inspectionRuleSet }
        };
        var primitiveTransformation = new PrimitiveTransformation
        {
            ReplaceWithInfoTypeConfig = new ReplaceWithInfoTypeConfig { }
        };

        var transformation = new InfoTypeTransformations.Types.InfoTypeTransformation
        {
            InfoTypes = { infoType },
            PrimitiveTransformation = primitiveTransformation
        };

        var deidentifyConfig = new DeidentifyConfig
        {
            InfoTypeTransformations = new InfoTypeTransformations
            {
                Transformations = { transformation }
            }
        };

        var request = new DeidentifyContentRequest
        {
            Parent = new LocationName(projectId, "global").ToString(),
            InspectConfig = inspectConfig,
            DeidentifyConfig = deidentifyConfig,
            Item = contentItem
        };

        // Call the API.
        var response = dlp.DeidentifyContent(request);

        // Inspect the results.
        Console.WriteLine($"Deidentified content: {response.Item.Value}");
        return response;
    }
}

Mejora un detector de Infotipo incorporado

Considera una situación en la que un detector de Infotipo incorporado no muestra los valores correctos. Por ejemplo, deseas que se muestren las coincidencias en nombres de personas, pero el detector incorporado de Cloud DLP PERSON_NAME no puede mostrar las coincidencias en algunos nombres de personas que son comunes dentro de tu conjunto de datos.

Cloud DLP te permite mejorar los detectores de Infotipo incorporados mediante la inclusión de un detector integrado en la declaración para un detector de Infotipo personalizado, como se muestra en el siguiente ejemplo. En este fragmento, se ilustra cómo configurar Cloud DLP para que el detector de Infotipo incorporado PERSON_NAME coincida, además, con el nombre “Quasimodo”:

...
  "inspectConfig":{
    "customInfoTypes":[
      {
        "infoType":{
          "name":"PERSON_NAME"
        },
        "dictionary":{
          "wordList":{
            "words":[
              "quasimodo"
            ]
          }
        }
      }
    ]
  }
...