Python para PNL: coincidencia de vocabulario y frases con SpaCy

P

Este es el tercer artículo de esta serie de artículos sobre Python para el procesamiento del lenguaje natural. En el artículo anterior, vimos cómo NLTK y Python espacio Las bibliotecas se pueden utilizar para realizar tareas sencillas de PNL, como tokenización, derivación y lematización. También vimos cómo realizar partes de etiquetado de voz, reconocimiento de entidades con nombre y análisis de nombres. Sin embargo, todas estas operaciones se realizan en palabras individuales.

En este artículo, daremos un paso más y exploraremos el vocabulario y la coincidencia de frases usando la biblioteca spaCy. Definiremos patrones y luego veremos qué frases coinciden con el patrón que definimos. Esto es similar a definir expresiones regulares que involucran partes del discurso.

Coincidencia basada en reglas

La biblioteca spaCy viene con Matcher herramienta que se puede utilizar para especificar reglas personalizadas para la concordancia de frases. El proceso para utilizar el Matcher La herramienta es bastante sencilla. Lo primero que tienes que hacer es definir los patrones que quieres hacer coincidir. A continuación, debe agregar los patrones al Matcher herramienta y finalmente, tienes que aplicar la Matcher herramienta al documento con el que desea hacer coincidir sus reglas. Esto se explica mejor con la ayuda de un ejemplo.

Para la coincidencia basada en reglas, debe realizar los siguientes pasos:

Creación de objeto Matcher

El primer paso es crear el objeto comparador:

import spacy
nlp = spacy.load('en_core_web_sm')

from spacy.matcher import Matcher
m_tool = Matcher(nlp.vocab)

Definición de patrones

El siguiente paso es definir los patrones que se utilizarán para filtrar frases similares. Supongamos que queremos encontrar las frases “zorro marrón rápido”, “zorro marrón rápido”, “zorro marrón rápido” o “zorro marrón rápido”. Para hacerlo, necesitamos crear los siguientes cuatro patrones:

p1 = [{'LOWER': 'quickbrownfox'}]
p2 = [{'LOWER': 'quick'}, {'IS_PUNCT': True}, {'LOWER': 'brown'}, {'IS_PUNCT': True}, {'LOWER': 'fox'}]
p3 = [{'LOWER': 'quick'}, {'LOWER': 'brown'}, {'LOWER': 'fox'}]
p4 =  [{'LOWER': 'quick'}, {'LOWER': 'brownfox'}]

En el guión anterior,

  • p1 busca la frase “quickbrownfox”
  • p2 busca la frase “zorro-marrón-rápido”
  • p3 intenta buscar “qucik brown fox”
  • p4 busca la frase “zorro marrón rápido”

El atributo token LOWER define que la frase debe convertirse a minúsculas antes de hacer coincidir.

Una vez que los patrones están definidos, debemos agregarlos al Matcher objeto que creamos anteriormente.

m_tool.add('QBF', None, p1, p2, p3, p4)

Aquí “QBF” es el nombre de nuestro comparador. Puedes darle cualquier nombre.

Aplicar Matcher al documento

Tenemos nuestro emparejador listo. El siguiente paso es aplicar el comparador en un documento de texto y ver si podemos obtener alguna coincidencia. Primero creemos un documento simple:

sentence = nlp(u'The quick-brown-fox jumps over the lazy dog. The quick brown fox eats well. 
               the quickbrownfox is dead. the dog misses the quick brownfox')

Para aplicar el comparador a un documento. Es necesario pasar el documento como parámetro al objeto de comparación. El resultado serán todos los identificadores de las frases que coinciden en el documento, junto con sus posiciones inicial y final en el documento. Ejecute el siguiente script:

phrase_matches = m_tool(sentence)
print(phrase_matches )

La salida del script anterior se ve así:

[(12825528024649263697, 1, 6), (12825528024649263697, 13, 16), (12825528024649263697, 21, 22), (12825528024649263697, 29, 31)]

En la salida, puede ver que se han emparejado cuatro frases. El primer número largo en cada salida es la identificación de la frase coincidente, el segundo y tercer número son las posiciones inicial y final de la frase.

Para ver el resultado de una mejor manera, podemos iterar a través de cada frase coincidente y mostrar su valor de cadena. Ejecute el siguiente script:

for match_id, start, end in phrase_matches:
    string_id = nlp.vocab.strings[match_id]  
    span = sentence[start:end]                   
    print(match_id, string_id, start, end, span.text)

Salida:

12825528024649263697 QBF 1 6 quick-brown-fox
12825528024649263697 QBF 13 16 quick brown fox
12825528024649263697 QBF 21 22 quickbrownfox
12825528024649263697 QBF 29 31 quick brownfox

Desde el resultado, puede ver todas las frases coincidentes junto con sus identificadores de vocabulario y la posición inicial y final.

Más opciones para la coincidencia basada en reglas

La documentación oficial de la biblioteca sPacy contiene detalles de todos los tokens y comodines que se puede utilizar para la concordancia de frases.

Por ejemplo, el atributo “*” se define para buscar una o más instancias del token.

Escribamos un patrón simple que pueda identificar la frase “zorro marrón rápido” o zorro marrón rápido.

Primero eliminemos el comparador anterior QBF.

m_tool.remove('QBF')

A continuación, necesitamos definir nuestro nuevo patrón:


p1 = [{'LOWER': 'quick'}, {'IS_PUNCT': True, 'OP':'*'}, {'LOWER': 'brown'}, {'IS_PUNCT': True, 'OP':'*'}, {'LOWER': 'fox'}]
m_tool.add('QBF', None, p1)

El patrón p1 coincidirá con todas las frases en las que haya una o más puntuaciones en la frase quick brown fox. Definamos ahora nuestro documento para filtrar:

sentence = nlp(u'The quick--brown--fox jumps over the  quick-brown---fox')

Puede ver que nuestro documento tiene dos frases: rápido, marrón, zorro y rápido, marrón, zorro, que debe coincidir con nuestro patrón. Apliquemos nuestro mather al documento y veamos los resultados:

phrase_matches = m_tool(sentence)

for match_id, start, end in phrase_matches:
    string_id = nlp.vocab.strings[match_id]  
    span = sentence[start:end]                   
    print(match_id, string_id, start, end, span.text)

La salida del script anterior se ve así:

12825528024649263697 QBF 1 6 quick--brown--fox
12825528024649263697 QBF 10 15 quick-brown---fox

En el resultado, puede ver que nuestro comparador ha emparejado con éxito las dos frases.

Coincidencia basada en frases

En la última sección, vimos cómo podemos definir reglas que se pueden usar para identificar frases del documento. Además de definir reglas, podemos especificar directamente las frases que estamos buscando.
Esta es una forma más eficaz de hacer coincidir frases.

En esta sección, haremos uniones de frases dentro de un artículo de Wikipedia sobre inteligencia artificial.

Antes de ver los pasos para realizar la concordancia de frases, analicemos primero el artículo de Wikipedia que usaremos para realizar la concordancia de frases. Ejecute el siguiente script:

import bs4 as bs  
import urllib.request  
import re  
import nltk

scrapped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')  
article = scrapped_data .read()

parsed_article = bs.BeautifulSoup(article,'lxml')

paragraphs = parsed_article.find_all('p')

article_text = ""

for p in paragraphs:  
    article_text += p.text
    
    
processed_article = article_text.lower()  
processed_article = re.sub('[^a-zA-Z]', ' ', processed_article )  
processed_article = re.sub(r's+', ' ', processed_article)

El script se ha explicado en detalle en mi artículo sobre Implementación de Word2Vec con la biblioteca Gensim en Python. Puede leer el artículo si desea comprender cómo funciona el análisis en Python.

los processed_article contiene el documento que usaremos para la concordancia de frases.

Los pasos para realizar la concordancia de frases son bastante similares a la concordancia basada en reglas.

Crear objeto de coincidencia de frases

Como primer paso, debe crear PhraseMatcher objeto. El siguiente script hace eso:

import spacy
nlp = spacy.load('en_core_web_sm')


from spacy.matcher import PhraseMatcher
phrase_matcher = PhraseMatcher(nlp.vocab)

Observe en la sección anterior que creamos Matcher objeto. Aquí, en este caso, estamos creando PhraseMathcer objeto.

Crear lista de frases

En el segundo paso, debe crear una lista de frases para que coincidan y luego convertir la lista en documentos spaCy NLP como se muestra en el siguiente script:

phrases = ['machine learning', 'robots', 'intelligent agents']

patterns = [nlp(text) for text in phrases]

Finalmente, debe agregar su lista de frases al comparador de frases.

phrase_matcher.add('AI', None, *patterns)

Aquí el nombre de nuestro comparador es AI.

Aplicar Matcher al documento

Al igual que la coincidencia basada en reglas, nuevamente necesitamos aplicar nuestro comparador de frases al documento. Sin embargo, nuestro artículo analizado no está en formato de documento espaciado. Por lo tanto, convertiremos nuestro artículo al formato de documento sPacy y luego aplicaremos nuestro comparador de frases al artículo.

sentence = nlp (processed_article)

matched_phrases = phrase_matcher(sentence)

En la salida, tendremos todos los identificadores de todas las frases coincidentes junto con sus índices de inicio y final en el documento como se muestra a continuación:

[(5530044837203964789, 37, 39),
 (5530044837203964789, 402, 404),
 (5530044837203964789, 693, 694),
 (5530044837203964789, 1284, 1286),
 (5530044837203964789, 3059, 3061),
 (5530044837203964789, 3218, 3220),
 (5530044837203964789, 3753, 3754),
 (5530044837203964789, 5212, 5213),
 (5530044837203964789, 5287, 5288),
 (5530044837203964789, 6769, 6771),
 (5530044837203964789, 6781, 6783),
 (5530044837203964789, 7496, 7498),
 (5530044837203964789, 7635, 7637),
 (5530044837203964789, 8002, 8004),
 (5530044837203964789, 9461, 9462),
 (5530044837203964789, 9955, 9957),
 (5530044837203964789, 10784, 10785),
 (5530044837203964789, 11250, 11251),
 (5530044837203964789, 12290, 12291),
 (5530044837203964789, 12411, 12412),
 (5530044837203964789, 12455, 12456)]

Para ver el valor de cadena de las frases coincidentes, ejecute el siguiente script:

for match_id, start, end in matched_phrases:
    string_id = nlp.vocab.strings[match_id]  
    span = sentence[start:end]                   
    print(match_id, string_id, start, end, span.text)

En la salida, verá el valor de strig de las frases coincidentes como se muestra a continuación:

5530044837203964789 AI 37 39 intelligent agents
5530044837203964789 AI 402 404 machine learning
5530044837203964789 AI 693 694 robots
5530044837203964789 AI 1284 1286 machine learning
5530044837203964789 AI 3059 3061 intelligent agents
5530044837203964789 AI 3218 3220 machine learning
5530044837203964789 AI 3753 3754 robots
5530044837203964789 AI 5212 5213 robots
5530044837203964789 AI 5287 5288 robots
5530044837203964789 AI 6769 6771 machine learning
5530044837203964789 AI 6781 6783 machine learning
5530044837203964789 AI 7496 7498 machine learning
5530044837203964789 AI 7635 7637 machine learning
5530044837203964789 AI 8002 8004 machine learning
5530044837203964789 AI 9461 9462 robots
5530044837203964789 AI 9955 9957 machine learning
5530044837203964789 AI 10784 10785 robots
5530044837203964789 AI 11250 11251 robots
5530044837203964789 AI 12290 12291 robots
5530044837203964789 AI 12411 12412 robots
5530044837203964789 AI 12455 12456 robots

En la salida, puede ver las tres frases que intentamos buscar junto con su índice de inicio y fin y los identificadores de cadena.

Para las palabras

Antes de concluir este artículo, solo quería tocar el concepto de palabras vacías. Las palabras vacías son palabras en inglés como “the”, “a”, “an”, etc. que no tienen ningún significado propio. Las palabras vacías a menudo no son muy útiles para tareas de PNL como la clasificación de texto o el modelado de lenguaje. Por lo tanto, a menudo es mejor eliminar estas palabras vacías antes de seguir procesando el documento.

La biblioteca spaCy contiene 305 palabras vacías. Además, dependiendo de nuestros requisitos, también podemos agregar o eliminar palabras vacías de la biblioteca spaCy.

Para ver las palabras vacías espaciadas predeterminadas, podemos usar stop_words atributo del modelo spaCy como se muestra a continuación:

import spacy
sp = spacy.load('en_core_web_sm')
print(sp.Defaults.stop_words)

En la salida, verá todas las palabras vacías de sPacy:

{'less', 'except', 'top', 'me', 'three', 'fifteen', 'a', 'is', 'those', 'all', 'then', 'everyone', 'without', 'must', 'has', 'any', 'anyhow', 'keep', 'through', 'bottom', 'get', 'indeed', 'it', 'still', 'ten', 'whatever', 'doing', 'though', 'eight', 'various', 'myself', 'across', 'wherever', 'himself', 'always', 'thus', 'am', 'after', 'should', 'perhaps', 'at', 'down', 'own', 'rather', 'regarding', 'which', 'anywhere', 'whence', 'would', 'been', 'how', 'herself', 'now', 'might', 'please', 'behind', 'every', 'seems', 'alone', 'from', 'via', 'its', 'become', 'hers', 'there', 'front', 'whose', 'before', 'against', 'whereafter', 'up', 'whither', 'two', 'five', 'eleven', 'why', 'below', 'out', 'whereas', 'serious', 'six', 'give', 'also', 'became', 'his', 'anyway', 'none', 'again', 'onto', 'else', 'have', 'few', 'thereby', 'whoever', 'yet', 'part', 'just', 'afterwards', 'mostly', 'see', 'hereby', 'not', 'can', 'once', 'therefore', 'together', 'whom', 'elsewhere', 'beforehand', 'themselves', 'with', 'seem', 'many', 'upon', 'former', 'are', 'who', 'becoming', 'formerly', 'between', 'cannot', 'him', 'that', 'first', 'more', 'although', 'whenever', 'under', 'whereby', 'my', 'whereupon', 'anyone', 'toward', 'by', 'four', 'since', 'amongst', 'move', 'each', 'forty', 'somehow', 'as', 'besides', 'used', 'if', 'name', 'when', 'ever', 'however', 'otherwise', 'hundred', 'moreover', 'your', 'sometimes', 'the', 'empty', 'another', 'where', 'her', 'enough', 'quite', 'throughout', 'anything', 'she', 'and', 'does', 'above', 'within', 'show', 'in', 'this', 'back', 'made', 'nobody', 'off', 're', 'meanwhile', 'than', 'neither', 'twenty', 'call', 'you', 'next', 'thereupon', 'therein', 'go', 'or', 'seemed', 'such', 'latterly', 'already', 'mine', 'yourself', 'an', 'amount', 'hereupon', 'namely', 'same', 'their', 'of', 'yours', 'could', 'be', 'done', 'whole', 'seeming', 'someone', 'these', 'towards', 'among', 'becomes', 'per', 'thru', 'beyond', 'beside', 'both', 'latter', 'ours', 'well', 'make', 'nowhere', 'about', 'were', 'others', 'due', 'yourselves', 'unless', 'thereafter', 'even', 'too', 'most', 'everything', 'our', 'something', 'did', 'using', 'full', 'while', 'will', 'only', 'nor', 'often', 'side', 'being', 'least', 'over', 'some', 'along', 'was', 'very', 'on', 'into', 'nine', 'noone', 'several', 'i', 'one', 'third', 'herein', 'but', 'further', 'here', 'whether', 'because', 'either', 'hereafter', 'really', 'so', 'somewhere', 'we', 'nevertheless', 'last', 'had', 'they', 'thence', 'almost', 'ca', 'everywhere', 'itself', 'no', 'ourselves', 'may', 'wherein', 'take', 'around', 'never', 'them', 'to', 'until', 'do', 'what', 'say', 'twelve', 'nothing', 'during', 'sixty', 'sometime', 'us', 'fifty', 'much', 'for', 'other', 'hence', 'he', 'put'}

También puede comprobar si una palabra es una palabra de parada o no. Para hacerlo, puede utilizar el is_stop atributo como se muestra a continuación:

sp.vocab['wonder'].is_stop

Dado que “maravilla” no es una palabra de parada espaciada, verá False en la salida.

Para agregar o eliminar palabras vacías en spaCy, puede usar sp.Defaults.stop_words.add() y sp.Defaults.stop_words.remove() métodos respectivamente.

sp.Defaults.stop_words.add('wonder')

A continuación, necesitamos configurar el is_stop etiqueta para wonder a ‘Verdadero’ como se muestra a continuación:

sp.vocab['wonder'].is_stop = True

Conclusión

La coincidencia de frases y vocabulario es una de las tareas más importantes de procesamiento del lenguaje natural. En este artículo, continuamos nuestra discusión sobre cómo usar Python para realizar coincidencias basadas en reglas y frases. Además, también vimos palabras vacías espaciadas.

En el próximo artículo, veremos partes del etiquetado de voz y el reconocimiento de entidades nombradas en detalle.

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad