Python para PNL: Introducción a la biblioteca de patrones

Este es el octavo artículo de mi serie de artículos sobre Python para PNL. En mi artículo anterior , expliqué cómo se puede usar la biblioteca TextBlob de Python para realizar una variedad de tareas de PNL que van desde la tokenización hasta el etiquetado POS y la clasificación de texto hasta el análisis de la opinión. En este artículo, exploraremos el patrón de Python. biblioteca de , que es otra biblioteca extremadamente útil de procesamiento de lenguaje natural.
La biblioteca de patrones es una biblioteca multipropósito capaz de manejar las siguientes tareas:
  • Procesamiento de lenguaje natural: realizar tareas como tokenización, derivación, etiquetado POS, análisis de sentimientos, etc.
  • Minería de datos: contiene API para extraer datos de sitios como Twitter, Facebook, Wikipedia, etc.
  • Aprendizaje automático: contiene modelos de aprendizaje automático como SVM, KNN y perceptrón, que se pueden usar para tareas de clasificación, regresión y agrupamiento.
En este artículo, veremos las dos primeras aplicaciones de la biblioteca de patrones de la lista anterior. Exploraremos el uso de la Biblioteca de patrones para la PNL realizando tareas como la tokenización, la derivación y el análisis de sentimientos. También veremos cómo se puede usar la biblioteca de patrones para la minería web.

Instalando la biblioteca

Para instalar la biblioteca, puede usar el siguiente comando pip:
$ pip install pattern
De lo contrario, si está usando la distribución Anaconda de Python, puede usar el siguiente comando de Anaconda para descargar la biblioteca:
$ conda install -c asmeurer pattern

Funciones de la biblioteca de patrones para la PNL

En esta sección, veremos algunas de las aplicaciones de PNL de la Biblioteca de patrones.

Tokenización, etiquetado de POS y fragmentación

En las bibliotecas NLTK y spaCy, tenemos una función separada para tokenización, etiquetado POS y búsqueda de frases nominales en documentos de texto. Por otro lado, en la biblioteca de patrones está el todo en unoparse método que toma una cadena de texto como parámetro de entrada y devuelve los tokens correspondientes en la cadena, junto con la etiqueta POS.
El parsemétodo también nos dice si un token es una frase nominal o una frase verbal, un sujeto o un objeto. También puede recuperar tokens lematizados configurando el lemmataparámetro a TrueLa sintaxis del parsemétodo junto con los valores predeterminados para diferentes parámetros es la siguiente:
parse(string,  
    tokenize=True,      # Split punctuation marks from words?
    tags=True,          # Parse part-of-speech tags? (NN, JJ, ...)
    chunks=True,        # Parse chunks? (NP, VP, PNP, ...)
    relations=False,    # Parse chunk relations? (-SBJ, -OBJ, ...)
    lemmata=False,      # Parse lemmata? (ate => eat)
    encoding='utf-8',   # Input string encoding.
    tagset=None         # Penn Treebank II (default) or UNIVERSAL.
)
Veamos el parsemétodo en acción:
from pattern.en import parse  
from pattern.en import pprint

pprint(parse('I drove my car to the hospital yesterday', relations=True, lemmata=True))  
Para usar el parsemétodo, tienes que importar el enmódulo de la patternbiblioteca. El enmódulo contiene funciones de PNL en inglés. Si usa el pprintmétodo para imprimir el resultado del parsemétodo en la consola, debería ver el siguiente resultado:
         WORD   TAG    CHUNK   ROLE   ID     PNP    LEMMA

             I   PRP    NP      SBJ    1      -      i
         drove   VBD    VP      -      1      -      drive
            my   PRP$   NP      OBJ    1      -      my
           car   NN     NP ^    OBJ    1      -      car
            to   TO     -       -      -      -      to
           the   DT     NP      -      -      -      the
      hospital   NN     NP ^    -      -      -      hospital
     yesterday   NN     NP ^    -      -      -      yesterday
En la salida, puede ver las palabras en token junto con su etiqueta POS, la parte a la que pertenecen los tokens y el rol. También puede ver la forma lematizada de los tokens.
Si llama al splitmétodo sobre el objeto devuelto por elparse método, la salida será una lista de oraciones, donde cada oración es una lista de tokens y cada token es una lista de palabras, junto con las etiquetas asociadas con las palabras.
Por ejemplo, mira el siguiente script:
from pattern.en import parse  
from pattern.en import pprint

