Envoyer des demandes d'ajout d'étiquettes à du texte

Le service AI Platform d'ajout d'étiquettes aux données est compatible avec trois types de tâches d'ajout d'étiquettes à du texte :

  • Les tâches de classification, où les étiqueteurs attribuent une ou plusieurs étiquettes à chaque segment de texte. Vous pouvez spécifier le nombre d'étiqueteurs associés à chaque segment de texte. Nous vous recommandons de ne pas en avoir plus de cinq. Le service d'étiquetage des données effectue ensuite un vote majoritaire pour déterminer quelles étiquettes sont appropriées.
  • Les tâches de classification avec sentiment, où la saisie d'étiquette est globalement identique à celle des tâches de classification du texte. Ce type d'étiquetage n'est plus pris en charge dans le service d'ajout d'étiquetage de données. Vous pouvez accéder à la Cloud AI Platform unifiée pour ce type d'étiquettes.
  • Les tâches d'extraction d'entité, où l'étiqueteur reçoit une liste d'étiquettes et un segment de texte (contenant jusqu'à 100 000 caractères) et sélectionne le début et la fin du texte se rapportant à chaque étiquette. L'étiqueteur a également la possibilité de sélectionner "non inclus". Le service d'ajout d'étiquettes aux données collecte les index du texte sélectionné pour chaque étiquette.

La demande d'ajout d'étiquettes est une opération de longue durée. La réponse inclut un ID d'opération qui vous permet de vérifier l'état de la demande. Lorsque l'ajout d'étiquettes est terminé, la réponse inclut la valeur "done": true.

Veuillez noter que seul le texte en anglais est accepté.

Tâches de classification du texte

UI Web

  1. Ouvrez l'interface utilisateur du service d'ajout d'étiquettes aux données.

  2. Sélectionnez Ensembles de données dans le menu de navigation de gauche.

    La page Ensembles de données indique l'état des ensembles de données créés précédemment pour le projet en cours.

  3. Cliquez sur le nom de l'ensemble de données pour lequel vous souhaitez demander un ajout d'étiquettes.

    Les ensembles de données dont l'état est Importation terminée peuvent être envoyés. La colonne Type de données indique si l'ensemble de données inclut des images, des vidéos ou du texte.

  4. Sur la page Détails relatifs à l'ensemble de données, cliquez sur le bouton Créer une tâche d'étiquetage dans la barre de titre.

  5. Sur la page Nouvelle tâche d'ajout d'étiquettes, saisissez un nom et une description pour l'ensemble de données annoté.

    L'ensemble de données annoté (annotated dataset) correspond à la version de cet ensemble de données étiqueté manuellement.

  6. Dans le menu déroulant Objectif, sélectionnez le type de tâche d'ajout d'étiquettes que vous souhaitez appliquer à cet ensemble de données.

    La liste déroulante n'inclut que les objectifs disponibles pour le type des données contenues dans cet ensemble de données. Si vous ne trouvez pas l'objectif que vous souhaitez, vous avez probablement sélectionné un ensemble de données contenant un type de données différent. Fermez la page Nouvelle tâche d'ajout d'étiquettes et sélectionnez un autre ensemble de données.

  7. Dans le menu déroulant Ensemble d'étiquettes, choisissez l'ensemble d'étiquettes que les étiqueteurs devront appliquer aux éléments de données de cet ensemble.

    La liste déroulante inclut tous les ensembles d'étiquettes associés à ce projet. Vous devez choisir un ensemble.

  8. Dans le menu déroulant Instruction, choisissez les instructions que vous souhaitez fournir aux étiqueteurs travaillant sur cet ensemble de données.

    La liste déroulante inclut toutes les instructions associées à ce projet. Vous devez inclure des instructions dans la demande d'étiquetage.

  9. Dans le menu déroulant Étiqueteurs par élément de données, spécifiez le nombre d'étiqueteurs qui devront examiner chaque élément de l'ensemble de données.

    La valeur par défaut est d'un étiqueteur par élément, mais vous pouvez demander à ce que trois ou cinq étiqueteurs travaillent sur chaque élément.

  10. Cochez la case pour confirmer que vous comprenez comment l'ajout d'étiquettes vous sera facturé.

  11. Cliquez sur Créer.

Ligne de commande

Définissez les variables d'environnement suivantes :
  1. La variable PROJECT_ID à votre ID de projet Google Cloud
  2. La variable DATASET_ID à l'ID de votre ensemble de données, issue de la réponse obtenue lorsque vous avez créé l'ensemble de données. L'ID apparaît à la fin du nom complet de l'ensemble de données :

    projects/PROJECT_ID/locations/us-central1/datasets/DATASET_ID
  3. La variable INSTRUCTION_RESOURCE_NAME au nom de votre ressource d'instruction.
  4. La variable ANNOTATION_SPEC_SET_RESOURCE_NAME sur le nom de votre ressource d'ensemble d'étiquettes.
curl -X POST \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" \
  https://datalabeling.googleapis.com/v1beta1/projects/${PROJECT_ID}/datasets/${DATASET_ID}/text:label \
  -d '{
  "basicConfig": {
    "instruction": "${INSTRUCTION_RESOURCE_NAME}",
    "annotatedDatasetDisplayName": "curl_testing_annotated_dataset",
    "labelGroup": "test_label_group",
    "replica_count": 1
  },
  "feature": "TEXT_CLASSIFICATION",
  "textClassificationConfig": {
    "annotationSpecSet": "${ANNOTATION_SPEC_SET_RESOURCE_NAME}",
  },
}'

