Benutzerdefinierten Regex-Detektor erstellen

Ein benutzerdefinierter, auf einem regulären Ausdruck (Regex) basierender infoType-Detektor ermöglicht es Ihnen, eigene Detektoren zu erstellen, mit denen Cloud DLP Übereinstimmungen anhand eines Regex-Musters erkennen kann. Nehmen wir beispielsweise an, Sie hätten Krankenaktennummern im Format ###-#-#####. Sie könnten ein Regex-Muster wie das Folgende definieren:

[0-9]{3}-[0-9]{1}-[0-9]{5}

Cloud DLP prüft dann auf Übereinstimmungen mit Elementen wie diesem:

012-4-56789

Anatomie eines benutzerdefinierten Regex-infoType-Detektors

Wie in der API-Übersicht dargestellt, definieren Sie zum Erstellen eines benutzerdefinierten Regex-infoType-Detektors ein CustomInfoTypeCustomInfoType-Objekt, das Folgendes enthält:

  • Der Name, den Sie dem benutzerdefinierten infoType-Detektor innerhalb eines InfoType-Objekts geben möchten.
  • Einen optionalen Wert Likelihood. Wenn Sie diese Angabe weglassen, wird bei Übereinstimmungen mit regulären Ausdrücken die Standardwahrscheinlichkeit VERY_LIKELY zurückgegeben. Wenn Sie feststellen, dass ein benutzerdefinierter Regex-infoType-Detektor zu viele falsche positive Ergebnisse zurückgibt, versuchen Sie, die Basiswahrscheinlichkeit zu reduzieren, und verwenden Sie Erkennungsregeln, um die Wahrscheinlichkeit mithilfe von Kontextinformationen zu erhöhen. Weitere Informationen finden Sie unter Ergebnis-Wahrscheinlichkeit anpassen.
  • Optionale DetectionRule oder Hotword-Regeln. Diese Regeln passen die Wahrscheinlichkeit von Ergebnissen innerhalb einer gegebenen Nähe von angegebenen Hotwords an. Weitere Informationen zu Hotword-Regeln finden Sie unter Ergebnis-Wahrscheinlichkeit anpassen.
  • Ein Regex-Objekt, das aus einem einzelnen Muster besteht, das den regulären Ausdruck definiert.

Als JSON-Objekt sieht ein benutzerdefinierter Regex-infoType-Detektor, der alle optionalen Komponenten enthält, so aus:

{
  "customInfoTypes":[
    {
      "infoType":{
        "name":"[CUSTOM_INFOTYPE_NAME]"
      },
      "likelihood":"[LIKELIHOOD_VALUE]",
      "detectionRules":[
        {
          "hotwordRule":{
            [HOTWORDRULE_OBJECT]
          }
        },
        ...
      ],
      "regex":{
        "pattern":"[REGEX_PATTERN]"
      }
    }
  ],
  ...
}

Regex-Beispiel: Krankenaktennummern abgleichen

Das folgende JSON-Code-Snippet und der folgende Code in mehreren Sprachen unten zeigen einen benutzerdefinierten infoType-Detektor mit regulärem Ausdruck, der Cloud DLP anweist, eine Krankenaktennummer (Medical Record Number, MRN) im Eingabetext "Patient's MRN 444-5-22222" zuzuordnen und jeder Übereinstimmung eine Wahrscheinlichkeit von POSSIBLE zuzuweisen.

Protokoll

Weitere Informationen zur Verwendung der Cloud DLP API mit JSON finden Sie in der JSON-Kurzanleitung.

JSON-Eingabe:

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

{
  "item":{
    "value":"Patients MRN 444-5-22222"
  },
  "inspectConfig":{
    "customInfoTypes":[
      {
        "infoType":{
          "name":"C_MRN"
        },
        "regex":{
          "pattern":"[1-9]{3}-[1-9]{1}-[1-9]{5}"
        },
        "likelihood":"POSSIBLE"
      }
    ]
  }
}

JSON-Ausgabe:

{
  "result":{
    "findings":[
      {
        "infoType":{
          "name":"C_MRN"
        },
        "likelihood":"POSSIBLE",
        "location":{
          "byteRange":{
            "start":"13",
            "end":"24"
          },
          "codepointRange":{
            "start":"13",
            "end":"24"
          }
        },
        "createTime":"2018-11-30T01:29:37.799Z"
      }
    ]
  }
}

Die Ausgabe zeigt, dass Cloud DLP mithilfe des benutzerdefinierten infoType-Detektors (den wir "C_MRN" genannt haben) und dem zugehörigen benutzerdefinierten regulären Ausdruck die Krankenaktennummer korrekt identifiziert und ihr eine Wahrscheinlichkeit von POSSIBLE zugewiesen hat, wie von uns festgelegt.

