Você está na página 1de 17

Análisis de texto para principiantes utilizando NLTK

Aprende a analizar texto utilizando NLTK. Analiza los sentimientos de las personas
y clasifica críticas de películas.

En el área actual de internet y servicios en línea, los datos se generan a una


velocidad y cantidad increíbles. En general, los analistas de datos, los ingenieros y
los científicos manejan datos relacionales o tabulares. Estas columnas de datos
tabulares tienen datos numéricos o categóricos. Los datos generados tienen una
variedad de estructuras como texto, imagen, audio y video. Las actividades en
línea como artículos, texto de sitios web, publicaciones de blogs, publicaciones en
redes sociales están generando datos textuales no estructurados. Las empresas y
los negocios deben analizar los datos textuales para comprender las actividades,
la opinión y los comentarios de los clientes para obtener sus negocios con
éxito. Para competir con grandes datos textuales, el análisis de texto está
evolucionando a un ritmo más rápido que nunca.

Text Analytics tiene muchas aplicaciones en el mundo en línea de hoy. Al analizar


los tweets en Twitter, podemos encontrar noticias de tendencias y la reacción de
las personas en un evento en particular. Amazon puede comprender los
comentarios de los usuarios o revisar el producto específico. BookMyShow puede
descubrir la opinión de la gente sobre la película. Youtube también puede analizar
y comprender los puntos de vista de las personas en un video.

En este tema, se cubrirá los siguientes temas:

 Analítica de textos y PNL

 Compare Text Analytics, NLP y Text Mining


o Operaciones de análisis de texto usando NLTK

o Tokenización
o Para las palabras

o Normalización del léxico, como la derivación y la lematización.

o Etiquetado POS

 Análisis de los sentimientos

 Clasificación de texto

 Realización de análisis de sentimiento utilizando clasificación de texto

Analítica de textos y PNL

La comunicación de texto es una de las formas más populares de conversión del


día a día. Chateamos, enviamos mensajes, twiteamos, compartimos el estado,
enviamos correos electrónicos, escribimos blogs, compartimos opiniones y
comentarios en nuestra rutina diaria. Todas estas actividades están generando
texto en una cantidad significativa, que no está estructurada en la naturaleza. En
esta área del mercado en línea y las redes sociales, es esencial analizar grandes
cantidades de datos para comprender la opinión de las personas.

La PNL permite que la computadora interactúe con los humanos de una manera
natural. Ayuda a la computadora a comprender el lenguaje humano y derivar un
significado de él. La PNL es aplicable en varias problemáticas, desde
reconocimiento de voz, traducción de idiomas, clasificación de documentos hasta
extracción de información. El análisis de la revisión de películas es uno de los
ejemplos clásicos para demostrar un modelo sencillo de bolsa de palabras de la
PNL en las reseñas de películas.

Compare Text Analytics, NLP y Text Mining

La minería de texto también se conoce como análisis de texto. La minería de


textos es un proceso de exploración de datos textuales importantes y de búsqueda
de patrones. Text Mining procesa el texto mismo, mientras que NLP procesa con
los metadatos subyacentes. Encontrar conteos de frecuencia de palabras, longitud
de la oración, presencia / ausencia de palabras específicas se conoce como
minería de textos. El procesamiento del lenguaje natural es uno de los
componentes de la minería de textos. La PNL ayuda a identificar sentimientos,
encontrar entidades en la oración y la categoría de blog / artículo. La minería de
textos son datos preprocesados para análisis de texto. En Text Analytics, el
algoritmo estadístico y de aprendizaje automático utilizado para clasificar la
información.

Operaciones de análisis de texto usando NLTK

NLTK es un poderoso paquete de Python que proporciona un conjunto de diversos


algoritmos de lenguajes naturales. Es gratuito, de código abierto, fácil de usar,
gran comunidad y está bien documentado. NLTK consta de los algoritmos más
comunes, como tokenización, etiquetado de parte del discurso, derivación, análisis
de sentimiento, segmentación de temas y reconocimiento de entidades
nombradas. NLTK ayuda a la computadora a analizar, preprocesar y entender el
texto escrito.

!pip install nltk

Requirement already satisfied: nltk in /home/northout/anaconda2/lib/python2.7/site-

packages
Requirement already satisfied: six in /home/northout/anaconda2/lib/python2.7/site-

packages (from nltk)

