Este artículo fue publicado como parte del Blogatón de ciencia de datos.
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
- Partes del etiquetado del habla
- Nombre Entidad Reconocimiento
- 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
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
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 fichasent.label_
→ nombre de la entidadent.text
→ nombre del token
Todo el texto debe convertirse en un documento espacial pasándolo a la canalización.
- 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)
Como puede ver, nuestros datos sin procesar no se limpian, necesitamos realizar algunas operaciones de limpieza de datos.
df.Objetivo.value_counts()
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).
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))
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)
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
- Modelado de temas
- Text to Speech
- 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.
Relacionado:
- Coinsmart. El mejor intercambio de Bitcoin y criptografía de Europa.
- Platoblockchain. Inteligencia del Metaverso Web3. Conocimiento amplificado. ACCESO LIBRE.
- CriptoHawk. Radar de altcoins. Prueba gratis.
- Fuente: https://www.analyticsvidhya.com/blog/2022/01/text-classification-entity-recognition-amp-in-nlp/