print(parse('I drove my car to the hospital yesterday', relations=True, lemmata=True).split())  
La salida de la secuencia de comandos anterior se ve así:
[[['I', 'PRP', 'B-NP', 'O', 'NP-SBJ-1', 'i'], ['drove', 'VBD', 'B-VP', 'O', 'VP-1', 'drive'], ['my', 'PRP$', 'B-NP', 'O', 'NP-OBJ-1', 'my'], ['car', 'NN', 'I-NP', 'O', 'NP-OBJ-1', 'car'], ['to', 'TO', 'O', 'O', 'O', 'to'], ['the', 'DT', 'B-NP', 'O', 'O', 'the'], ['hospital', 'NN', 'I-NP', 'O', 'O', 'hospital'], ['yesterday', 'NN', 'I-NP', 'O', 'O', 'yesterday']]]

Pluralizando y singularizando los tokens.

Los métodos pluralizesingularizese utilizan para convertir palabras en singular a plurales y viceversa, respectivamente.
from pattern.en import pluralize, singularize

print(pluralize('leaf'))  
print(singularize('theives'))  
La salida se ve así:
leaves  
theif  

Convertir el adjetivo a grados comparativos y superlativos

Puede recuperar grados comparativos y superlativos de un adjetivo usando comparativesuperlativefunciones. Por ejemplo, el grado comparativo de bien es mejor y el grado superlativo de bien es mejor. Veamos esto en acción:
from pattern.en import comparative, superlative

print(comparative('good'))  
print(superlative('good'))  
Salida:
better  
best  

Encontrar N-Grams

Los N-gramos se refieren a la combinación "n" de palabras en una oración. Por ejemplo, para la frase "Él va al hospital", 2 gramos serían (Él va), (va a) y (al hospital). Los N-Gram pueden desempeñar un papel crucial en la clasificación de textos y en el modelado de idiomas.
En la biblioteca de patrones, el ngrammétodo se usa para encontrar todos los n-gramos en una cadena de texto. El primer parámetro del ngrammétodo es la cadena de texto. El número de n-gramas se pasa al nparámetro del método. Mira el siguiente ejemplo:
from pattern.en import ngrams

print(ngrams("He goes to hospital", n=2))  
Salida:
[('He', 'goes'), ('goes', 'to'), ('to', 'hospital')]

Encontrar sentimientos

Sentimiento se refiere a una opinión o sentimiento hacia cierta cosa. La biblioteca de patrones ofrece funcionalidad para encontrar sentimientos a partir de una cadena de texto.
En el patrón, el sentiment objeto se usa para encontrar la polaridad (positividad o negatividad) de un texto junto con su subjetividad.
Dependiendo de los adjetivos positivos (buenos, mejores, excelentes, etc.) y negativos (malos, horribles, patéticos, etc.) que ocurren con mayor frecuencia, se asigna una puntuación de sentimiento entre 1 y -1 al texto. Esta puntuación del sentimiento también se llama la polaridad.
Además de la puntuación del sentimiento, la subjetividad también se devuelve. El valor de subjetividad puede estar entre 0 y 1. La subjetividad cuantifica la cantidad de opinión personal e información objetiva contenida en el texto. La subjetividad más alta significa que el texto contiene una opinión personal en lugar de información objetiva.
from pattern.en import sentiment

print(sentiment("This is an excellent movie to watch. I really love it"))  
Cuando ejecute el script anterior, debería ver el siguiente resultado:
(0.75, 0.8)
La frase "Esta es una excelente película para ver. Me encanta" tiene un sentimiento de 0,75, lo que demuestra que es muy positivo. De manera similar, la subjetividad de 0.8 se refiere al hecho de que la oración es una opinión personal del usuario.

Comprobando si una declaración es un hecho

La modalityfunción de la biblioteca de patrones se puede utilizar para encontrar el grado de certeza en la cadena de texto. La modalityfunción devuelve un valor entre -1 y 1. Para los hechos, la modalityfunción devuelve un valor mayor que 0.5.
Aquí hay un ejemplo de ello en acción:
from pattern.en import parse, Sentence  
from pattern.en import modality

text = "Paris is the capital of France"  
sent = parse(text, lemmata=True)  
sent = Sentence(sent)

print(modality(sent))  
1.0  
En el script anterior, primero importamos el parsemétodo junto con la Sentenceclase. En la segunda línea, importamos la modalityfunción. El parsemétodo toma el texto como entrada y devuelve una forma en tokenizada del texto, que luego se pasa al Sentenceconstructor de la clase. El modalitymétodo toma el Sentenceobjeto de clase y devuelve la modalidad de la oración.
Dado que la cadena de texto "París es la capital de Francia" es un hecho, en la salida, verá un valor de 1.
De manera similar, para una oración que no es segura, el valor devuelto por el modalitymétodo es de alrededor de 0.0. Mira el siguiente script:
text = "I think we can complete this task"  
sent = parse(text, lemmata=True)  
sent = Sentence(sent)

print(modality(sent))  
0.25  
Dado que la cadena en el ejemplo anterior no es muy segura, la modalidad de la cadena anterior será 0.25.

Correcciones ortográficas

El suggestmétodo se puede usar para encontrar si una palabra está escrita correctamente o no. El suggestmétodo devuelve 1 si una palabra está escrita correctamente al 100%. De lo contrario, el suggestmétodo devuelve las posibles correcciones de la palabra junto con su probabilidad de corrección.
Mira el siguiente ejemplo:
from pattern.en import suggest

print(suggest("Whitle"))  
En el guión anterior tenemos una palabra Whitleque está mal escrita. En la salida, verá posibles sugerencias para esta palabra.
[('While', 0.6459209419680404), ('White', 0.2968881412952061), ('Title', 0.03280067283431455), ('Whistle', 0.023549201009251473), ('Chile', 0.0008410428931875525)]
De acuerdo con el suggestmétodo, existe una probabilidad de 0.64 de que la palabra sea "While", de manera similar, existe una probabilidad de 0.29 de que la palabra sea "White", y así sucesivamente.
Ahora vamos a deletrear una palabra correctamente:
from pattern.en import suggest  
print(suggest("Fracture"))  
Salida:
[('Fracture', 1.0)]
Desde la salida, puede ver que hay un 100% de probabilidad de que la palabra esté escrita correctamente.

Trabajando con numeros

La biblioteca de patrones contiene funciones que se pueden usar para convertir números en forma de cadenas de texto en sus contrapartes numéricas y viceversa. Para convertir de texto a representación numérica numberse utiliza la función. De manera similar, para convertir de nuevo los números a su representación de texto correspondiente numerals, se utiliza la función. Mira el siguiente script:
from pattern.en import number, numerals

print(number("one hundred and twenty two"))  
print(numerals(256.390, round=2))  
Salida:
122  
two hundred and fifty-six point thirty-nine  
En la salida, verá 122, que es la representación numérica del texto "ciento veintidós". De manera similar, debería ver "doscientos cincuenta y seis punto treinta y nueve", que es una representación de texto del número 256.390.
Recuerde, para la numeralsfunción tenemos que proporcionar el valor entero al que queremos redondear nuestro número.
La quantifyfunción se utiliza para obtener una estimación de recuento de palabras de los elementos de la lista, que proporciona una frase para referirse al grupo. Si una lista tiene 3-8 elementos similares, la quantifyfunción la cuantificará a "varios". Dos elementos se cuantifican a una "pareja".
from pattern.en import quantify

print(quantify(['apple', 'apple', 'apple', 'banana', 'banana', 'banana', 'mango', 'mango']))  
En la lista, tenemos tres manzanas, tres bananas y dos mangos. La salida de la quantifyfunción para esta lista se ve así:
several bananas, several apples and a pair of mangoes  
De manera similar, el siguiente ejemplo muestra las otras estimaciones de conteo de palabras.
from pattern.en import quantify

print(quantify({'strawberry': 200, 'peach': 15}))  
print(quantify('orange', amount=1200))  
Salida:
hundreds of strawberries and a number of peaches  
thousands of oranges  

Funciones de la biblioteca de patrones para minería de datos

En la sección anterior, vimos algunas de las funciones más utilizadas de la biblioteca de patrones para NLP. En esta sección, veremos cómo se puede usar la biblioteca de patrones para realizar una variedad de tareas de minería de datos.
El webmódulo de la biblioteca de patrones se utiliza para tareas de minería web.

Acceso a páginas web

El URLobjeto se utiliza para recuperar contenidos de las páginas web. Tiene varios métodos que se pueden utilizar para abrir una página web, descargar el contenido de una página web y leer una página web.
Puede utilizar directamente el downloadmétodo para descargar los contenidos HTML de cualquier página web. La siguiente secuencia de comandos descarga el código fuente HTML para el artículo de Wikipedia sobre inteligencia artificial.
from pattern.web import download

page_html = download('https://en.wikipedia.org/wiki/Artificial_intelligence', unicode=True)  
También puede descargar archivos de páginas web, por ejemplo, imágenes usando el método de URL:
from pattern.web import URL, extension

page_url = URL('https://upload.wikimedia.org/wikipedia/commons/f/f1/RougeOr_football.jpg')  
file = open('football' + extension(page_url.page), 'wb')  
file.write(page_url.download())  
file.close()  
En el script anterior, primero hacemos una conexión con la página web utilizando el URLmétodo. A continuación, llamamos al extensionmétodo en la página abierta, que devuelve la extensión del archivo. La extensión del archivo se agrega al final de la cadena "football". Se llama al método abierto para leer esta ruta y, finalmente, el download()método descarga la imagen y la escribe en la ruta de ejecución predeterminada.

Encontrar URLs dentro de texto

Puede utilizar el findurlmétodo para extraer URL de cadenas de texto. Aquí hay un ejemplo:
from pattern.web import find_urls

print(find_urls('To search anything, go to www.google.com', unique=True))  
En la salida, verá la URL del sitio web de Google como se muestra a continuación:
['www.google.com']

Realización de solicitudes asíncronas de páginas web.

Las páginas web pueden ser muy grandes y puede llevar bastante tiempo descargar el contenido completo de la página, lo que puede impedir que un usuario realice cualquier otra tarea en la aplicación hasta que se descargue la página web completa. Sin embargo, el webmódulo de la biblioteca de patrones contiene una función asynchronous, que descarga contenidos de una página web de manera paralela. El asynchronousmétodo se ejecuta en segundo plano para que el usuario pueda interactuar con la aplicación mientras se descarga la página web.
Tomemos un ejemplo muy simple del asynchronousmétodo:
from pattern.web import asynchronous, time, Google

asyn_req = asynchronous(Google().search, 'artificial intelligence', timeout=4)  
while not asyn_req.done:  
    time.sleep(0.1)
    print('searching...')

print(asyn_req.value)

print(find_urls(asyn_req.value, unique=True))  
En el script anterior, recuperamos el resultado de búsqueda de Google de la página 1 para la consulta de búsqueda "inteligencia artificial", puede ver que mientras se descarga la página, ejecutamos un bucle while en paralelo. Finalmente, los resultados recuperados por la consulta se imprimen utilizando el valueatributo del objeto devuelto por el asynchronousmódulo. A continuación, extraemos las URL de la búsqueda, que luego se imprimen en la pantalla.

Obtención de los resultados del motor de búsqueda con las API

La biblioteca de patrones contiene la SearchEngineclase que se deriva de las clases que se pueden usar para conectarse a las API de diferentes motores de búsqueda y sitios web como Google, Bing, Facebook, Wikipedia, Twitter, etc. La SearchEngineconstrucción del objeto acepta tres parámetros:
  • license: La clave de licencia de desarrollador para el motor de búsqueda o sitio web correspondiente
  • throttle: Corresponde a la diferencia de tiempo entre la solicitud sucesiva al servidor
  • langauge: Especifica el idioma para los resultados.
El searchmétodo de la SearchEngineclase se utiliza para realizar una solicitud al motor de búsqueda para determinadas consultas de búsqueda. El searchmétodo puede tomar los siguientes parámetros:
  • query: La cadena de búsqueda
  • type:El tipo de datos que desea buscar, puede tomar tres valores: SEARCHNEWSIMAGE.
  • start: La página desde la que desea iniciar la búsqueda.
  • count: El número de resultados por página.
