Natural Language Processing: Count Vectorization with scikit-learn

0

Esta es una demostración sobre cómo usar la vectorización de conteos con scikit-learn en datos de texto real.

Vectorización de recuento (AKA One-Hot Encoding)

Una recapitulación de la vectorización de recuento

Hoy, vamos a estar observando una de las formas más básicas en que podemos representar datos de texto numéricamente: codificación única (o vectorización de conteo). La idea es muy simple.

Crearemos vectores que tengan una dimensionalidad igual al tamaño de nuestro vocabulario, y si los datos de texto tienen esa palabra de vocabulario, pondremos uno en esa dimensión.

Cada vez que nos volvamos a encontrar con esa palabra, aumentaremos el conteo, dejando 0 en todas partes donde no encontremos la palabra, incluso una vez.

El resultado de esto serán vectores muy grandes, si los usamos en datos de texto real, sin embargo, obtendremos recuentos muy precisos de la palabra contenido de nuestros datos de texto.

Desafortunadamente, esto no proporcionará el uso de ninguna información semántica o relacional, pero está bien, ya que ese no es el punto de usar esta técnica.

Hoy, vamos a usar el paquete de scikit-learn .

Un ejemplo básico

Este es un ejemplo básico del uso de la vectorización de conteo para obtener vectores:

 from sklearn.feature_extraction.text import CountVectorizer 

 # Para crear un Vectorizador de conteo, simplemente necesitamos crear una instancia. 
 # Hay parámetros especiales que podemos establecer aquí al hacer el vectorizador, pero 
 # para el ejemplo más básico, no es necesario. 
 vectorizer = CountVectorizer() 

 # Para nuestro texto, vamos a tomar un texto de nuestra publicación anterior 
 # sobre vectorización de recuento 
 sample_text = ["Unadelasmanerasmásbásicasderepresentarnuméricamentelaspalabras"
 "es a través del método de codificación única ( también a veces llamado "
" recuento de vectorización). "] 

 # Para crear realmente el vectorizador, simplemente necesitamos ajustar el texto 
 # datos que deseamos reparar 
 vectorizer.fit (sample_text) 

 # Ahora, podemos inspeccionar cómo nuestro vectorizador vectorizó el texto 
 # Esto imprimirá una lista de palabras usadas, y su índice en los vectores 
 print ('Vocabulary:') 
 print ( vectorizer.vocabulary _) 

 # Si nos gustaría crear un vector, podemos hacerlo pasando el 
 # texto al vectorizador para volver a contar 
 vector = vectorizer.transform (sample_text) [19659015] # Nuestro vector final: 
 print ('Full vector:') 
 print (vector.toarray ()) 

 # O si quisiéramos obtener el vector para una palabra: 
 imprimir (& # 039; Hot vector: & # 039;) 
 imprimir (vectorizer.transform (['hot']). Toarray ()) 

 # O si quisiéramos obtener varios vectores a la vez para matrices de construcción 
 imprimir ('Caliente y uno:') 
 pri nt (vectorizer.transform (['hot', 'one']). toarray ()) 

 # También podríamos hacer todo al mismo tiempo con el método fit_transform: 
 print ('One swoop:') 
 new_text = ['Today is the day that I do the thing today, today']
 new_vectorizer = CountVectorizer () 
 print (new_vectorizer.fit_transform(new_text).toarray())

Nuestro resultado:

 Vocabulary: 
 {'one & # 039 ;: 12, & # 039; de & # 039 ;: 11, & # 039; & # 039 ;: 15, & # 039; most & # 039 ;: 9, & # 039; básico & # 039 ;: 1 & # 039; ways & # 039 ;: 18, & # 039; we & # 039 ;: 19, 
 & # 039; can & # 039 ;: 3, & # 039; numerically & # 039 ;: 10, & # 039; representa & # 039 ;: 13, & # 039; palabras & # 039 ;: 20, & # 039; es & # 039 ;: 7, 
 & # 039; a & # 039 ;: 16, & # 039; caliente & # 039 ;: 6, & # 039; codificación & # 039 ;: 5, & # 039; método & # 039 ;: 8, & # 039; también & # 039 ;: 0, 
 & # 039; a veces & # 039 ;: 14 , & # 039; llamado & # 039 ;: 2, & # 039; contar & # 039 ;: 4, & # 039; vectorizar & # 039 ;: 17} 
 vector completo: 
[[1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1]] 
 vector caliente: 
[[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]] 
 Caliente y uno: 
[[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
 [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]] 
 Uno swoo p: 
[[1 1 1 1 2 1 3]]

Utilizándolo en Datos Reales:

¡Así que vamos a usarlo en algunos datos reales! Verificaremos el 20 conjunto de datos del Grupo de Noticias que viene con scikit-learn.

 from sklearn.datasets import fetch_20newsgroups 
 from sklearn.feature_extraction.text import CountVectorizer 

 import numpy as np 
 # Crea nuestro vectorizador 
 vectorizer = CountVectorizer() 

 # Vamos a buscar todos los datos de texto posibles 
 newsgroups_data = fetch_20newsgroups() 

 # ¿Por qué no inspeccionar una muestra de los datos de texto? ? 
 print('Muestra 0:') 
 print(newsgroups_data.data[0]) 
 print() 

 # Crear el vectorizador 
 vectorizer.fit ( newsgroups_data.data) 

 # Veamos el vocabulario: 
 print('Vocabulary:') 
 print(vectorizer.vocabulary_) 
 print() 

# Convertir nuestra primera muestra en un vector 
 v0 = vectorizer.transform ([newsgroups_datadata[0]]).Toarray()[0]
 print('Sample 0 (vectorized):') 
 print(v0) 
 print() 

 # Es demasiado grande para ver ... 
 # ¿Cuál es la longitud? 
 print('Muestra 0 (vectorizado) longitud:') 
 print(len (v0)) 
 print() 

 # ¿Cuántas palabras tiene? 
 imprimir ('Muestra 0 (vectorizado) ) sum:') 
 print(np.sum(v0)) 
 print() 

 # ¿Qué pasa si queremos volver a la fuente? 
 print('A la fuente:') 
 print(vectorizer.inverse_transform (v0)) 
 print() 

 # Entonces todos estos datos tienen mucha basura extra ... ¿Por qué no quitárselos? 
 newsgroups_data = fetch_20newsgroups (remove = ('encabezados',' pie de página','quotes')) 

 # ¿Por qué no inspeccionar una muestra del texto? datos? 
 imprimir ('Muestra 0:') 
 imprimir (newsgroups_data.data [0]) 
 imprimir () 

 # Crear el vectorizador 
 vectorizer.fit(newsgroups_data.data) 

 # Veamos el vocabulario: 
 print('Vocabulary:') 
 print(vectorizer.vocabulary_) 
 print() 

 # Convertir nuestra primera muestra en un vector 
 v0 = vectorizer.transform([newsgroups_datadatos[0]]).toarray()[0]
 print('Muestra 0 (vectorizada):') 
 print(v0) 
 print() 

 # Es demasiado grande como para ver ... 
 # ¿Cuál es la longitud? 
 print('Muestra 0 (vectorizada) longitud:') 
 print(len ( v0)) 
 print() 

 # ¿Cuántas palabras tiene? 
 print('Muestra 0 (vectorizada) suma:') 
 print(np.sum(v0)) 
 print() 

 # ¿Qué pasa si queremos volver a la fuente? 
 print('A la fuente:') 
 print(vectorizer.inverse_transform(v0)) 
 print()

Nuestra salida:

 Muestra 0: 
 De: lerxst@wam.umd.edu (donde es lo mío) 
 Asunto: QUÉ coche ¿es esto?? 
 Nntp-Posting-Host: rac3.wam.umd.edu 
 Organización: Universidad de Maryland, College Park 
 Líneas: 15 

 Me preguntaba si alguien podría iluminarme en este coche que vi 
 el otro día. Era un auto deportivo de 2 puertas, parecía ser de finales de los años 60 / 
 de los primeros años 70. Fue llamado Bricklin. Las puertas eran realmente pequeñas. Además, 
 el paragolpes delantero estaba separado del resto del cuerpo. Esto es 
 todo lo que sé. Si alguien puede decirme el nombre de un modelo, las especificaciones del motor, los años 
 de producción, dónde está hecho este automóvil, el historial o la información que 
 tiene sobre este coche moderno, envíe un correo electrónico. 

 Gracias. 
 - IL 
 ---- traído a usted por su barrio Lerxst ---- 


 
 Vocabulary: 
 {& # 039; from & # 039 ;: 56979 & # 039; lerxst & # 039 ;: 75358, & # 039; wam & # 039 ;: 123162, & # 039; umd & # 039 ;: 118280, & edu; # 509; 50527, 
 & # 039; donde & # 039 ;: 124031, & # 039; my & # 039 ;: 85354 & & 039; cosa & # 039; & 11439; & # 039; asunto & # 039 ;: 111322, 
 & # 039; qué & # 039 ;: 123984, & # 039; auto & # 039 ;: 37780, & es & # 039 ;: 68532, & nbsp; esto & # 039 ;: 114731, & nbsp; nntp & # 039 ;: 87620, 
 & # 039; publicar & # 039; & # 039; host & # 039 ;: 64095 & & 039; rac3 & # 039 ;: 98949 & # 039; organización & # 039 ;: 90379, 
 & # 039; universidad & # 039 ;: 118983, & # 039; de & # 039 ;: 89362, & # 039; maryland & # 039 ;: 79666, 
 & # 039; universidad & # 039 ;: 40998, ...} ( Abreviado ...) [19659015] Muestra 0 (vectorizada): 
 [0 0 0 ... 0 0 0] 

 Muestra 0 (vectorizada) longitud: 
 130107 

 Muestra 0 (vectorizada) suma: 
 122 

 A la fuente: 
 [array(['15''60s''70s''addition''all''anyone'&039;be''body'
 & # 039; bricklin & # 039 ;, & # 039; bring & # 039 ;, & # 039; bumper & # 039 ;, & # 039; by & # 039 ;, & # 039; llamado & # 039 ;, & # 039; puede & # 039 ;, & # 039; auto & # 039;, 
 & # 039 ; la universidad & # 039 ;, & # 039; podría & # 039 ;, & # 039; día & # 039 ;, & # 039; puerta & # 039 ;, & # 039; puertas & # 039 ;, & # 039; temprano & # 039; , & # 039; edu & # 039 ;, 
 & # 039; motor & # 039 ;, & # 039; iluminar & # 039 ;, & # 039; de & # 039 ;, & # 039; frente & # 039 ;, & # 039; funky & # 039 ;, & # 039; tener & # 039 ;, & # 039; history & # 039;, 
 & # 039; host & # 039 ;, & # 039; if & # 039 ;, & # 039 ; il & # 039 ;, & # 039; in & # 039 ;, & # 039; info & # 039 ;, & # 039; es & # 039 ;, & # 039; it & # 039 ;, & # 039; conocer & # 039; , & # 039; tarde & # 039;, 
 & # 039; lerxst & # 039 ;, & # 039; líneas & # 0 39 ;, & # 039; buscado & # 039; aspecto & # 039 ;, & # 039; hecho & # 039 ;, & # 039; correo & # 039 ;, & # 039; maryland & # 039;, 
 & # 039; yo & # 039 ;, & # 039; modelo & # 039 ;, & # 039; mi & # 039 ;, & # 039; nombre & # 039 ;, & # 039; vecindario & # 039 ;, & # 039; nntp & # 039 ;, & # 039; de & # 039 ;, & # 039; on & # 039 ;, 
 & # 039; o & # 039 ;, & # 039; organización & # 039 ;, & # 039; otros & # 039 ;, & # 039; out & # 039 ;, & # 039; parque & # 039 ;, & # 039; por favor & # 039 ;, & # 039; publicación & # 039 ;, 
 & # 039; producción & # 039; , & # 039; rac3 & # 039 ;, & # 039; really & # 039 ;, & # 039; rest & # 039 ;, & # 039; saw & # 039 ;, & # 039; separate & # 039 ;, & # 039; small & # 039 ;, 
 & # 039; specs & # 039 ;, & # 039; sports & # 039 ;, & # 039; subject & # 039 ;, & # 039; tellme & # 039 ;, & # 039; thanks & # 039 ;, & # 039; el & # 039 ;, & # 039; allí & # 039;, 
 & # 039; cosa & # 039 ;, & # 039; esto & # 039 ;, & # 039; a & # 039; , & # 039; umd & # 039 ;, & # 039; university & # 039 ;, & # 039; wam & # 039 ;, & # 039; era & # 039 ;, & # 039; eran & # 039 ;, 
 & # 039; what & # 039 ;, # 039; lo que sea & # 039 ;, & # 039; donde & # 039 ;, & # 039; wondering & # 039 ;, & # 039; años & # 039 ;, & # 039; usted & # 039 ;, & # 039; su & # 039;]
 dtype = & # 039; <U180 & # 039;)] 

 Ejemplo 0: 
 Me preguntaba si Cualquiera podría iluminarme en este auto que vi 
 el otro día. Era un auto deportivo de 2 puertas, parecía ser de finales de los años 60 / 
 de los primeros años 70. Fue llamado Bricklin. Las puertas eran realmente pequeñas. Además, 
 el paragolpes delantero estaba separado del resto del cuerpo. Esto es 
 todo lo que sé. Si alguien puede decirme el nombre del modelo, las especificaciones del motor, los años 
 de producción, dónde está hecho este automóvil, el historial o la información que 
 tiene sobre este automóvil con aspecto funky, envíe un correo electrónico. 

 Vocabulario: 
{'era': 95844 'preguntando': '' 'si':48754 'cualquiera':18915 'fuera':68847, 'allí':88638 
'podría':30074 'iluminar': 37335, 'y': 60560, 'en': 68080, 'este': 88767, 'auto': 25775 
'vi': 80623, 'el': 88532, 'otro': 68781, 'día': 31990, 'esto': 51326, 'puerta': '' 
'deportes': 84538 'parecía': 57390, 'a': 89360, 'ser': 21987, 'desde': 41715, 
'tarde': 55746, '60s': 9843, 'tarde': 35974, '70 ': 11174 'llamado': 25492 
'ladrillo': 24160, 'puertas': 34810, 'eran': 96247, 'realmente': 76471, ...} (Abreviado ...)  

Muestra 0 (vectorizada): [0 0 0 ... 0 0 0]

 Muestra 0 (vectorizada) longitud: 
 101631 

 Muestra 0 (vectorizada) suma: 
 85 

 A la fuente: 
 [array(['60s''70s''addition''all''anyone''be''body'
'bricklin','bumper','llamado','puede','automóvil','podría','día', 
'puerta','puertas','early','engine','iluminar','from','front', 
'funky','tener','historial','si','en','info','es','it','saber';, 
'tarde','se miró','buscando','hecho','correo','yo','modelo','nombre', 
'de','on','o','other','out','please','production','really';, 
'rest','saw','separate','small','especificaciones','sports','tellme', 
';','there','esto','a','era','eran','lo que sea',' donde';, 
'preguntándose','años','usted', dtype ='<U81')]

¿Ahora qué?

Entonces, ¿se estará preguntando qué ahora? Sabemos cómo vectorizar estas cosas en función de los conteos, pero ¿qué podemos hacer con esta información?

Bueno, por un lado, podríamos hacer un montón de análisis. Podríamos ver la frecuencia de los términos, podríamos eliminar las palabras de finalización, podríamos visualizar cosas, y podríamos tratar de agrupar.

Ahora que tenemos estas representaciones numéricas de estos datos textuales, ¡hay tanto que podemos hacer que no podríamos hacer antes!

Pero hagamos esto más concreto. Hemos estado utilizando estos datos de texto del conjunto de datos de 20 News Group. ¿Por qué no usarlo en una tarea?

El conjunto de datos del 20 News Group es un conjunto de datos de publicaciones en un foro, dividido en 20 categorías diferentes. ¿Por qué no utilizar nuestra vectorización para tratar de categorizar estos datos?

 from sklearn.datasets import fetch_20newsgroups 
 from sklearn.feature_extraction.text import CountVectorizer 

 from sklearn.naive_bayes import MultinomialNB 
 from sklearn import metrics 

 # Crea nuestro vectorizador 
 vectorizer = CountVectorizer() 

 # Todos los datos 
 newsgroups_train = fetch_20newsgroups(subconjunto = 'train', 
 remove = ('encabezados','pies de página', 'citas')) 
 newsgroups_test = fetch_20newsgroups (subconjunto = 'prueba', 
 eliminar = ('encabezados', 'pie de página', 'citas'))
 # Obtener los vectores de entrenamiento 
 vectores = vectorizer.fit_transform(newsgroups_train.data) 

 # Construir el clasificador 
 clf = MultinomialNB(alpha = .01) 

 # Entrenar al clasificador 
 clf.fit(vectores, newsgroups_t rain.target) 

 # Obtenga los vectores de prueba 
 vectors_test = vectorizer.transform(newsgroups_test.data) 

 # Predecir y calificar los vectores 
 pred = clf.predict(vectors_test) 
 acc_score = metrics.accuracy_score (newsgroups_test.target, pred) 
 f1_score = metrics.f1_score (newsgroups_test.target, pred, average = 'macro') 

 print('Puntuación de clasificación de precisión total: {}'.format(acc_score)) 
 print('Puntuación de clasificación Total F1: {}'.format(f1_score))

Nuestra salida:

 Clasificación de precisión total puntaje: 0.6460435475305364 
 Puntaje total de clasificación F1: 0.6203806145034193

Hmmm … Así que no es súper fantástico, ¡pero solo estamos usando vectores de conteo! ¡Una representación más rica haría maravillas para nuestros puntajes!

Envolviendo

¡Espero que sientas que aprendiste mucho sobre la vectorización de recuento, cómo usarla y algunas de las posibles aplicaciones de la misma! ¡Y estén atentos para más contenido de incrustación de palabras próximamente!

Deja un comentario

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