De forma similar a la detección de entidades con diccionarios, puede utilizar coincidencias de patrones de expresiones regulares para detectar entidades.
Las expresiones regulares no se proporcionan en archivos como diccionarios, sino en la memoria dentro de una configuración de expresión regular. Puede utilizar varias configuraciones de expresión regular durante la misma extracción.
Las expresiones regulares que define con Watson Natural Language Processing pueden utilizar límites de señal. De este modo, puede asegurarse de que la expresión regular coincide con una o más señales. Se trata de una clara ventaja sobre los motores de expresión regular más simples, especialmente cuando se trabaja con un idioma que no está separado por espacios en blanco, como por ejemplo el chino.
Las expresiones regulares son procesadas por un componente dedicado llamado Tiempo de ejecución basado en reglas, o RBR para abreviar.
Creación de configuraciones de expresión regular
Empiece creando un directorio de módulos dentro del cuaderno. Se trata de un directorio dentro del sistema de archivos del cuaderno que se utiliza temporalmente para almacenar los archivos creados por el entrenamiento RBR. Este directorio de módulo puede ser el mismo directorio que ha creado y utilizado para la extracción de entidades basadas en diccionario. Los diccionarios y las expresiones regulares se pueden utilizar en la misma ejecución de entrenamiento.
Para crear el directorio de módulos en el cuaderno, especifique lo siguiente en una celda de código. Tenga en cuenta que el directorio del módulo no puede contener un guión (-).
import os
import watson_nlp
module_folder = "NLP_RBR_Module_2"
os.makedirs(module_folder, exist_ok=True)
Una configuración de expresión regular es un diccionario Python, con los atributos siguientes:
Atributo | Valor | Descripción | Necesario |
---|---|---|---|
name |
serie | El nombre de la expresión regular. Las coincidencias de la expresión regular en el texto de entrada se etiquetan con este nombre en la salida. | Sí |
regexes |
lista (serie de patrones de expresión regular basados en perl) | No debe estar vacío. Se pueden proporcionar varias expresiones regulares. | Sí |
flags |
Serie delimitada de distintivos válidos | Los distintivos como UNICODE o CASE_INSENSITIVE controlan la coincidencia. También puede ser una combinación de distintivos. Para saber los distintivos soportados, consulte Patrón (Plataforma Java SE 8). | No (el valor predeterminado es DOTALL) |
token_boundary.min |
int | token_boundary Indica si se debe comparar la expresión regular solo en los límites de la señal. Se ha especificado como un objeto de diccionario con atributos min y max . |
No (devuelve la coincidencia no solapada más larga en cada posición de carácter en el texto de entrada) |
token_boundary.max |
int | max es un atributo opcional para token_boundary y es necesario cuando el límite debe ampliarse para un rango (entre min y max señales). token_boundary.max debe ser >= token_boundary.min |
No (si se especifica token_boundary , el atributo min se puede especificar solo) |
groups |
list (etiquetas de serie para grupos de coincidencias) | El índice de serie de la lista corresponde al grupo coincidente en el patrón que empieza por 1 donde el índice 0 corresponde a una coincidencia completa. Por ejemplo: regex: (a)(b) en ab con group: ['full', 'first', 'second'] producirá full: ab, first: a, second: b |
No (el valor predeterminado es etiquetar la coincidencia en la coincidencia completa) |
Las configuraciones de expresión regular se pueden cargar utilizando los siguientes métodos de ayuda:
- Para cargar una única configuración de expresión regular, utilice
watson_nlp.toolkit.RegexConfig.load(<regex configuration>)
- Para cargar varias configuraciones de expresión regular, utilice
watson_nlp.toolkit.RegexConfig.load_all([<regex configuration>)])
Ejemplo de código
Este ejemplo muestra cómo cargar dos configuraciones de expresión regular diferentes. La primera configuración detecta nombres de personas. Utiliza el atributo groups para permitir un acceso fácil al nombre completo, nombre de pila y apellidos, en una etapa posterior.
La segunda configuración detecta siglas como una secuencia de caracteres todos en mayúsculas. Gracias al uso del atributo token_boundary, evita coincidencias en palabras que contengan caracteres en mayúsculas y minúsculas.
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
}
}
])
Entrenamiento de un modelo que contiene expresiones regulares
Después de haber cargado las configuraciones de expresión regular, cree un modelo RBR utilizando el método RBR.train()
. En el método, especifique:
- El directorio del módulo
- El idioma del texto
- Las configuraciones de expresión regular a utilizar
Este es el mismo método que se utiliza para entrenar RBR con la extracción basada en el diccionario. Puede pasar la configuración del diccionario en la misma llamada de método.
Ejemplo de código
# Train the RBR model
custom_regex_block = watson_nlp.resources.feature_extractor.RBR.train(module_path=module_folder, language='en', regexes=regexes)
Aplicación del modelo en datos nuevos
Después de haber entrenado los diccionarios, aplique el modelo en los datos nuevos utilizando el método run()
, tal como se utilizaría en cualquiera de los bloques entrenados previamente existentes.
Ejemplo de código
custom_regex_block.run('Bruce Wayne works for NASA')
Ejemplo de salida de código:
{(0, 11): ['regex::full names'], (0, 5): ['regex::full names'], (6, 11): ['regex::full names'], (22, 26): ['regex::acronyms']}
Para mostrar los subgrupos coincidentes o el texto coincidente:
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))
Ejemplo de salida de código:
{
"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"
}
}
]
},
...
}
Tema principal: Crear sus propios modelos