Logotipo de Zephyrnet

Clasificación de texto y reconocimiento de entidades y en NLP

Fecha:

Este artículo fue publicado como parte del Blogatón de ciencia de datos.

Clasificación de texto
Fuente: medium.com

Bienvenido a la serie de artículos de PNL. hasta ahora hemos cubierto las múltiples técnicas de procesamiento de texto en el primer artículo. En la segunda parte de la serie de artículos de NLP, vimos diferentes tipos de técnicas de extracción de características e incrustación de palabras con códigos Python.

Índice del contenido

  1. Partes del etiquetado del habla
  2. Nombre Entidad Reconocimiento
  3. Clasificación de texto

Introducción

En este artículo, iremos un paso más allá y discutiremos algunos trabajos de PNL muy importantes.

Después de tener una idea sobre las técnicas de extracción de múltiples funciones y la limpieza de texto, es hora de realizar algunos trabajos de NLP. Existe una gran variedad de trabajos que podemos realizar utilizando la PNL. algunos de ellos son parte del etiquetado de voz, extracción de entidades y clasificación de texto.

Parte del etiquetado de voz

El etiquetado de parte del discurso (POS) implicó etiquetar las palabras con su respectiva parte del discurso, es decir. sustantivo, adjetivo, verbo, etc.

Es una parte crucial del procesamiento del lenguaje natural. El reconocimiento de entidad nombrada se basa en estos fenómenos que discutiremos más adelante en este artículo.

El análisis de opinión, la resolución de entidades nombradas, la respuesta a preguntas y la desambiguación del sentido de las palabras se basan en el etiquetado de partes del discurso.

Hay 2 formas de construir un etiquetador POS

  • Basado en reglas: basado en reglas
  • Basado en estocástico: basado en la secuencia de palabras con la ayuda del modelo oculto de Markov

Implementando en Python

hemos dado un documento y tenemos que etiquetar cada palabra con su parte del discurso.

text = “Me encanta la PNL y trato de aprenderla leyendo artículos”

Antes de continuar, filtremos las palabras vacías.

#---importando la biblioteca------ import nltk #-----cargando las palabras vacías--------- de nltk.corpus import stopwords stop_words = set(stopwords.words('english' ))

filtrar todas las palabras vacías

from nltk.tokenize import word_tokenize,sent_tokenize #---Generando los tokens de palabras ------ words = nltk.word_tokenize(text) #-----Filtrar las palabras vacías words = [palabra por palabra en palabras si w no en stop_words] palabras
Clasificación de texto
Fuente: el autor

nltk.pos_tag() toma la palabra en una lista y devuelve la parte del discurso.

POS = [] para palabra en palabras: POS.append(nltk.pos_tag([palabra])) POS
Artículos
Fuente: Author

Aquí la parte del discurso está escrita en su forma abreviada:

  • NNS → Sustantivo Plural ie.Tables
  • NN → Sustantivo Singular ie.Table
  • VBG → Verbo
  • PPR → Pronombre

Basándonos en esta idea, podemos extraer diferentes partes del discurso de un documento, pero si queremos extraer algo muy específico, supongamos que queremos extraer diferentes nombres de países, diferentes nombres de organizaciones de un documento, no podemos hacerlo usando el etiquetador POS, aquí utilizar la idea de reconocimiento de entidad nombrada.

Nombre Entidad Reconocimiento

La extracción de diferentes tipos de entidades de un documento se basa en POS, pero puede identificar una amplia gama de entidades de un documento. Es decir, extraer todos los nombres, nombres de países de un documento.

Hay varias bibliotecas disponibles para realizar la extracción de entidades, es decir, SpaCy, NLTK chunker, StanfordNER, etc.

usaremos ESPACIO ya que es fácil de implementar y da mejores resultados

Implementación con Python

#-----Instalando SpaCy ---- !pip instalar spacy !spacy descargar en_core_web_sm
#---- Cargando Spacy Pipeline Importar spacy nlp = spacy.load('en_core_web_sm')

