English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Aprendizaje del algoritmo de extracción de características de texto y vectorización en Python

Este artículo comparte el código específico de extracción de características de texto y vectorización en Python, a modo de ejemplo, como se muestra a continuación

Supongamos que acabamos de ver la gran película de Nolan, Interstellar, y pensemos cómo hacer que la máquina analice automáticamente las opiniones de los espectadores sobre la película, ¿serán "buenas" (positivas) o "malas" (negativas)?

Este tipo de problema pertenece a los problemas de análisis de sentimientos. El primer paso en el tratamiento de este tipo de problema es convertir el texto en características.

Por lo tanto, en este capítulo, solo aprenderemos el primer paso, cómo extraer características de los textos y cómo vectorizarlas.

Dado que el procesamiento del chino implica problemas de segmentación de palabras, en este artículo se utiliza un ejemplo simple para explicar cómo utilizar la biblioteca de aprendizaje automático de Python para extraer características de textos en inglés.

1、preparación de datos

El módulo sklearn.datasets de Python admite la lectura de todos los textos clasificados desde un directorio. Sin embargo, los directorios deben estar organizados según la regla de un directorio por nombre de etiqueta. Por ejemplo, el conjunto de datos utilizado en este artículo tiene2etiquetas, una llamada "net" y otra "pos", y cada directorio tiene6El archivo de texto se muestra a continuación:

neg
    1.txt
    2.txt
    ......
pos
    1.txt
    2.txt
    ....

12El contenido del archivo se resume como se muestra a continuación:

neg: 
  ¡mierda! 
  ¡perdí mi dinero! 
  ¡perdida de dinero! 
  ¡película de mierda! 
  ¡perdida de tiempo! 
  ¡película de mierda! 
pos: 
  ¡no bueno! ¡película no buena! 
  ¡no bueno! 
  ¡Vale la pena mi dinero!} 
  ¡Me encanta esta película! 
  ¡Una buena película! 
  ¡Vale la pena! 

2、Texto de Características

¿Cómo podemos extraer la actitud emocional de estos textos en inglés y realizar una clasificación?

La manera más intuitiva es extraer palabras. Se considera que muchas palabras clave pueden reflejar la actitud del hablante. Por ejemplo, en este conjunto de datos simple, es fácil descubrir que aquellos que dicen 'shit' pertenecen necesariamente a la clase neg.

Por supuesto, el conjunto de datos anterior se diseñó de manera sencilla para facilitar la descripción. En la realidad, una palabra a menudo tiene una actitud ambigua. Sin embargo, aún hay razón para creer que cuanto más una palabra aparezca en la clase neg, mayor será la probabilidad de que ella represente una actitud negativa.
También notamos que algunas palabras no tienen significado para la clasificación de emociones. Por ejemplo, las palabras 'of', 'I' y otras en los datos anteriores. Estos términos tienen un nombre, llamado “Stop_Word”(palabras de stop)。Estos términos se pueden ignorar completamente sin hacer estadísticas. Obviamente, ignorar estas palabras puede optimizar el espacio de almacenamiento de los registros de frecuencia de palabras y acelerar la construcción.
Tener en cuenta la frecuencia de cada palabra como una característica importante también tiene un problema. Por ejemplo, la palabra 'movie' en los datos anteriores, en12apareció en5veces, pero aparecen aproximadamente el mismo número de veces en ambos lados, por lo que no tienen una gran diferencia.2veces, pero solo aparece en la clase pos, lo que significa que tiene un fuerte color emocional, es decir, una alta diferencia.

Por lo tanto, necesitamos introducirTF-IDF(Frecuencia de Palabra)-Inverse Document Frequency,Frecuencia de Palabra y Frecuencia Inversa del Documento)considerar a cada palabra de manera más detallada.

TF (Frecuencia de Palabra)La calculación es很简单, es decir, para un archivo t, la frecuencia con la que una palabra Nt aparece en ese documento. Por ejemplo, en el documento 'I love this movie', la frecuencia TF de la palabra 'love' es1/4。Si eliminamos las palabras de stop 'I' y 'it',则为1/2。

IDF (Frecuencia Inversa del Documento)Lo que significa que para una palabra t, el número de documentos que contienen esa palabra Dt, representa la proporción de todos los documentos de prueba D, y luego se toma el logaritmo natural.
por ejemplo, la palabra 'movie' apareció5veces, mientras que el número total de documentos es12,por lo tanto, el IDF es ln(5/12).
Es evidente que el IDF es para resaltar las palabras que aparecen poco pero tienen un fuerte color emocional. Por ejemplo, el IDF de una palabra como 'movie' es ln(12/5)=0.88,que es mucho menor que el IDF de 'love' = ln(12/1)=2.48。

