Saltar al contenido

Procesamiento de Lenguaje Natural – Aprendizaje automático con datos de texto

A continuación, los pasos que seguiremos en esta guía.

Paso 1 – Cargando las bibliotecas y módulos necesarios.

Procesamiento de Lenguaje Natural – Aprendizaje automático con datos de texto
Procesamiento de Lenguaje Natural – Aprendizaje automático con datos de texto

Paso 2 – Cargar los datos y realizar comprobaciones de datos básicos.

Paso 3 – Preprocesar el texto en bruto y prepararlo para el aprendizaje de la máquina.

Paso 4 – Creación de los conjuntos de datos de entrenamiento y prueba.

Paso 5 – Convertir el texto en vectores de frecuencia de palabras con TfidfVectorizer.

Paso 6 – Crear y ajustar el clasificador.

Paso 7 – Computar las métricas de evaluación.

Las siguientes secciones cubrirán estos pasos.

Paso 1 – Carga de las bibliotecas y módulos requeridos

123456789# Importar librerías necesariasimportar pandas como pdimport matplotlib.pyplot como pltdesde sklearn.model_selection importar train_test_split, cross_val_scoref desde sklearn.utils importar shuffle%matplotlib inlineimport warningswarnings.filterwarnings($0027ignore$0027)

pitón

Paso 2 – Cargar los datos y realizar las comprobaciones de los datos básicos

La primera línea de código se lee en los datos como marco de datos de pandas, mientras que la segunda línea imprime la forma – 1.748 observaciones de 4 variables. La tercera línea imprime las primeras cinco observaciones.

123df = pd.read_csv($0027nlpdata2.csv$0027)print(df.shape)df.head()

pitón

Salida:

(1748, 4)

titleabstracttrialclass0Tetracosactrin vs. metilprednisolone en la p…0,5 mg de tetracosactrin se considera equi…0No1Quimioterapia de combinación cíclica para metástasis…104 pacientes no aleatorios que sufren de meta…1Sí2Morbilidad reducida de metástasis esqueléticas en . ..131 pacientes con metástasis osteolíticas de b…0No3Comparación de quimioterapia a corto plazo y continua…132 pacientes con metástasis mamarias recurrentes avanzadas ca…1Sí4Un estudio cruzado aleatorio de fase III de tam…139 mujeres peri y postmenopáusicas con metástasis avanzadas…1Sí

Después de cargar los datos, haremos una exploración básica de los datos. Comprobaremos la distribución de la clase de objetivo que se puede hacer mediante un gráfico de barras. La primera línea de código a continuación agrupa las variables de la $0027clase$0027 contando el número de sus ocurrencias. La segunda línea muestra el diagrama de barras.

Es evidente que tenemos más ocurrencias de «No» que de «Sí» en la variable objetivo. Aún así, lo bueno es que la diferencia no es significativa y los datos están relativamente equilibrados.

La precisión de la línea de base se calcula en la tercera línea de código , que resulta ser del 56%. Se calcula como el número de veces que la clase mayoritaria (es decir, «No») aparece en la variable objetivo, dividido por el número total de observaciones.

La precisión de la línea de base es importante, pero a menudo se ignora en el aprendizaje de la máquina. Establece el punto de referencia en términos de la precisión mínima que el modelo debe alcanzar.

123df.groupby($0027class$0027).abstract.count().plot.bar(ylim=0)plt.show()print(971/1748)#Exactitud de la línea base

pitón

Salida:

Salida:

0.5554919908466819 #Exactitud de la línea base

Paso 3 – Preprocesar el texto crudo y prepararlo para el aprendizaje automático

Ahora, estamos listos para construir nuestro clasificador de texto. Sin embargo, aquí es donde las cosas comienzan a ponerse más difíciles en PNL. Los datos que tenemos están en texto crudo que por sí mismo, no puede ser usado como características. Por lo tanto, tendremos que pre-procesar el texto.

Los pasos comunes de pre-procesamiento son:

Eliminar la puntuación – la regla general es eliminar todo lo que no esté en la forma x,y,z.

Eliminar las palabras de parada – son palabras poco útiles como «el», «es», «en». No son útiles porque la frecuencia de tales palabras clave es alta en el corpus, pero no ayudan a diferenciar las clases de objetivos. La eliminación de las palabras clave también reduce el tamaño de los datos.

Conversión a minúsculas – palabras como «clínico» y «clínico» deben ser consideradas como una sola palabra. Por lo tanto, estas se convierten en minúsculas.

Stemming – el objetivo de «stemming» es reducir el número de formas inflexionales de palabras que aparecen en el texto. Esto hace que palabras como «argumentar», «argumentar», «argumentar», «argumenta» se reduzcan a su raíz común «argumentar». Esto ayuda a disminuir el tamaño del espacio de vocabulario. Hay muchas maneras de realizar Stemming, la más popular es el método «Porter Stemmer» de Martin Porter.

Para completar los pasos mencionados anteriormente, tendremos que cargar el paquete nltk, lo cual se hace en la primera línea de código a continuación. La segunda línea descarga la lista de $0027palabras clave$0027 del paquete nltk.

12import nltknltk.download($0027palabras clave$0027)

pitón

Salida:

nltk_data Descargando las palabras clave del paquete a /home/boss/nltk_data…nltk_data Descomprimiendo corpora/stopwords.zip.True

Con el paquete nltk cargado y listo para usar, realizaremos las tareas de pre-procesamiento. Las dos primeras líneas de código de abajo importan las palabras clave y los módulos PorterStemmer, respectivamente.

La tercera línea importa la biblioteca de expresiones regulares, $0027re$0027, que es un poderoso paquete pitón para el análisis de texto. Para aprender más sobre el análisis sintáctico de textos y la biblioteca $0027re$0027, por favor consulte la guía$0027Natural Language Processing – Text Parsing$0027(/guides/text-parsing).

La cuarta a sexta línea de código hace el preprocesamiento del texto que se ha discutido anteriormente.

12345678desde nltk.corpus importar palabras de paradadesde nltk.stem importar PorterStemmerimport restemmer = PorterStemmer()words = palabras de parada. words("spanish")df[$0027processedtext$0027]= df[$0027abstract$0027].apply(lambda x:" ".join([stemmer.stem(i)for i in re.sub("[^a-zA-Z]"," ", x).split()if i notin words]).lower())

pitón

Ahora veremos el conjunto de datos preprocesados que tiene una nueva columna «texto procesado».

12print(df.shape)df.head(10)

pitón

Salida:

(1748, 5)

titleabstracttrialclassprocessedtext0Tetracosactrin vs. metilprednisolona en el p…0,5 mg tetracosactrin se considera equi…0Nomg tetracosactrin considera equivalente mg metilpred… 1Quimioterapia de combinación cíclica para metástasis…104 pacientes no aleatorios que sufren de met…1Los pacientes no aleatorios sufren de metástasis en …2Morbilidad reducida de metástasis esqueléticas en … 131 pacientes con metástasis osteolíticas de cáncer de mama b…0Metástasis osteolíticas no aleatorias…3Comparación de quimioterapia a corto plazo y continua…132 pacientes con cáncer de mama recurrente avanzado ca…1La paciente con cáncer de mama recurrente avanzado trata cuatro…4Un estudio cruzado aleatorio de fase III de tam…139 mujeres peri y posmenopáusicas con cáncer de mama recurrente avanzado…1Las mujeres posmenopáusicas con cáncer de mama recurrente avanzado c. …517ss-Hidroxiesteroides deshidrogenasa tipo 1 como pr…17ss-Hidroxiesteroides deshidrogenasas (17HSDs) ar…0Hidroxiesteroides deshidrogenas hsd involv loca…6Vindesina-mitoxantrona (VM) versus vindesina-4. …182 pacientes con cáncer de mama metastásico fueron…1Sí-paciente con cáncer de mama metastásico aleatorio v mg v m…7Estudio de fase I de la L-asparaginasa (NSC 109229).22 pacientes recibieron una infusión intravenosa de L-a. …0Nopatiente recibe infusión intravenosa de espárragos l…8Quimioterapia adyuvante en el tratamiento de brea…248 pacientes con tratamiento radical local ea…1Hospitalizado con tratamiento radical local para cáncer de mama earli…9El enfriamiento del cuero cabelludo no tiene cabida en la prevención o…35 pacientes fueron estudiados para determinar el e…0Estudio del paciente para determinar el efecto de la hipotermia del cuero cabelludo…

Paso 4 – Creación de los conjuntos de datos de entrenamiento y prueba

La primera línea de código que figura a continuación importa el módulo para crear conjuntos de datos de capacitación y pruebas. La segunda línea crea una matriz de la variable objetivo, llamada $0027objetivo$0027.

La tercera línea crea los arreglos de entrenamiento (X_tren, y_tren) y el conjunto de pruebas (X-test, y_test). Guarda el 30% de los datos para probar el modelo. El argumento $0027random_state$0027 asegura que los resultados sean reproducibles.

La cuarta línea imprime la forma del conjunto de datos de la generalidad, del entrenamiento y de la prueba, respectivamente.

1234567de sklearn.model_selection importar train_test_splittarget = df[$0027class$0027]X_train, X_test, y_train, y_test = train_test_split(df[$0027processedtext$0027], target, test_size=0.30, random_state=100)print(df.shape);print(X_train.shape);print(X_test.shape)

pitón

Salida:

(1748, 5)(1223,)(525,)

Paso 5 – Convertir el texto en vectores de frecuencia de palabras con TfidfVectorizer.