spacy.load(‘language_model’) devuelve una canalización de idioma.

text = "Samsung está listo para lanzar un nuevo teléfono con un valor de $1000 en Corea del Sur" doc = nlp(text) for ent in doc.ents: print(ent.text, ent.label_)
  • doc.ents → lista de las fichas
  • ent.label_ → nombre de la entidad
  • ent.text → nombre del token

Todo el texto debe convertirse en un documento espacial pasándolo a la canalización.

Reconocimiento de entidad de nombre
Fuente: Author
  • ORG → Organización
  • 1000 → Dinero
  • Corea del Sur → Entidad geopolítica

SpaCy brinda resultados precisos y se puede usar cuando nuestro objetivo es filtrar entidades.

Clasificación de texto

Aquí la idea es clasificar un texto basado en la categoría pre-entrenada. Existe una amplia variedad de aplicaciones basadas en la clasificación de texto.

  • Reanudar preselección
  • Clasificador de spam
  • Clasificación de documentos
  • Análisis de los sentimientos

Es posible que haya visto que hay un directorio para todos los mensajes de spam en su bandeja de entrada de mensajes, un modelo de aprendizaje automático funciona en el backend que clasifica los correos de spam frente a nuestros correos normales.

Construyendo un clasificador de correo no deseado en Python

Necesitamos un conjunto de datos que contenga todos los mensajes de spam y mensajes normales para entrenar un modelo. entrenaremos un clasificador de texto de referencia para comprender el proceso de entrenamiento.

1. Descargue el conjunto de datos de esta página en su directorio de trabajo.

2. Importe las bibliotecas necesarias para cargar el conjunto de datos en un marco de datos de pandas y realice una limpieza de datos.

importar pandas como pd df = pd.read_csv(r'spam.csv',encoding='ISO-8859-1',usecols=['v1','v2']) df.rename(columns = {'v1': 'Objetivo', 'v2':'Correo electrónico'}, en el lugar = Verdadero)
salida | Clasificación de texto
Fuente: Author

Como puede ver, nuestros datos sin procesar no se limpian, necesitamos realizar algunas operaciones de limpieza de datos.

df.Objetivo.value_counts()
El valor cuenta

En el conjunto de datos, la mayoría de las filas son correos normales, solo 747 correos son spam. Nuestro conjunto de datos está desequilibrado. Esto se puede solucionar mediante un muestreo ascendente o descendente, que realizaremos en la siguiente parte.

3. para la limpieza de texto he hecho una biblioteca text-hammer eso hace que nuestra limpieza de texto sea mucho más fácil. instalar y usar esta biblioteca es muy fácil.

!pip instalar text_hammer importar text_hammer como th

Creación de una función para la limpieza de texto 

def text_cleaning(df,col_name): #-----Eliminar palabras vacías---- df[col_name] = df[col_name].progress_apply(lambda x: th.remove_stopwords(x)) #----Quitar carácter especial ---- df[col_name] = df[col_name].progress_apply(lambda x: th.remove_special_chars(x)) #---Eliminar caracteres acentuados--- df[col_name] = df[col_name].progress_apply(lambda x : th.remove_accented_chars(x)) # ---Eliminación de etiquetas HTML y URL--- df[col_name] = df[col_name].progress_apply(lambda x: th.remove_html_tags(x)) df[col_name] = df[col_name ].progress_apply(lambda x: th.remove_urls(x)) #--- Convertir en palabras raíz-- df[col_name] = df[col_name].progress_apply(lambda x: th.make_base(x)) return df

Llamar a la función de limpieza de texto: text_cleaning toma un df y el nombre de la columna que contiene los datos sin procesar.

df = text_cleaning(df, 'Correo electrónico')

Mapeando el spam con 1 y jamón con 0.

df['Objetivo'] = df.Objetivo.map({'ham':0,'spam':1})

Dividir todos los datos para entrenamiento y prueba

