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!