Mostrando entradas con la etiqueta Text Mining. Mostrar todas las entradas
Mostrando entradas con la etiqueta Text Mining. Mostrar todas las entradas

miércoles, 21 de noviembre de 2018

Identificar genero de un nombre


El siguiente script identifica el genero de un nombre dado, utilizando una lista de nombres+genero. Los valores que devuelve son: {m, f, a}, correspondientes a masculino, femenino o ambiguo.

La lista contiene más de 46mil nombres + genero, unificados de las siguientes fuentes:
  • Lista de nombres de la librería nltk
  • Lista nombres de la librería gender_guesser
  • Lista de nombres argentinos publicados aqui

También se hicieron otras modificaciones para nombres hispanos, como borrar apellidos, agregar diminutivos, nombres cortos, alias, entre otros.

R script:
libs<-c('tm','stringi')
lapply(libs,require, character.only= TRUE)

# FUNCIONES ------------------------------
clean_txt <- function(txt){
   txt <- stri_trim(gsub('[[:punct:][:digit:] ]+',' ',tolower(txt)))
    return(strsplit(txt, " ")[[1]])
}

get_gender2 <- function(nombre, lista_nombres="") {
  nombre <- clean_txt(nombre)
  nombre <- subset(nombre, nombre %in% lista_nombres)
  mylist <- list()
  mylist[c("f", "m","a")] <- 0
  for (i in 1:length(nombre)){
    g <- as.character(df[which(df$nombre == nombre[i]),"genero"])
    g <- ifelse(identical(g, character(0)), 'a', g)
    if(i==1){
    mylist[[g]] <- mylist[[g]] + 2
    } else{
    mylist[[g]] <- mylist[[g]] + 1
    }
  g2 = sapply(mylist, function(x) x[which.max(abs(x))])
  return(names(g2[g2==max(g2)])[1])
  }
}

# DATOS ---------------------------------
path <- 'https://www.dropbox.com/s/edm5383iffurv4x/nombres.csv?dl=1'
df <- read.csv(path, sep=",",  colClasses = "character")
get_gender2("jose maria altagracia", df$nombre)

lunes, 12 de febrero de 2018

Estadisticas de un Texto

El siguiente script calcula estadísticos y métricas de palabras en un texto. La mayoría de estas métricas provienen de otras publicaciones (ver Referencia 1 a 5).

Conceptualmente seria así:


DESCRIPCION DE METRICAS
chr_len: Cantidad de palabras únicas
chr_rt: Total de letras / Total caracteres
chr_max: Cantidad de letras de la palabra mas larga
chr_min: Cantidad de letras de la palabra mas corta
chr_avg: Cantidad de letras promedio de las palabras
chr_std: Desviación estándar de cantidad de letras de las palabras
chr_unq_rt: Cantidad palabras únicas / Total de palabras
chr_rep_rt: Cantidad de palabras repetidas/ Total de palabras
chr_upp_rt Cantidad de palabras mayúsculas / Total de palabras
chr_cpt_rt: Cantidad de palabras CapitalCases / Total de palabras
chr_cpt_ini: Tendrá valor 1 si la primera palabra es CapitalCases, sino 0
chr_tkn_qty: Cantidad de letras en el texto
chr_vcl_rt: Total de vocales / Total de letras
chr_pnt_rt: Cantidad de signos puntuación / Total de palabras
chr_1gram_rt: Cantidad de palabras de una letra / Total de palabras
chr_2gram_rt: Cantidad de palabras de dos letra / Total de palabras
chr_3gram_rt: Cantidad de palabras de tres letra / Total de palabras
chr_4gram_rt: Cantidad de palabras de cuatro letra / Total de palabras
chr_Lgram_rt: Cantidad de palabras con mas de ocho letras / Total de palabras

domingo, 6 de noviembre de 2016

Text Mining con Twiter

El siguiente ejemplo utiliza textos de twitter clasificados previamente como POS, NEG o SEM para predecir si un tweet es positivo, negativo o imparcial sobre Amazon. La técnica usada para representar el texto es bag-of-words, donde se mide la aparición de la palabra y no su orden. Estos tweets fueron copiados de la cuenta pública de @amazon.

NOTAS:
Para mismo ejemplo en PYTHON, ver nota publicada AQUI
El excel con las imágenes se puede descargar AQUI
Para este ejemplo se utilizó la libreria tm_0.6-2

El proceso general sigue estos pasos:

1. Cargar Datos
Para este ejemplo, los datos se cargan de un archivo csv en Dropbox, el cual tiene dos columnas: el texto y la clase a predecir. Conceptualmente queda así:












2. Crear Corpus
El corpus es un conjunto de documentos, que pueden ser artículos periodísticos, noticias, currículos, tweets, chat, o cualquier colección de textos que se vaya a utilizar para predecir/clasificar. En este ejemplo se usan tweets, y la columna "texto" del csv será el corpus.

Una forma de crear el corpus en R es usando la libreria tm de la siguiente forma:
- Crear un objeto VectorSource que será el origen de datos que luego se utiliza para crear un corpus volatil o vcorpus
- Crear un objeto VCorpus que es un corpus que se guarda en memoria, con lo cual es volatil. En este objeto se considera cada observación (tweet para este ejemplo) como un documento. El origen de datos para crear un vcorpus siempre será un VectorSource.
Para detalle sobre estos objetos, ver Referencia No.2

Conceptualmente seria así:












3. Limpiar Corpus
Luego que se tiene el VCorpus, se procede "limpiar" el corpus de la siguiente forma:
- Se sustituyen los signos de puntuación por espacios (replacePunctuation)
- Se eliminan los numeros (removeNumbers)
- Se elimina el doble espacio (stripWhitespace)
- Se convierte en minúscula todas las palabras (tolower)
- Se sustituyen algunas palabras abreviadas (stri_replace_all_fixed)
- Se transforma en documento plano (PlainTextDocument). Esto para cuando se usan funciones que no retornan un TextDocuments. Para detalle ver Ref. Nro 3
- Se eliman los sufijos de las palabras usando el algoritmo PorterStemmer (stemDocument). Para detalle ver referencia Nro. 4
- Se eliminan palabras sin significados, como pronombres, preposiciones, etc. usando el stopwords o lista de palabras que trae la libreria tm (removeWords). Para detalle ver referencia Nro. 4

Conceptualmente sería asi: