Détection d'entités à l'aide d'expressions régulières

Tout comme pour la détection d'entités à l'aide de dictionnaires, vous pouvez utiliser des expressions régulières pour détecter des entités.

Les expressions régulières ne sont pas stockées dans des fichiers comme des dictionnaires, mais en mémoire, au sein d'une configuration d'expressions régulières. Vous pouvez utiliser plusieurs configurations d'expressions régulières au cours d'une même extraction.

Les expressions régulières que vous définissez à l'aide de la fonctionnalité de traitement du langage naturel d' Watson peuvent utiliser des délimiteurs de tokens. De cette façon, vous pouvez vous assurer que votre expression régulière correspond à un ou plusieurs tokens. C'est un avantage indéniable par rapport aux moteurs d'expressions régulières plus simples, en particulier lorsque l'on travaille avec une langue qui ne comporte pas d'espaces, comme le chinois.

Les expressions régulières sont traitées par un composant dédié appelé « Rule-Based Runtime », ou RBR en abrégé.

Création de configurations d'expressions régulières

Commencez par créer un répertoire « modules » dans votre notebook. Il s'agit d'un répertoire situé dans le système de fichiers du notebook, utilisé temporairement pour stocker les fichiers créés lors de l'entraînement RBR. Ce répertoire de modules peut être le même que celui que vous avez créé et utilisé pour l'extraction d'entités à partir d'un dictionnaire. Les dictionnaires et les expressions régulières peuvent être utilisés lors d'un même cycle d'apprentissage.

Pour créer le répertoire des modules dans votre notebook, saisissez ce qui suit dans une cellule de code. Notez que le répertoire du module ne doit pas contenir de tiret (-).

import os
import watson_nlp
module_folder = "NLP_RBR_Module_2"
os.makedirs(module_folder, exist_ok=True)

Une configuration d'expression régulière est un dictionnaire de type ` Python `, comportant les attributs suivants :

Attributs disponibles dans les configurations d'expression régulière avec leurs valeurs, descriptions d'utilisation et indication si nécessaire ou non
Attribut Valeur Descriptif Obligatoire
name chaîne Le nom de l'expression régulière. Les occurrences de l'expression régulière dans le texte d'entrée sont identifiées par ce nom dans le résultat. Oui
regexes liste (chaîne de motifs d'expressions régulières Perl) Ne doit pas être vide. Il est possible de fournir plusieurs expressions régulières. Oui
flags Chaîne délimitée contenant des indicateurs valides Des indicateurs tels que UNICODE ou CASE_INSENSITIVE déterminent les règles de correspondance. Il peut également s'agir d'une combinaison de drapeaux. Pour connaître les indicateurs pris en charge, consultez la section « Pattern » (Java Platform SE 8). Non (valeur par défaut : DOTALL)
token_boundary.min entier token_boundary indique s'il faut faire correspondre l'expression régulière uniquement aux limites des tokens. Spécifié sous la forme d'un objet dictionnaire comportant les minmax attributs et. Non (renvoie la correspondance non chevauchante la plus longue à chaque position de caractère dans le texte d'entrée)
token_boundary.max entier max est un attribut facultatif pour token_boundary et requis lorsque la limite doit être étendue pour une plage (entre les jetons min et max ). token_boundary.max doit être >= token_boundary.min Non (si token_boundary est spécifié, min l'attribut peut être utilisé seul)
groups liste (chaînes de caractères correspondant aux groupes) L'index de la chaîne dans la liste correspond au groupe trouvé dans le motif, en commençant par 1, l'index 0 correspondant à la correspondance complète. Par exemple : « regex: (a)(b) on » ab suivi de « with » group: ['full', 'first', 'second'] donnera full: ab, first: a, second: b Non (par défaut : correspondance d'étiquette en cas de correspondance exacte)

Les configurations d'expressions régulières peuvent être chargées à l'aide des méthodes d'aide suivantes :

  • Pour charger une seule configuration d'expression régulière, utilisez watson_nlp.toolkit.RegexConfig.load(<regex configuration>)
  • Pour charger plusieurs configurations d'expressions régulières, utilisez watson_nlp.toolkit.RegexConfig.load_all([<regex configuration>)])

Exemple de code

Cet exemple vous montre comment charger deux configurations d'expressions régulières différentes. La première configuration détecte les noms de personnes. Il utilise l'attribut « groups » pour permettre d'accéder facilement au nom complet, au prénom et au nom de famille ultérieurement.

La deuxième configuration détecte les acronymes sous la forme d'une suite de caractères entièrement en majuscules. L'utilisation de l'attribut `token_boundary` permet d'éviter les correspondances dans les mots contenant à la fois des majuscules et des minuscules.

from watson_nlp.toolkit.rule_utils import RegexConfig

# Load some regex configs, for instance to match First names or acronyms
regexes = RegexConfig.load_all([
    {
        'name': 'full names',
        'regexes': ['([A-Z][a-z]*) ([A-Z][a-z]*)'],
        'groups': ['full name', 'first name', 'last name']
    },
    {
        'name': 'acronyms',
        'regexes': ['([A-Z]+)'],
        'groups': ['acronym'],
        'token_boundary': {
            'min': 1,
            'max': 1
        }
    }
])

Entraînement d'un modèle utilisant des expressions régulières

Une fois les configurations d'expressions régulières chargées, créez un modèle RBR à l'aide de la RBR.train() méthode. Dans la méthode, précisez :

  • Le répertoire des modules
  • La langue du texte
  • Les configurations d'expressions régulières à utiliser

Il s'agit de la même méthode que celle utilisée pour entraîner le RBR avec l'extraction basée sur un dictionnaire. Vous pouvez transmettre la configuration du dictionnaire dans le même appel de méthode.

Exemple de code

# Train the RBR model
custom_regex_block = watson_nlp.resources.feature_extractor.RBR.train(module_path=module_folder, language='en', regexes=regexes)

Application du modèle à de nouvelles données

Une fois les dictionnaires entraînés, appliquez le modèle à de nouvelles données à l'aide de la run() méthode, comme vous le feriez avec n'importe quel bloc pré-entraîné existant.

Exemple de code

custom_regex_block.run('Bruce Wayne works for NASA')

Résultat de l'exemple de code :

{(0, 11): ['regex::full names'], (0, 5): ['regex::full names'], (6, 11): ['regex::full names'], (22, 26): ['regex::acronyms']}

Pour afficher les sous-groupes correspondants ou le texte correspondant :

import json
# Get the raw response including matching groups
full_regex_result = custom_regex_block.executor.get_raw_response('Bruce Wayne works for NASA‘, language='en')
print(json.dumps(full_regex_result, indent=2))

Résultat de l'exemple de code :

{
  "annotations": {
    "View_full names": [
      {
        "label": "regex::full names",
        "fullname": {
          "location": {
            "begin": 0,
            "end": 11
          },
          "text": "Bruce Wayne"
        },
        "firstname": {
          "location": {
            "begin": 0,
            "end": 5
          },
          "text": "Bruce"
        },
        "lastname": {
          "location": {
            "begin": 6,
            "end": 11
          },
          "text": "Wayne"
        }
      }
    ],
    "View_acronyms": [
      {
        "label": "regex::acronyms",
        "acronym": {
          "location": {
            "begin": 22,
            "end": 26
          },
          "text": "NASA"
        }
      }
    ]
  },
...
}