TF-IDFSimplemente multiplica ambos valores juntos. De esta manera, calculamos el TF de cada palabra en cada documento.-IDF, es el valor de característica de texto extraído.

3、向量化

Con la base anterior, podemos vectorizar el documento. Veamos primero el código, y luego analizaremos el significado de la vectorización:

#}} -*- coding: utf-8 -*- 
import scipy as sp 
import numpy as np 
from sklearn.datasets import load_files 
from sklearn.cross_validation import train_test_split 
from sklearn.feature_extraction.text import TfidfVectorizer 
'''''Cargar conjunto de datos, dividir conjunto de datos80% de entrenamiento20% de prueba 
movie_reviews = load_files('endata')  
doc_terms_train, doc_terms_test, y_train, y_test\ 
  = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3) 
'''''Modelo de espacio vectorial con características BOOL, atención, el ejemplo de muestra llama al interfaz transform''' 
count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\ 
              stop_words = 'english') 
x_train = count_vec.fit_transform(doc_terms_train) 
x_test = count_vec.transform(doc_terms_test) 
x    = count_vec.transform(movie_reviews.data) 
y    = movie_reviews.target 
print(doc_terms_train) 
print(count_vec.get_feature_names()) 
print(x_train.toarray()) 
print(movie_reviews.target) 

El resultado de la ejecución es el siguiente:
[b'perdida de tiempo.', b'una película de mierda.', b'una buena película.', b'¡Me encanta esta película!', b'mierda.', b'valió la pena.', b'una buena película.', b'¡Valió la pena!']
['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']
[[ 0.          0.          0.          0.          0.          0.   0.70710678  0.70710678  0.        ]
 [ 0.          0.          0.60335753  0.          0.          0.79747081   0.          0.          0.        ]
 [ 0.          0.          0.53550237  0.84453372  0.          0.          0.   0.          0.        ]
 [ 0.84453372  0.          0.53550237  0.          0.          0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          1.          0.   0.          0.        ]
 [ 0.          0.76642984  0.          0.          0.          0.          0.   0.          0.64232803]
 [ 0.          0.          0.53550237  0.          0.84453372  0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.          0.   0.          1.        ]]
[1 1 0 1 0 1 0 1 1 0 0 0]

python输出的比较混乱。我这里做了一个表格如下:

从上表可以发现如下几点:

1、停用词的过滤。

初始化count_vec的时候,我们在count_vec构造时传递了stop_words = 'english',表示使用默认的英文停用词。可以使用count_vec.get_stop_words()查看TfidfVectorizer内置的所有停用词。当然,在这里可以传递你自己的停用词list(比如这里的“movie”)

2y TF-calculación de IDF.

Aquí el cálculo de la frecuencia de palabras utiliza TfidfVectorizer de sklearn. Esta clase hereda de CountVectorizer, y en la base de la estadística básica de frecuencia de palabras de este último, se agregan como TF-y otras funciones como IDF.
Descubriremos que los resultados calculados aquí son un poco diferentes de los calculados anteriormente. Porque aquí count_vec se construyó por defecto con max_df=1Por lo tanto, TF-IDF se han realizado procesamientos de normalización para que todos los valores se restringan en [0,1entre]

3La transformación de count_vec.fit es una matriz enorme. podemos ver que hay muchos 0 en la tabla superior, por lo que sklearn utiliza matrices dispersas internamente. Este ejemplo de datos es pequeño. Si los lectores están interesados, pueden probar con datos reales utilizados por los investigadores de aprendizaje automático, provenientes de la Universidad de Cornell:http://www.cs.cornell.edu/people/pabo/movie-review-data/. Este sitio web ofrece muchos conjuntos de datos, entre los cuales hay algunos2bases de datos de ejemplo, ejemplos positivos y negativos7aproximadamente. Tamaño de datos de este tipo no es grande1minutos, aún se puede completar, se recomienda probar. Sin embargo, hay que tener en cuenta que estos conjuntos de datos pueden contener caracteres ilegales. Por lo tanto, se pasó decode_error = 'ignore' en la construcción de count_vec para ignorar estos caracteres ilegales.

Los resultados en la tabla superior son los resultados de entrenamiento8de ejemplos8es un resultado de una característica. Este resultado se puede clasificar utilizando varios algoritmos de clasificación.

Esto es todo el contenido del artículo, espero que sea útil para su aprendizaje y que todos los amigos nos apoyen y alentemos el tutorial.

Declaración: El contenido de este artículo se obtiene de la red, pertenece al propietario original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume la responsabilidad legal relevante. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @ para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)

Te gustará