Wenn Sie die Übereinstimmungswahrscheinlichkeit anpassen möchten, bauen Sie auf diesem Beispiel auf, um Kontextwörter einzubeziehen.

Java


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.privacy.dlp.v2.ByteContentItem;
import com.google.privacy.dlp.v2.ByteContentItem.BytesType;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.CustomInfoType;
import com.google.privacy.dlp.v2.CustomInfoType.Regex;
import com.google.privacy.dlp.v2.Finding;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.InspectContentRequest;
import com.google.privacy.dlp.v2.InspectContentResponse;
import com.google.privacy.dlp.v2.Likelihood;
import com.google.privacy.dlp.v2.LocationName;
import com.google.protobuf.ByteString;
import java.io.IOException;

public class InspectWithCustomRegex {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String textToInspect = "Patients MRN 444-5-22222";
    String customRegexPattern = "[1-9]{3}-[1-9]{1}-[1-9]{5}";
    inspectWithCustomRegex(projectId, textToInspect, customRegexPattern);
  }

  // Inspects a BigQuery Table
  public static void inspectWithCustomRegex(
      String projectId, String textToInspect, String customRegexPattern) 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 the type and content to be inspected.
      ByteContentItem byteItem =
          ByteContentItem.newBuilder()
              .setType(BytesType.TEXT_UTF8)
              .setData(ByteString.copyFromUtf8(textToInspect))
              .build();
      ContentItem item = ContentItem.newBuilder().setByteItem(byteItem).build();

      // Specify the regex pattern the inspection will look for.
      Regex regex = Regex.newBuilder().setPattern(customRegexPattern).build();

      // Construct the custom regex detector.
      InfoType infoType = InfoType.newBuilder().setName("C_MRN").build();
      CustomInfoType customInfoType =
          CustomInfoType.newBuilder()
              .setInfoType(infoType)
              .setRegex(regex)
              .build();

      // Construct the configuration for the Inspect request.
      InspectConfig config =
          InspectConfig.newBuilder()
              .addCustomInfoTypes(customInfoType)
              .setIncludeQuote(true)
              .setMinLikelihood(Likelihood.POSSIBLE)
              .build();

      // Construct the Inspect request to be sent by the client.
      InspectContentRequest request =
          InspectContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, "global").toString()).setItem(item)
              .setInspectConfig(config)
              .build();

      // Use the client to send the API request.
      InspectContentResponse response = dlp.inspectContent(request);

      // Parse the response and process results
      System.out.println("Findings: " + response.getResult().getFindingsCount());
      for (Finding f : response.getResult().getFindingsList()) {
        System.out.println("\tQuote: " + f.getQuote());
        System.out.println("\tInfo type: " + f.getInfoType().getName());
        System.out.println("\tLikelihood: " + f.getLikelihood());
      }
    }
  }
}

Python

def inspect_with_medical_record_number_custom_regex_detector(
    project,
    content_string,
):
    """Uses the Data Loss Prevention API to analyze string with medical record
       number custom regex detector
    Args:
        project: The Google Cloud project id to use as a parent resource.
        content_string: The string to inspect.
    Returns:
        None; the response from the API is printed to the terminal.
    """

    # Import the client library.
    import google.cloud.dlp

    # Instantiate a client.
    dlp = google.cloud.dlp_v2.DlpServiceClient()

    # Construct a custom regex detector info type called "C_MRN",
    # with ###-#-##### pattern, where each # represents a digit from 1 to 9.
    # The detector has a detection likelihood of POSSIBLE.
    custom_info_types = [
        {
            "info_type": {"name": "C_MRN"},
            "regex": {"pattern": "[1-9]{3}-[1-9]{1}-[1-9]{5}"},
            "likelihood": "POSSIBLE",
        }
    ]

    # Construct the configuration dictionary with the custom regex info type.
    inspect_config = {
        "custom_info_types": custom_info_types,
    }

    # Construct the `item`.
    item = {"value": content_string}

    # Convert the project id into a full resource id.
    parent = dlp.project_path(project)

    # Call the API.
    response = dlp.inspect_content(parent, inspect_config, item)

    # Print out the results.
    if response.result.findings:
        for finding in response.result.findings:
            try:
                if finding.quote:
                    print(f"Quote: {finding.quote}")
            except AttributeError:
                pass
            print(f"Info type: {finding.info_type.name}")
            print(f"Likelihood: {finding.likelihood}")
    else:
        print("No findings.")