Hemos procesado el texto, pero necesitamos convertirlo en vectores de frecuencia de palabras para construir modelos de aprendizaje de máquinas. Hay varias maneras de hacerlo, como el uso de CountVectorizer y HashingVectorizer, pero el TfidfVectorizer es la más popular.

TF-IDF es un acrónimo que significa «Término de Frecuencia- Frecuencia de Documento Inversa». Se utiliza como factor de ponderación en aplicaciones de minería de textos.

Frecuencia de término (TF): Esto resume la Frecuencia de Término normalizada dentro de un documento.

Frecuencia inversa de documentos (IDF): Esto reduce el peso de los términos que aparecen mucho en los documentos. En términos sencillos, la FID trata de destacar las palabras importantes que son frecuentes en un documento pero no en todos los documentos. Trabajaremos en la creación de vectores TF-IDF para nuestros documentos.

La primera línea de código a continuación importa el TfidfVectorizer del módulo $0027sklearn.feature_extraction.text$0027. La segunda línea inicializa el objeto TfidfVectorizer, llamado $0027vectorizer_tfidf$0027.

La tercera línea encaja y transforma los datos de entrenamiento. La cuarta línea de código transforma los datos de la prueba, mientras que la quinta línea imprime las 10 primeras características.

123456789desde sklearn.feature_extraction.text import TfidfVectorizervectorizer_tfidf = TfidfVectorizer(stop_words=$0027english$0027, max_df=0.7)train_tfIdf = vectorizer_tfidf. fit_transform(X_train.values.astype($0027U$0027))test_tfIdf = vectorizer_tfidf.transform(X_test.values.astype($0027U$0027))print(vectorizer_tfidf.get_feature_names()[:10])

pitón

Salida:

aa$0027, $0027aacr$0027, $0027aag$0027, $0027aastrom$0027, $0027ab$0027, $0027abandonar$0027, $0027abc$0027, $0027abcb$0027, $0027abcsg$0027, $0027abdomen$0027

Veamos la forma del tren transformado TF-IDF y los conjuntos de datos de prueba. La siguiente línea de código realiza esta tarea.

1print(train_tfIdf.shape);print(test_tfIdf.shape)

pitón

Salida:

(1223, 5602)(525, 5602)

Paso 6 – Crear y ajustar el clasificador.

Ahora, construiremos el modelo de clasificación de textos. El algoritmo que elegiremos es el Clasificador Bayes Ingenuo, que se utiliza comúnmente para los problemas de clasificación de texto, ya que se basa en la probabilidad. Es simple y efectivo para responder a preguntas como «Dado un término particular en el documento, ¿cuál es la probabilidad de que pertenezca a la clase particular?».

Comenzamos importando los módulos necesarios que se hace en las primeras dos líneas de código a continuación. La tercera línea crea un clasificador Bayes Multinomial Ingenuo, llamado $0027nb_clasificador$0027. La cuarta línea de código encaja el clasificador en los datos de entrenamiento.

Finalmente, nuestro modelo está entrenado y está listo para generar predicciones sobre los datos no vistos. Esto se realiza en la quinta línea de código , mientras que la sexta línea imprime la clase predicha para los primeros 10 registros en los datos de la prueba.

123456789de sklearn.naive_bayes import MultinomialNBde sklearn import metricsnb_classifier = MultinomialNB()nb_classifier.fit(train_tfIdf, y_train)pred2 = nb_classifier.predict(test_tfIdf)print(pred2[:10])

pitón

Salida:

No$0027 $0027Sí$0027 $0027Sí$0027 $0027No$0027 $0027No$0027 $0027Sí$0027 $0027No$0027 $0027No$0027 $0027No$0027 $0027Sí$0027

Paso 7 – Computar las métricas de evaluación

Ahora estamos listos para evaluar el rendimiento de nuestro modelo con los datos de las pruebas. Usando la función $0027metrics.accuracy_score$0027, calculamos la precisión en la primera línea de código abajo e imprimimos el resultado usando la segunda línea de código . Vemos que la precisión es del 86,5%, lo que es una buena puntuación.

También podemos calcular la precisión a través de métricas de confusión. La tercera línea de código que se muestra a continuación crea las métricas de confusión, en las que se utiliza el argumento «labels» para especificar las etiquetas de la clase objetivo («Sí» o «No» en nuestro caso). La cuarta línea imprime las métricas de confusión.

123456# Calcular la puntuación de precisión: scoreaccuracy_tfidf = metrics.accuracy_score(y_test, pred2)print(accuracy_tfidf)Conf_metrics_tfidf = metrics.confusion_matrix(y_test, pred2, labels=[$0027Yes$0027,$0027No$0027])print(Conf_metrics_tfidf)

pitón

Salida:

0,8647619047619047

[211 28]

Usando los resultados de la diagonal principal de la matriz de confusión como las etiquetas verdaderas, podemos calcular la precisión, que es del 86,5%.

1(211+243)/(239+286)

pitón

Salida:

0,8647619047619047