Usar train_test_split para dividir el conjunto de datos en propósitos de entrenamiento y prueba.

# dividir los datos para verificar nuestro modelo final 
from sklearn import model_selection X_train,X_test,y_train,y_test = model_selection.train_test_split(df['Email'],df['Target'], stratify = df['Target'], test_size = 0.2, random_state = 42)
  • X_train,y_train son los datos que se utilizarán con fines formativos.
  • X_test,y_test se utilizará con fines de predicción.

Creación de un entrenamiento Tubería

La creación de Pipelines nos permite combinar múltiples pasos en uno solo. El mismo Pipeline se puede usar para entrenamiento y para predicción.

Aquí hemos combinado la extracción de características y el entrenamiento de modelos en un solo paso usando una canalización.

from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import Pipeline vectorizer = TfidfVectorizer() clasificador = Pipeline([('feature_generation', vectorizer), ('model',MultinomialNB())])
  • MultinomialNB Aquí estamos usando el modelo Multinomial Naive Bayes para nuestra tarea de clasificación, los modelos Naive Bayes funcionan bien para clases discretas, LEER MÁS.
  • La tubería contiene 2 funciones en ella. Los datos pasados ​​se convertirán primero en características utilizando el vectorizador TF-IDF y luego las características se pasarán al modelo MultinomialNB.

Entrenamiento de la tubería

clasificador.fit(tren_X,tren_y)

Predicción

Después de entrenar el clasificador, podemos usar la misma canalización para la predicción.

text = ['Oye, Abhishek, ¿podemos reunirnos para ver un partido de fútbol?', 'Entrada gratuita en 2 competencias semanales para ganar la final de la Copa FA'] classifier.predict(text)

La predecir El método ingresa una lista de textos y predice en forma de 0 (normal), 1 (correo no deseado).

Clasificación de texto
Fuente: Author

la primera oración no es correo no deseado, por lo tanto, se predice 0 y la segunda se predice como correo no deseado 1.

Métricas de rendimiento

sklearn proporciona una clase de métricas para ver el rendimiento de nuestro modelo en un conjunto de datos.

classification_report toma true_label y predicted_label como entrada e imprimir un informe.

from sklearn import metrics y_predicted = classifier.predict(X_test) print(metrics.classification_report(y_test,y_predicted))
Clasificación de texto
Fuente: Author

Como puede ver, nuestro modelo puede predecir correos normales con alta confianza, pero la predicción de mensajes de spam se retrasa un poco debido a los datos desequilibrados.

de sklearn.metrics import confusion_matrix resultados = confusion_matrix(y_test, y_predicted) print(resultados)
Salida | métrica
Fuente: Author

Confusion Matrix indica que nuestro modelo clasifica correctamente 177 mensajes de spam, 61 mensajes de spam se clasifican incorrectamente y 1434 mensajes normales se clasifican correctamente.

Evaluación del modelo 

el modelo que acabamos de entrenar usando la canalización de sklearn es un modelo de referencia. definitivamente podemos mejorar los resultados siguiendo los siguientes pasos:

  • Usar Word-Embedding puede darnos mejores resultados
  • Eliminar el desequilibrio de datos
  • Usando un modelo basado en el aprendizaje profundo, es decir. LSTM, BERT, etc.

Nota final

En este artículo, hemos discutido la clasificación de texto que incluye el etiquetado de parte del discurso, la extracción de entidades usando Spacy y construimos un modelo para clasificar los mensajes de spam. el modelo que construimos es solo un modelo de referencia, definitivamente lo mejoramos aún más. la creación de canalizaciones es una buena práctica al entrenar el modelo, ya que combina varios pasos.

En el próximo artículo, hablaremos

  1. Modelado de temas
  2. Text to Speech
  3. Detección y traducción de idiomas

Siéntase libre de escribirme en LinkedIn.

Los medios que se muestran en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor. 

punto_img

Información más reciente

punto_img