Las clases del motor de búsqueda que heredan la SearchEngineclase junto con su searchmétodo son: GoogleBingTwitterFacebookWikipedia, y Flickr.
La consulta de búsqueda devuelve objetos para cada elemento. El resultobjeto se puede utilizar para recuperar la información sobre el resultado buscado. Los atributos del resultobjeto son urltitletextlanguageauthordate.
Ahora veamos un ejemplo muy simple de cómo podemos buscar algo en Google a través de la biblioteca de patrones. Recuerde, para hacer que este ejemplo funcione, tendrá que usar su clave de licencia de desarrollador para la API de Google.
from pattern.web import Google

google = Google(license=None)  
for search_result in google.search('artificial intelligence'):  
    print(search_result.url)
    print(search_result.text)
En el script anterior, creamos un objeto de clase Google. En el constructor de Google, pase su propia clave de licencia al licenseparámetro. A continuación, pasamos la cadena artificial intelligenceal searchmétodo. De forma predeterminada, se devolverán los primeros 10 resultados de la primera página que luego se iterarán, y la url y el texto de cada resultado se mostrarán en la pantalla.
El proceso es similar para el motor de búsqueda de Bing, solo tiene que reemplazar la Bingclase con Googleel script anterior.
Ahora busquemos en Twitter los tres últimos tweets que contienen el texto "inteligencia artificial". Ejecuta el siguiente script:
from pattern.web import Twitter

twitter = Twitter()  
index = None  
for j in range(3):  
    for tweet in twitter.search('artificial intelligence', start=index, count=3):
        print(tweet.text)
        index = tweet.id
En el script anterior, primero importamos la Twitterclase del pattern.webmódulo. A continuación, repasamos los tweets devueltos por la Twitterclase y mostramos el texto del tweet en la consola. No necesita ninguna clave de licencia para ejecutar el script anterior.

Convertir datos HTML a texto sin formato

El downloadmétodo de la URLclase devuelve datos en forma de HTML. Sin embargo, si desea hacer un análisis semántico del texto, por ejemplo, la clasificación de sentimientos, necesita datos limpiados sin etiquetas HTML. Puedes limpiar los datos con el plaintextmétodo. El método toma como parámetro, el contenido HTML devuelto por el downloadmétodo y devuelve el texto limpio.
Mira el siguiente script:
from pattern.web import URL, plaintext

html_content = URL('https://stackabuse.com/python-for-nlp-introduction-to-the-textblob-library/').download()  
cleaned_page = plaintext(html_content.decode('utf-8'))  
print(cleaned_page)  
En la salida, debería ver el texto limpio de la página web:
Es importante recordar que si está usando Python 3, necesitará llamar al decode('utf-8')método para convertir los datos de byte a formato de cadena.

Análisis de documentos PDF

La biblioteca de patrones contiene un objeto PDF que se puede usar para analizar un documento PDF. PDF (Portable Document Format) es un archivo multiplataforma que contiene imágenes, textos y fuentes en un documento independiente.
Veamos cómo se puede analizar un documento PDF con el objeto PDF:
from pattern.web import URL, PDF

pdf_doc = URL('http://demo.clab.cs.cmu.edu/NLP/syllabus_f18.pdf').download()  
print(PDF(pdf_doc.decode('utf-8')))  
En el script descargamos un documento utilizando la downloadfunción. A continuación, el documento HTML descargado se pasa a la clase PDF que finalmente lo imprime en la consola.

Borrar el caché

Los resultados devueltos por los métodos como SearchEngine.search()URL.download()son, por defecto, almacenados en el caché local. Para borrar el caché después de descargar un documento HTML, podemos usar el clearmétodo de la clase de caché, como se muestra a continuación:
from pattern.web import cache

cache.clear()  

Conclusión

La biblioteca de patrones es una de las bibliotecas de procesamiento de lenguaje natural más útiles en Python. Aunque no es tan conocido como spaCy o NLTK, contiene funcionalidades como la búsqueda de superlativos y comparativos, y la detección de hechos y opiniones que lo distingue de las otras bibliotecas de PNL.
En este artículo, estudiamos la aplicación de la biblioteca de patrones para el procesamiento de lenguaje natural y la extracción de datos y el raspado web. Vimos cómo realizar tareas básicas de PNL, como la tokenización, la lematización y el análisis de sentimientos con la biblioteca de patrones. Finalmente, también vimos cómo usar Pattern para realizar consultas de motores de búsqueda, extraer tweets en línea y limpiar documentos HTML.

Acerca de: Programator

Somos Instinto Programador

0 comentarios:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Con tecnología de Blogger.