[33mYou are using pip version 9.0.1, however version 10.0.1 is available.

You should consider upgrading via the 'pip install --upgrade pip' command. [0m

#Loading NLTK

import nltk
Tokenización

La tokenización es el primer paso en el análisis de texto. El proceso de


descomponer un párrafo de texto en partes más pequeñas, como palabras u
oraciones, se denomina Tokenización. El token es una entidad única que está
construyendo bloques para una oración o párrafo.

Tokenización de oraciones

El tokenizer de oraciones divide el párrafo de texto en oraciones.

from nltk.tokenize import sent_tokenize

text="""Hello Mr. Smith, how are you doing today? The weather is great, and city is

awesome.

The sky is pinkish-blue. You shouldn't eat cardboard"""

tokenized_text=sent_tokenize(text)

print(tokenized_text)

['Hello Mr. Smith, how are you doing today?', 'The weather is great, and city is

awesome.', 'The sky is pinkish-blue.', "You shouldn't eat cardboard"]

Aquí, el texto dado es tokenizado en oraciones.

Tokenización de palabras

El tokenizador de palabras divide el párrafo de texto en palabras.


from nltk.tokenize import word_tokenize

tokenized_word=word_tokenize(text)

print(tokenized_word)

['Hello', 'Mr.', 'Smith', ',', 'how', 'are', 'you', 'doing', 'today', '?', 'The', 'weather', 'is',

'great', ',', 'and', 'city', 'is', 'awesome', '.', 'The', 'sky', 'is', 'pinkish-blue', '.', 'You',

'should', "n't", 'eat', 'cardboard']


Distribución de frecuencias

from nltk.probability import FreqDist

fdist = FreqDist(tokenized_word)

print(fdist)

<FreqDist with 25 samples and 30 outcomes>

fdist.most_common(2)

[('is', 3), (',', 2)]

# Frequency Distribution Plot

import matplotlib.pyplot as plt

fdist.plot(30,cumulative=False)

plt.show()

Para las palabras

Las palabras clave se consideran como ruido en el texto. El texto puede contener
palabras de parada como es, am, are, this, a, an, the, etc.

En NLTK para eliminar palabras clave, debe crear una lista de palabras clave y
filtrar su lista de tokens de estas palabras.
from nltk.corpus import stopwords

stop_words=set(stopwords.words("english"))

print(stop_words)

{'their', 'then', 'not', 'ma', 'here', 'other', 'won', 'up', 'weren', 'being', 'we', 'those', 'an',

'them', 'which', 'him', 'so', 'yourselves', 'what', 'own', 'has', 'should', 'above', 'in',

'myself', 'against', 'that', 'before', 't', 'just', 'into', 'about', 'most', 'd', 'where', 'our', 'or',

'such', 'ours', 'of', 'doesn', 'further', 'needn', 'now', 'some', 'too', 'hasn', 'more', 'the',

'yours', 'her', 'below', 'same', 'how', 'very', 'is', 'did', 'you', 'his', 'when', 'few', 'does',

'down', 'yourself', 'i', 'do', 'both', 'shan', 'have', 'itself', 'shouldn', 'through',

'themselves', 'o', 'didn', 've', 'm', 'off', 'out', 'but', 'and', 'doing', 'any', 'nor', 'over',

'had', 'because', 'himself', 'theirs', 'me', 'by', 'she', 'whom', 'hers', 're', 'hadn', 'who',

'he', 'my', 'if', 'will', 'are', 'why', 'from', 'am', 'with', 'been', 'its', 'ourselves', 'ain',

'couldn', 'a', 'aren', 'under', 'll', 'on', 'y', 'can', 'they', 'than', 'after', 'wouldn', 'each',

'once', 'mightn', 'for', 'this', 'these', 's', 'only', 'haven', 'having', 'all', 'don', 'it', 'there',

'until', 'again', 'to', 'while', 'be', 'no', 'during', 'herself', 'as', 'mustn', 'between', 'was',

'at', 'your', 'were', 'isn', 'wasn'}

Eliminando Stopwords

filtered_sent=[]

for w in tokenized_sent:

if w not in stop_words:

filtered_sent.append(w)

print("Tokenized Sentence:",tokenized_sent)

print("Filterd Sentence:",filtered_sent)

Tokenized Sentence: ['Hello', 'Mr.', 'Smith', ',', 'how', 'are', 'you', 'doing', 'today', '?']

Filterd Sentence: ['Hello', 'Mr.', 'Smith', ',', 'today', '?']


Normalización del Léxico

La normalización del léxico considera otro tipo de ruido en el texto. Por ejemplo,
conexión, conectado, conectando palabra reduce a una palabra común
"conectar". Reduce las formas relacionadas de forma derivada de una palabra a
una raíz común.

Tallo

La derivación es un proceso de normalización lingüística, que reduce las palabras


a su palabra raíz o corta los afijos de derivación. Por ejemplo, conexión,
conectado, conectando palabra reduce a una palabra común "conectar".

# Stemming

from nltk.stem import PorterStemmer

from nltk.tokenize import sent_tokenize, word_tokenize

ps = PorterStemmer()

stemmed_words=[]

for w in filtered_sent:

stemmed_words.append(ps.stem(w))

print("Filtered Sentence:",filtered_sent)

print("Stemmed Sentence:",stemmed_words)

Filtered Sentence: ['Hello', 'Mr.', 'Smith', ',', 'today', '?']

Stemmed Sentence: ['hello', 'mr.', 'smith', ',', 'today', '?']

Lemmatización

La lematización reduce las palabras a su palabra base, que es un lema


lingüísticamente correcto. Transforma la raíz con el uso de vocabulario y análisis
morfológico. La lematización suele ser más sofisticada que la derivación. Stemmer
trabaja en una palabra individual sin conocimiento del contexto. Por ejemplo, la
palabra "mejor" tiene "bueno" como lema. Esta cosa fallará porque se requiere una
búsqueda en el diccionario.

#Lexicon Normalization

#performing stemming and Lemmatization

from nltk.stem.wordnet import WordNetLemmatizer

lem = WordNetLemmatizer()

from nltk.stem.porter import PorterStemmer

stem = PorterStemmer()

word = "flying"

print("Lemmatized Word:",lem.lemmatize(word,"v"))

print("Stemmed Word:",stem.stem(word))

Lemmatized Word: fly

Stemmed Word: fli

Etiquetado POS

El objetivo principal del etiquetado de la parte del habla (POS) es identificar el


grupo gramatical de una palabra determinada. Ya sea un NOUN, PRONOUN,
ADJECTIVE, VERB, ADVERBS, etc. basado en el contexto. El etiquetado POS
busca relaciones dentro de la oración y asigna una etiqueta correspondiente a la
palabra.

sent = "Albert Einstein was born in Ulm, Germany in 1879."

tokens=nltk.word_tokenize(sent)

print(tokens)
['Albert', 'Einstein', 'was', 'born', 'in', 'Ulm', ',', 'Germany', 'in', '1879', '.']
nltk.pos_tag(tokens)

[('Albert', 'NNP'),

('Einstein', 'NNP'),

('was', 'VBD'),

('born', 'VBN'),

('in', 'IN'),

('Ulm', 'NNP'),

(',', ','),

('Germany', 'NNP'),

('in', 'IN'),

('1879', 'CD'),

('.', '.')]

POS etiquetado: Albert / NNP Einstein / NNP era / nacido en VBD / VBN en / IN
Ulm / NNP, /, Alemania / NNP en / IN 1879 / CD ./.

Análisis de los sentimientos

Hoy en día las empresas quieren entender, ¿qué salió mal con sus últimos
productos? ¿Qué piensan los usuarios y el público en general sobre la última
característica? Puede cuantificar dicha información con una precisión razonable
utilizando el análisis de sentimientos.

La cuantificación de contenido, idea, creencia y opinión de los usuarios se conoce


como análisis de sentimientos. La publicación en línea del usuario, los blogs, los
tweets, los comentarios del producto ayudan a los empresarios a llegar a la
audiencia objetivo e innovan en productos y servicios. El análisis del sentimiento
ayuda a comprender a las personas de una manera mejor y más precisa. No solo
se limita al marketing, sino que también puede utilizarse en política, investigación y
seguridad.
La comunicación humana no se limita a las palabras, es más que palabras. Los
sentimientos son palabras de combinación, tono y estilo de escritura. Como
analista de datos, es más importante comprender nuestros sentimientos, ¿qué
significa realmente?

Existen principalmente dos enfoques para realizar el análisis del sentimiento.


 Basado en léxico: cuente el número de palabras positivas y negativas en el
texto dado y el recuento más grande será el sentimiento del texto.
 Enfoque basado en el aprendizaje automático: desarrolle un modelo de
clasificación, que se entrena utilizando el conjunto de datos pre-etiquetado
de positivo, negativo y neutral.

En este tutorial, utilizará el segundo enfoque (enfoque basado en el aprendizaje


automático). Así es como aprendes el sentimiento y la clasificación de texto con un
solo ejemplo.

Clasificación de texto

La clasificación de textos es una de las tareas importantes de la minería de


textos. Es un enfoque supervisado. Identificación de la categoría o clase de texto
dado, como un blog, libro, página web, artículos de noticias y tweets. Tiene varias
aplicaciones en el mundo informático actual, como detección de spam,
categorización de tareas en servicios CRM, categorización de productos en sitios
web de minoristas electrónicos, clasificación del contenido de sitios web para un
motor de búsqueda, comentarios de los comentarios de los clientes, etc. En la
siguiente sección, Aprenderás cómo puedes hacer clasificación de texto en
python.
Realización de análisis de sentimiento utilizando clasificación de texto

# Import pandas

import pandas as pd

Cargando datos

Hasta ahora, ha aprendido el preprocesamiento de datos utilizando NLTK. Ahora,


aprenderás Clasificación de texto. Realizarás la Clasificación Multi-Nomial Naive
Bayes usando scikit-learn.

En el modelo de la parte de construcción, puede utilizar el conjunto de datos


"Análisis de opiniones de películas, reseñas" disponible en Kaggle. El conjunto de
datos es un archivo separado por tabulaciones. El conjunto de datos tiene cuatro
columnas: PhraseId, Sentencia, Frase y Sentimiento.

Este dato tiene 5 etiquetas de sentimiento:

0 - negativo 1 - algo negativo 2 - neutral 3 - algo positivo 4 - positivo

Aquí, puedes construir un modelo para clasificar el tipo de cultivar. El conjunto de


datos está disponible en Kaggle. Puede descargarlo desde el siguiente
enlace: https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews/data
data=pd.read_csv('train.tsv', sep='\t')

data.head()
PhraseId ID de sentencia Frase Sentimiento
0 1 1 Una serie de aventuras 1
que demuestran el
adagio ...
1 2 1 Una serie de aventuras 2
que demuestran el
adagio ...
2 3 1 Una serie 2
3 4 1 UNA 2
4 5 1 serie 2

data.info()

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 156060 entries, 0 to 156059

Data columns (total 4 columns):

PhraseId 156060 non-null int64

SentenceId 156060 non-null int64

Phrase 156060 non-null object

Sentiment 156060 non-null int64

dtypes: int64(3), object(1)

memory usage: 4.8+ MB

data.Sentiment.value_counts()

2 79582

3 32927

1 27273

4 9206

0 7072

Name: Sentiment, dtype: int64

Sentiment_count=data.groupby('Sentiment').count()
plt.bar(Sentiment_count.index.values, Sentiment_count['Phrase'])
plt.xlabel('Review Sentiments')

plt.ylabel('Number of Review')

plt.show()

Generación de características utilizando bolsa de palabras

En el problema de clasificación de texto, tenemos un conjunto de textos y sus


respectivas etiquetas. Pero directamente no podemos usar texto para nuestro
modelo. Necesita convertir este texto en algunos números o vectores de números.

El modelo de bolsa de palabras (BoW) es la forma más sencilla de extraer


características del texto. BoW convierte el texto en la matriz de aparición de
palabras dentro de un documento. Este modelo se refiere a si las palabras dadas
ocurrieron o no en el documento.

Ejemplo: hay tres documentos:

Doc 1: Me encantan los perros. Doc 2: Odio los perros y los tejidos. Doc 3: Tejer
es mi pasatiempo y pasión.

Ahora, puede crear una matriz de documento y palabras contando la aparición de


palabras en el documento dado. Esta matriz se conoce como Matriz de documento
a término (DTM).
Esta matriz está utilizando una sola palabra. Puede ser una combinación de dos o
más palabras, que se denomina modelo bigram o trigrama y el enfoque general se
denomina modelo n-gram.

Puede generar una matriz de términos de documentos utilizando el


CountVectorizer de scikit-learn.

from sklearn.feature_extraction.text import CountVectorizer

from nltk.tokenize import RegexpTokenizer

#tokenizer to remove unwanted elements from out data like symbols and numbers

token = RegexpTokenizer(r'[a-zA-Z0-9]+')

cv = CountVectorizer(lowercase=True,stop_words='english',ngram_range =

(1,1),tokenizer = token.tokenize)
text_counts= cv.fit_transform(data['Phrase'])

Split tren y test set

Para comprender el rendimiento del modelo, dividir el conjunto de datos en un


conjunto de entrenamiento y un conjunto de prueba es una buena estrategia.

Dividamos el conjunto de datos utilizando la función train_test_split (). Necesita


pasar básicamente 3 características de parámetros, destino y tamaño de
test_set. Además, puede usar random_state para seleccionar registros al azar.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(

text_counts, data['Sentiment'], test_size=0.3, random_state=1)

Modelo de construcción y evaluación

Construyamos el Modelo de Clasificación de Texto usando TF-IDF.

Primero, importe el módulo MultinomialNB y cree un objeto clasificador Multinomial


Naive Bayes utilizando la función MultinomialNB ().

Luego, ajuste su modelo en un conjunto de trenes utilizando fit () y realice una


predicción en el conjunto de pruebas utilizando predict ().

from sklearn.naive_bayes import MultinomialNB

#Import scikit-learn metrics module for accuracy calculation

from sklearn import metrics

# Model Generation Using Multinomial Naive Bayes

clf = MultinomialNB().fit(X_train, y_train)

predicted= clf.predict(X_test)

print("MultinomialNB Accuracy:",metrics.accuracy_score(y_test, predicted))

MultinomialNB Accuracy: 0.604916912299

Bueno, obtuviste una tasa de clasificación de 60.49% usando CountVector (o


BoW), lo que no se considera una buena precisión. Necesitamos mejorar esto.

Generación de características utilizando TF-IDF

En Frecuencia de término (TF), solo cuenta la cantidad de palabras que aparecen


en cada documento. El principal problema con este término de frecuencia es que
dará más peso a los documentos más largos. La frecuencia de término es
básicamente la salida del modelo BoW.
IDF (Frecuencia de documentos inversos) mide la cantidad de información que
proporciona una palabra dada en todo el documento. IDF es la relación inversa
escalada logarítmicamente del número de documentos que contienen la palabra y
el número total de documentos.

TF-IDF (Frecuencia de frecuencia inversa de términos de término) normaliza la


matriz de términos de documentos. Es el producto de TF y IDF. Palabra con alto tf-
idf en un documento, es la mayoría de las veces que se produce en documentos
dados y debe estar ausente en los otros documentos. Así que las palabras deben
ser una palabra de la firma.

from sklearn.feature_extraction.text import TfidfVectorizer

tf=TfidfVectorizer()

text_tf= tf.fit_transform(data['Phrase'])

Split tren y set de prueba (TF-IDF)

Dividamos el conjunto de datos utilizando la función train_test_split (). Necesita


pasar básicamente 3 características de parámetros, destino y tamaño de
test_set. Además, puede usar random_state para seleccionar registros al azar.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(

text_tf, data['Sentiment'], test_size=0.3, random_state=123)


Construcción y evaluación de modelos (TF-IDF)

Construyamos el Modelo de Clasificación de Texto usando TF-IDF.

Primero, importe el módulo MultinomialNB y cree el objeto clasificador Multinomial


Naive Bayes usando la función MultinomialNB ().

Luego, ajuste su modelo en un conjunto de trenes utilizando fit () y realice una


predicción en el conjunto de pruebas utilizando predict ().

from sklearn.naive_bayes import MultinomialNB

from sklearn import metrics


# Model Generation Using Multinomial Naive Bayes

clf = MultinomialNB().fit(X_train, y_train)

predicted= clf.predict(X_test)

print("MultinomialNB Accuracy:",metrics.accuracy_score(y_test, predicted))

MultinomialNB Accuracy: 0.586526549618

Bueno, obtuvo una tasa de clasificación del 58.65% usando las funciones TF-IDF,
lo que no se considera una buena precisión. Necesitamos mejorar la precisión
usando algún otro preprocesamiento o ingeniería de características. Vamos a
sugerir en el cuadro de comentarios algún enfoque para mejorar la precisión.

Conclusión

Se llegó a aprender que es Text Analytics, NLP y minería de texto, conceptos


básicos de las operaciones de análisis de texto que utilizan NLTK, como
Tokenización, Normalización, Armonización, Lemmatización y etiquetado POS.

Você também pode gostar