Des résultats semblables aux lignes suivantes devraient s'afficher : Vous pouvez obtenir l'état de la tâche à l'aide de l'ID d'opération. Obtenir l'état d'une opération en est un exemple.

{
  "name": "projects/data-labeling-codelab/operations/5c73dd6b_0000_2b34_a920_883d24fa2064",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.data-labeling.v1beta1.LabelTextClassificationOperationMetadata",
    "dataset": "projects/data-labeling-codelab/datasets/5c73db3d_0000_23e0_a25b_94eb2c119c4c"
  }
}

Java

Avant de pouvoir exécuter cet exemple de code, vous devez installer les bibliothèques clientes Java.
import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.datalabeling.v1beta1.AnnotatedDataset;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceClient;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceSettings;
import com.google.cloud.datalabeling.v1beta1.HumanAnnotationConfig;
import com.google.cloud.datalabeling.v1beta1.LabelOperationMetadata;
import com.google.cloud.datalabeling.v1beta1.LabelTextRequest;
import com.google.cloud.datalabeling.v1beta1.LabelTextRequest.Feature;
import com.google.cloud.datalabeling.v1beta1.SentimentConfig;
import com.google.cloud.datalabeling.v1beta1.TextClassificationConfig;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

class LabelText {

  // Start a Text Labeling Task
  static void labelText(
      String formattedInstructionName,
      String formattedAnnotationSpecSetName,
      String formattedDatasetName)
      throws IOException {
    // String formattedInstructionName = DataLabelingServiceClient.formatInstructionName(
    //      "YOUR_PROJECT_ID", "YOUR_INSTRUCTION_UUID");
    // String formattedAnnotationSpecSetName =
    //     DataLabelingServiceClient.formatAnnotationSpecSetName(
    //         "YOUR_PROJECT_ID", "YOUR_ANNOTATION_SPEC_SET_UUID");
    // String formattedDatasetName = DataLabelingServiceClient.formatDatasetName(
    //      "YOUR_PROJECT_ID", "YOUR_DATASET_UUID");


    DataLabelingServiceSettings settings =
        DataLabelingServiceSettings.newBuilder()
            .build();
    try (DataLabelingServiceClient dataLabelingServiceClient =
        DataLabelingServiceClient.create(settings)) {
      HumanAnnotationConfig humanAnnotationConfig =
          HumanAnnotationConfig.newBuilder()
              .setAnnotatedDatasetDisplayName("annotated_displayname")
              .setAnnotatedDatasetDescription("annotated_description")
              .setLanguageCode("en-us")
              .setInstruction(formattedInstructionName)
              .build();

      SentimentConfig sentimentConfig =
          SentimentConfig.newBuilder().setEnableLabelSentimentSelection(false).build();

      TextClassificationConfig textClassificationConfig =
          TextClassificationConfig.newBuilder()
              .setAnnotationSpecSet(formattedAnnotationSpecSetName)
              .setSentimentConfig(sentimentConfig)
              .build();

      LabelTextRequest labelTextRequest =
          LabelTextRequest.newBuilder()
              .setParent(formattedDatasetName)
              .setBasicConfig(humanAnnotationConfig)
              .setTextClassificationConfig(textClassificationConfig)
              .setFeature(Feature.TEXT_CLASSIFICATION)
              .build();

      OperationFuture<AnnotatedDataset, LabelOperationMetadata> operation =
          dataLabelingServiceClient.labelTextAsync(labelTextRequest);

      // You'll want to save this for later to retrieve your completed operation.
      // System.out.format("Operation Name: %s\n", operation.getName());

      // Cancel the operation to avoid charges when testing.
      dataLabelingServiceClient.getOperationsClient().cancelOperation(operation.getName());

    } catch (IOException | InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}

Tâches d'extraction d'entités

UI Web

  1. Ouvrez l'interface utilisateur du service d'ajout d'étiquettes aux données.

  2. Sélectionnez Ensembles de données dans le menu de navigation de gauche.

    La page Ensembles de données indique l'état des ensembles de données créés précédemment pour le projet en cours.

  3. Cliquez sur le nom de l'ensemble de données pour lequel vous souhaitez demander un ajout d'étiquettes.

    Les ensembles de données dont l'état est Importation terminée peuvent être envoyés. La colonne Type de données indique si l'ensemble de données inclut des images, des vidéos ou du texte.

  4. Sur la page Détails relatifs à l'ensemble de données, cliquez sur le bouton Créer une tâche d'étiquetage dans la barre de titre.

  5. Sur la page Nouvelle tâche d'ajout d'étiquettes, saisissez un nom et une description pour l'ensemble de données annoté.

    L'ensemble de données annoté (annotated dataset) correspond à la version de cet ensemble de données étiqueté manuellement.

  6. Dans le menu déroulant Objectif, sélectionnez le type de tâche d'ajout d'étiquettes que vous souhaitez appliquer à cet ensemble de données.

    La liste déroulante n'inclut que les objectifs disponibles pour le type des données contenues dans cet ensemble de données. Si vous ne trouvez pas l'objectif que vous souhaitez, vous avez probablement sélectionné un ensemble de données contenant un type de données différent. Fermez la page Nouvelle tâche d'ajout d'étiquettes et sélectionnez un autre ensemble de données.

  7. Dans le menu déroulant Ensemble d'étiquettes, choisissez l'ensemble d'étiquettes que les étiqueteurs devront appliquer aux éléments de données de cet ensemble.

    La liste déroulante inclut tous les ensembles d'étiquettes associés à ce projet. Vous devez choisir un ensemble.

  8. Dans le menu déroulant Instruction, choisissez les instructions que vous souhaitez fournir aux étiqueteurs travaillant sur cet ensemble de données.

    La liste déroulante inclut toutes les instructions associées à ce projet. Vous devez inclure des instructions dans la demande d'étiquetage.

  9. Dans le menu déroulant Étiqueteurs par élément de données, spécifiez le nombre d'étiqueteurs qui devront examiner chaque élément de l'ensemble de données.

    La valeur par défaut est d'un étiqueteur par élément, mais vous pouvez demander à ce que trois ou cinq étiqueteurs travaillent sur chaque élément.

  10. Cochez la case pour confirmer que vous comprenez comment l'ajout d'étiquettes vous sera facturé.

  11. Cliquez sur Créer.

Ligne de commande

Définissez les variables d'environnement suivantes :
  1. La variable PROJECT_ID à votre ID de projet Google Cloud
  2. La variable DATASET_ID à l'ID de votre ensemble de données, issue de la réponse obtenue lorsque vous avez créé l'ensemble de données. L'ID apparaît à la fin du nom complet de l'ensemble de données :

    projects/PROJECT_ID/locations/us-central1/datasets/DATASET_ID
  3. La variable INSTRUCTION_RESOURCE_NAME au nom de votre ressource d'instruction.
  4. La variable ANNOTATION_SPEC_SET_RESOURCE_NAME sur le nom de votre ressource d'ensemble d'étiquettes.
curl -X POST \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "Content-Type: application/json" \
  https://datalabeling.googleapis.com/v1beta1/projects/${PROJECT_ID}/datasets/${DATASET_ID}/text:label \
  -d '{
  "basicConfig": {
    "instruction": "${INSTRUCTION_RESOURCE_NAME}",
    "annotatedDatasetDisplayName": "curl_testing_annotated_dataset",
    "labelGroup": "test_label_group",
    "replica_count": 1
  },
  "feature": "TEXT_ENTITY_EXTRACTION",
  "textEntityExtractionConfig": {
    "annotationSpecSet": "${ANNOTATION_SPEC_SET_RESOURCE_NAME}",
  },
}'

Des résultats semblables aux lignes suivantes devraient s'afficher : Vous pouvez obtenir l'état de la tâche à l'aide de l'ID d'opération. Obtenir l'état d'une opération en est un exemple.

{
  "name": "projects/data-labeling-codelab/operations/5c73dd6b_0000_2b34_a920_883d24fa2064",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.data-labeling.v1beta1.LabelTextEntityExtractionOperationMetadata",
    "dataset": "projects/data-labeling-codelab/datasets/5c73db3d_0000_23e0_a25b_94eb2c119c4c"
  }
}

Python

Avant de pouvoir exécuter cet exemple de code, vous devez installer les bibliothèques clientes Python.

def label_text(
    dataset_resource_name, instruction_resource_name, annotation_spec_set_resource_name
):
    """Labels a text dataset."""
    from google.cloud import datalabeling_v1beta1 as datalabeling

    client = datalabeling.DataLabelingServiceClient()

    basic_config = datalabeling.HumanAnnotationConfig(
        instruction=instruction_resource_name,
        annotated_dataset_display_name="YOUR_ANNOTATED_DATASET_DISPLAY_NAME",
        label_group="YOUR_LABEL_GROUP",
        replica_count=1,
    )

    feature = datalabeling.LabelTextRequest.Feature.TEXT_ENTITY_EXTRACTION

    config = datalabeling.TextEntityExtractionConfig(
        annotation_spec_set=annotation_spec_set_resource_name
    )

    response = client.label_text(
        request={
            "parent": dataset_resource_name,
            "basic_config": basic_config,
            "feature": feature,
            "text_classification_config": config,
        }
    )

    print(f"Label_text operation name: {response.operation.name}")
    return response