Machine Learning procesamiento de texto es una de las tareas más comunes en muchas aplicaciones de ML. A continuación hay algunos ejemplos de tales aplicaciones.
- Traducción de idiomas: traducción de una oración de un idioma a otro.
- Análisis de sentimiento: determinar, a partir de un corpus de texto, si el sentimiento hacia cualquier tema o producto, etc. es positivo, negativo o neutral.
- Filtrado de correo no deseado: Detecte correos electrónicos / mensajes no solicitados y no deseados.
Estas aplicaciones se ocupa de gran cantidad de texto para realizar la clasificación o traducción e implica mucho trabajo en el back-end.
Transformar texto en algo que un algoritmo puede digerir es un proceso complicado. En este artículo, analizaremos los pasos implicados en Machine Learning procesamiento de texto.
Paso 1: Preprocesamiento de datos
- Tokenización: convierta oraciones en palabras
- Eliminación de signos de puntuación innecesarios
- Eliminación de palabras de parada: palabras frecuentes como “The”, “is”, etc. que no tienen semántica específica
- Stemming: las palabras se reducen a una raíz eliminando la inflexión mediante la eliminación de caracteres innecesarios, generalmente un sufijo.
- Lematización: otro enfoque para eliminar la inflexión determinar la parte del discurso y utilizar la base de datos detallada del idioma.
The stemmed form of studies is: studi
The stemmed form of studying is: study
The lemmatized form of studies is: study
The lemmatized form of studying is: study
Por lo tanto, la lematización y la ramificación ayudan a reducir palabras como “estudios”, “estudiar” a una forma de base común o la palabra raíz “estudio”.
Para una discusión detallada sobre Stemming & Lemmatization. Tenga en cuenta que no todos los pasos son obligatorios y se basan en el caso de uso de la aplicación.
Para el filtrado de correo no deseado podemos seguir todos los pasos anteriores, pero no para el problema de traducción.
Podemos usar python para realizar muchas operaciones de Machine Learning Procesamiento de texto y preprocesamiento.
- NLTK – El kit de herramientas de lenguaje natural es uno de los mejores- bibliotecas NLP de Machine Learning procesamiento de texto conocidas y más utilizadas, útiles para todo tipo de tareas desde tokenización, derivación, etiquetado, análisis y más allá
- BeautifulSoup – Biblioteca para extraer datos de documentos HTML y XML
#using NLTK library, we can do lot of text preprocesing
import nltk
from nltk.tokenize import word_tokenize
#function to split text into word
tokens = word_tokenize("The quick brown fox jumps over the lazy dog")
nltk.download('stopwords')
print(tokens)
OUT1: [‘The’, ‘quick’, ‘brown’, ‘fox’, ‘jumps’, ‘over’, ‘the’, ‘lazy’, ‘dog’]
from nltk.corpus import stopwords
stop_words = set(stopwords.words(‘english’))
tokens = [w for w in tokens if not w in stop_words]
print(tokens)
OUT2: [‘The’, ‘quick’, ‘brown’, ‘fox’, ‘jumps’, ‘lazy’, ‘dog’]
#NLTK provides several stemmer interfaces like Porter stemmer, #Lancaster Stemmer, Snowball Stemmer
from nltk.stem.porter import PorterStemmer
porter = PorterStemmer()
stems = []
for t in tokens:
stems.append(porter.stem(t))
print(stems)
OUT3: [‘the’, ‘quick’, ‘brown’, ‘fox’, ‘jump’, ‘lazi’, ‘dog’]
Paso 2: extracción de características
En Machine Learning Procesamiento de texto las palabras del texto representan características discretas y categóricas.
¿Cómo codificamos tal información de una manera que esté lista para ser utilizada por los algoritmos?
El mapeo de datos textuales a vectores con valores reales se llama extracción de características. Una de las técnicas más simples para representar texto numéricamente es Bag of Words.
Bolsa de palabras o Bag of Words (BOW): Hacemos la lista de palabras únicas en el corpus de texto llamado vocabulario. Entonces podemos representar cada oración o documento como un vector con cada palabra representada como 1 para el presente y 0 para ausente del vocabulario.
Otra representación se puede contar la cantidad de veces que cada palabra aparece en un documento. El enfoque más popular es el uso de la técnica Término frecuencia-frecuencia inversa del documento (TF-IDF) .
- Frecuencia temporal (TF) = (Cantidad de veces que aparece el término t en un documento) / (Número de términos en el documento)
- Frecuencia inversa del documento (IDF) = log (N / n), donde, N es el número de documentos yn es el número de documentos que tiene un término t apareció en. La IDF de una palabra rara es alta, mientras que la IDF de una palabra frecuente es probable que sea baja. Teniendo así el efecto de resaltar palabras que son distintas.
- Calculamos TF-IDF valor de un término como = TF * IDF
Tomemos un ejemplo para calcular TF-IDF de un término en un documento.
TF('beautiful',Document1) = 2/10, IDF('beautiful')=log(2/2) = 0
TF(‘day’,Document1) = 5/10, IDF(‘day’)=log(2/1) = 0.30
TF-IDF(‘beautiful’, Document1) = (2/10)*0 = 0
TF-IDF(‘day’, Document1) = (5/10)*0.30 = 0.15
Como puede ver en el Documento1, el método TF-IDF penaliza fuertemente la palabra ‘hermoso’, pero asigna un mayor peso a ‘día’.
Esto se debe a la parte IDF, que da más peso a las palabras que son distintas. En otras palabras, ‘día’ es una palabra importante para Document1 del contexto de todo el corpus.
Python scikit-learn biblioteca proporciona herramientas eficientes para minería de datos de texto y proporciona funciones para calcular TF-IDF de vocabulario de texto dado un corpus de texto.
Una de las principales desventajas de usar BOW es que descarta palabra orden ignorando el contexto y, a su vez, el significado de las palabras en el documento.
Para el procesamiento del lenguaje natural (NLP), mantener el contexto de las palabras es de suma importancia. Para resolver este problema, utilizamos otro enfoque llamado Incrustación de palabras.
Incrustación de palabras: Es una representación de texto donde las palabras que tienen el mismo significado tienen una representación similar. En otras palabras, representa palabras en un sistema de coordenadas donde las palabras relacionadas, basadas en un corpus de relaciones, se colocan más juntas.
Veamos algunos de los modelos bien conocidos de incrustación de palabras :
Word2Vec
Word2vec toma como entrada un gran corpus de texto y produce un espacio vectorial con cada palabra única asignada a un vector correspondiente en el espacio.
Los vectores de palabras se ubican en el espacio vectorial de forma tal que las palabras que comparten contextos comunes en el corpus se ubican muy cerca la una de la otra en el espacio.
Word2Vec es muy famoso para capturar significado y demostrarlo en tareas como calcular preguntas de analogía del formulario a es para b como c es para ?.
Por ejemplo, man es para mujer como tío es para ? ( tía ) usando un vector simple offset método basado en la distancia del coseno. Por ejemplo, aquí hay desplazamientos vectoriales para tres pares de palabras que ilustran la relación de género.
Este tipo de composición vectorial también nos permite responder la pregunta “Rey – Hombre + Mujer =?” Y llegar al resultado “Reina”!.
Todo lo cual es realmente notable cuando piensas que todo este conocimiento simplemente proviene de ver muchas palabras en contexto sin otra información proporcionada acerca de su semántica. Para obtener más información, consulte aquí .
GloVe
El vector global para representación de palabras, o GloVe algoritmo es una extensión del método de word2vec para eficientemente aprendiendo vectores de palabras.
GloVe construye una matriz explícita de contexto de palabras o co-ocurrencias de palabras usando estadísticas en todo el corpus de texto. El resultado es un modelo de aprendizaje que puede dar como resultado generalmente mejores incrustaciones de palabras.
Considere el siguiente ejemplo:
Palabras de destino: hielo, vapor
Palabras de la sonda: sólido, gas, agua, moda
Sea P (k | w) la probabilidad de que aparezca la palabra k en el contexto de la palabra w . Considere una palabra fuertemente relacionada con hielo pero no con vapor como sólido .
P (sólido | hielo) será relativamente alto, y P (sólido | vapor) será relativamente bajo.
Por lo tanto, la relación de P (sólido | hielo) / P (sólido | vapor) será grande.
Si tomamos una palabra como gas que está relacionada con vapor pero no con hielo la relación de P (gas | hielo) / P (gas | vapor) en cambio será pequeño. Para una palabra relacionada con hielo y vapor como agua esperamos que la relación se acerque a uno.
Las incrustaciones de palabras codifican cada palabra en un vector que captura algún tipo de relación y similitud entre las palabras dentro del cuerpo del texto. Esto significa que incluso las variaciones de palabras como el caso, la ortografía, la puntuación, etc., se aprenderán automáticamente. A su vez, esto puede significar que algunos de los pasos de limpieza de texto descritos anteriormente pueden no ser necesarios.
Paso 3: Elección de algoritmos de ML
Hay varios enfoques para crear modelos de ML para diversas aplicaciones basadas en texto dependiendo de lo que el espacio problema y los datos disponibles.
Los enfoques clásicos de ML como ‘Naive Bayes’ o ‘Support Vector Machines’ para el filtrado de spam se han utilizado ampliamente. Las técnicas de aprendizaje profundo están dando mejores resultados para problemas de PNL, como el análisis de sentimientos y la traducción de idiomas.
Los modelos de aprendizaje profundo son muy lentos de entrenar y se ha visto que para problemas simples de clasificación de texto, los enfoques de ML clásicos también dan resultados similares con un tiempo de entrenamiento más rápido.
Construyamos un Analizador de sentimiento sobre IMDB conjunto de datos de la revisión de la película utilizando las técnicas discutidas hasta ahora.
Descargue los datos de IMDb Movie Review Data
El conjunto de la revisión de la película IMDB se puede descargar desde aquí . Este conjunto de datos para la clasificación de sentimiento binario contiene un conjunto de 25,000 reseñas de películas altamente polares para entrenamiento y 25,000 para pruebas.
Este conjunto de datos se usó para el muy popular artículo ‘Aprendiendo los Vectores de Palabras para Análisis de Sentimientos’ .
Preprocesamiento
El conjunto de datos está estructurado como conjunto de prueba y conjunto de entrenamiento de 25000 archivos cada uno. Primero, leamos los archivos en un marco de datos de Python para su posterior procesamiento y visualización.
El conjunto de prueba y entrenamiento se divide en 12500 revisiones “positivas” y “negativas” cada una. Leemos cada archivo y etiquetamos la revisión negativa como ‘0’ y la revisión positiva como ‘1’
#convert the dataset from files to a python DataFrame
import pandas as pd
import os
folder = 'aclImdb'
labels = {'pos': 1, 'neg': 0}
df = pd.DataFrame()
for f in ('test', 'train'):
for l in ('pos', 'neg'):
path = os.path.join(folder, f, l)
for file in os.listdir (path) :
with open(os.path.join(path, file),'r', encoding='utf-8') as infile:
txt = infile.read()
df = df.append([[txt, labels[l]]],ignore_index=True)
df.columns = ['review', 'sentiment']
Déjenos guardar los datos ensamblados como archivos .csv para su uso posterior.
Para obtener la distribución de frecuencia de las palabras en el texto, podemos utilizar la función nltk.FreqDist (), que enumera las palabras principales utilizadas en el texto.
Proporcionando una idea aproximada del tema principal en los datos de texto, como se muestra en el siguiente código:
import nltk
from nltk.tokenize import word_tokenize
reviews = df.review.str.cat(sep=' ')
#function to split text into word
tokens = word_tokenize(reviews)
vocabulary = set(tokens)
print(len(vocabulary))
frequency_dist = nltk.FreqDist(tokens)
sorted(frequency_dist,key=frequency_dist.__getitem__, reverse=True)[0:50]
Esto proporciona las 50 palabras principales usadas en el texto, aunque es obvio que algunas de las palabras de finalización, como la, ocurren con frecuencia en el idioma inglés.
Observe de cerca y encuentre mucha puntuación y etiquetas innecesarias, excluyendo palabras de una y dos letras . Las palabras stop como the, this y, que ocupan la ranura superior en el diagrama de distribución de frecuencia de palabras que se muestra a continuación.
Vamos a eliminar las palabras stop para una mayor limpieza del cuerpo del texto.
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))
tokens = [w for w in tokens if not w in stop_words]
Esto parece un corpus de texto limpio ahora y palabras como went, saw, movie etc. tomando las ranuras superiores como se esperaba.
Otro útil toolkit de herramientas de visualización ayuda a crear nubes de palabras colocando palabras en un lienzo al azar, con tamaños proporcionales a su frecuencia en el texto.
from wordcloud
import WordCloud
import matplotlib.pyplot as plt
wordcloud = WordCloud()
generate_from_frequencies(frequency_dist)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
Construyendo un clasificador
Después de la limpieza, es t Es para construir el clasificador para identificar el sentimiento de cada crítica de la película. Del conjunto de datos de IMDb, divida los conjuntos de prueba y entrenamiento de 25000 cada uno:
X_train = df.loc[:24999, 'review'].values
y_train = df.loc[:24999, 'sentiment'].values
X_test = df.loc[25000:, 'review'].values
y_test = df.loc[25000:, 'sentiment'].values
Usamos TfidTransformer para encubrir el corpus de texto en los vectores de características, restringimos las características máximas a 10000. Para más detalles acerca de cómo usar TfidTransformerrefer aquí .
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
train_vectors = vectorizer.fit_transform(X_train)
test_vectors = vectorizer.transform(X_test)
print(train_vectors.shape, test_vectors.shape)
Hay muchos algoritmos para elegir, utilizaremos un clasificador Naive Bayes básico y entrenaremos el modelo en el conjunto de entrenamiento.
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(train_vectors, y_train)
Nuestro Analizador de Sentimientos está listo y entrenado. Ahora probemos el rendimiento de nuestro modelo en el conjunto de pruebas para predecir las etiquetas de opinión.
from sklearn.metrics import accuracy_score
predicted = clf.predict(test_vectors)
print(accuracy_score(y_test,predicted))
Output 0.791
¡Guau! El analizador de sentimientos básico basado en el clasificador NB hace bien en proporcionar un 79% de precisión. Puede intentar cambiar la longitud del vector de características y los parámetros variables de TfidTransforme para ver el impacto en la precisión del modelo.
Conclusión: Hemos discutido las técnicas de Machine Learning Procesamiento de texto utilizadas en PNL en detalle. También demostramos el uso del procesamiento de textos y construimos un Analizador de Sentimientos con un enfoque ML clásico que obtuvo resultados bastante buenos.
Gracias por leer este artículo, recomendarlo y compartirlo si lo desea.