Python para PNL: coincidencia de vocabulario y frases 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 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.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *