Breaking

Post Top Ad

Your Ad Spot

viernes, 14 de junio de 2019

Python para PNL: Vocabulario y concordancia de frase con SpaCy

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 se pueden usar las bibliotecas NLTK y spaCy de Python para realizar tareas sencillas de PNL, como la tokenización , la derivación y la lematización . También vimos cómo realizar partes de etiquetado de voz, reconocimiento de entidades nombradas y análisis de nombres. Sin embargo, todas estas operaciones se realizan en palabras individuales.
En este artículo, iremos un paso más allá y exploraremos el vocabulario y la concordancia de frases usando la biblioteca spaCy. Definiremos patrones y luego veremos qué frases coinciden con el patrón que definimos. Esto es similar a la definición de expresiones regulares que involucran partes del habla.

Coincidencia basada en reglas

La biblioteca spaCy viene con una Matcherherramienta que se puede usar para especificar reglas personalizadas para la coincidencia de frases. El proceso para utilizar la Matcherherramienta es bastante sencillo. Lo primero que debe hacer es definir los patrones que desea hacer coincidir. A continuación, debe agregar los patrones a la Matcherherramienta y, finalmente, debe aplicar la Matcherherramienta 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:

Creando Objeto Matcher

El primer paso es crear el objeto coincidente:
import spacy  
nlp = spacy.load('en_core_web_sm')

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

Definiendo patrones

El siguiente paso es definir los patrones que se utilizarán para filtrar frases similares. Supongamos que queremos encontrar las frases "quick-brown-fox", "quick brown fox", "quickbrownfox" o "quick brownfox". 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 "quick-brown-fox"
  • p3 intenta buscar "qucik brown fox"
  • p4 busca la frase "brownfox rápido"
El atributo token LOWERdefine que la frase se debe convertir a minúsculas antes de la coincidencia.
Una vez que se definen los patrones, debemos agregarlos al Matcherobjeto que creamos anteriormente.
m_tool.add('QBF', None, p1, p2, p3, p4)  
Aquí "QBF" es el nombre de nuestro emparejador. Puedes darle cualquier nombre.

Aplicando Matcher al documento

Tenemos nuestro matcher listo. El siguiente paso es aplicar el emparejador en un documento de texto y ver si podemos obtener alguna coincidencia. Primero creamos 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 matcher a un documento. Es necesario que el documento se pase como parámetro al objeto de comparación. El resultado serán todos los identificadores de las frases coincidentes en el documento, junto con sus posiciones de inicio y finalización en el documento. Ejecuta el siguiente script:
phrase_matches = m_tool(sentence)  
print(phrase_matches )  
La salida de la secuencia de comandos anterior se ve así:
[(12825528024649263697, 1, 6), (12825528024649263697, 13, 16), (12825528024649263697, 21, 22), (12825528024649263697, 29, 31)]
Desde la salida, puedes ver que cuatro frases se han emparejado. El primer número largo en cada salida es el id de la frase coincidente, los números segundo y tercero son las posiciones inicial y final de la frase.
Para ver realmente el resultado de una mejor manera, podemos iterar a través de cada frase coincidente y mostrar su valor de cadena. Ejecuta 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 la salida, puede ver todas las frases combinadas junto con sus identificadores de vocabulario y la posición inicial y final.

Más opciones para el emparejamiento basado en reglas

La documentación oficial de la biblioteca sPacy contiene detalles de todos los tokens y comodines que se pueden usar para la comparación 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 "quick - brown - fox" o quick-brown --- fox.
Primero eliminemos el matcher 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 p1coincidirá con todas las frases donde haya una o más puntuaciones en la frase quick brown foxAhora definamos 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 marrón rápido - zorro, que debe coincidir con nuestro patrón. Apliquemos nuestra materia 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 de la secuencia de comandos anterior se ve así:
12825528024649263697 QBF 1 6 quick--brown--fox  
12825528024649263697 QBF 10 15 quick-brown---fox  
Desde la salida, puede ver que nuestro emparejador ha emparejado con éxito las dos frases.

Emparejamiento basado en frases

En la sección anterior, vimos cómo podemos definir reglas que pueden usarse para identificar frases del documento. Además de definir reglas, podemos especificar directamente las frases que estamos buscando. 
Esta es una forma más eficiente de emparejar frases.
En esta sección, haremos una coincidencia de frases dentro de un artículo de Wikipedia sobre inteligencia artificial.
Antes de ver los pasos para realizar la comparación de frases, primero analicemos el artículo de Wikipedia que usaremos para realizar la comparación de frases. Ejecuta 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)
La secuencia de comandos se ha explicado en detalle en mi artículo sobre Implementar Word2Vec con Gensim Library en Python. Puedes leer el artículo si quieres entender cómo funciona el análisis en Python.
El processed_articlecontiene el documento que usaremos para la coincidencia de frases.
Los pasos para realizar la coincidencia de frases son muy similares a la coincidencia basada en reglas.

Crear objeto de concordancia de frase

Como primer paso, necesitas crear un PhraseMatcherobjeto. El siguiente script hace eso:
import spacy  
nlp = spacy.load('en_core_web_sm')


from spacy.matcher import PhraseMatcher  
phrase_matcher = PhraseMatcher(nlp.vocab)  
Aviso en la sección anterior creamos Matcherobjeto. Aquí, en este caso, estamos creando PhraseMathcerobjeto.

Crear lista de frases

En el segundo paso, debe crear una lista de frases para hacer coincidir y luego convertir la lista a documentos de spa 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 emparejador es AI.

Aplicando Matcher al documento

Al igual que la concordancia basada en reglas, nuevamente debemos aplicar nuestro emparejador de frases al documento. Sin embargo, nuestro artículo analizado no está en formato de documento de spaCy. Por lo tanto, convertiremos nuestro artículo en un formato de documento sPacy y luego aplicaremos nuestra concordancia de frase 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 fin 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  
Desde 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 de parada son palabras en inglés como "the", "a", "an", etc, que no tienen ningún significado propio. Las palabras de parada a menudo no son muy útiles para tareas de PNL como la clasificación de texto o el modelado de idiomas. Por lo tanto, a menudo es mejor eliminar estas palabras vacías antes de continuar con el procesamiento del documento.
La biblioteca spaCy contiene 305 palabras de parada. Además, dependiendo de nuestros requisitos, también podemos agregar o eliminar palabras de parada de la biblioteca de spaCy.
Para ver las palabras de parada de spaCy predeterminadas, podemos usar el stop_wordsatributo del modelo de 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 de parada 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 verificar si una palabra es una palabra para detener o no. Para hacerlo, puedes usar el is_stopatributo como se muestra a continuación:
sp.vocab['wonder'].is_stop  
Como "maravilla" no es una palabra de parada de spaCy, verá Falseen la salida.
Para agregar o eliminar palabras clave en spaCy, puede usar sp.Defaults.stop_words.add()y los sp.Defaults.stop_words.remove()métodos respectivamente.
sp.Defaults.stop_words.add('wonder')  
A continuación, debemos establecer la is_stopetiqueta para wonder'Verdadero' como se muestra a continuación:
sp.vocab['wonder'].is_stop = True  

Conclusión

La concordancia de frases y vocabulario es una de las tareas de procesamiento de lenguaje natural más importantes. En este artículo, continuamos nuestra discusión acerca de cómo usar Python para realizar una comparación basada en reglas y en frases. Además, también vimos las palabras de parada de spaCy.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas