¿Qué algoritmos debo usar para realizar una clasificación de trabajo basada en los datos del currículum?


28

Tenga en cuenta que estoy haciendo todo en R.

El problema es el siguiente:

Básicamente, tengo una lista de currículums (CV). Algunos candidatos tendrán experiencia laboral antes y otros no. El objetivo aquí es: en función del texto en sus CV, quiero clasificarlos en diferentes sectores de trabajo. Soy particular en esos casos, en los que los candidatos no tienen ninguna experiencia / es estudiante, y quiero hacer una predicción para clasificar a qué sectores laborales pertenecerá este candidato después de la graduación.

Pregunta 1: Conozco algoritmos de aprendizaje automático. Sin embargo, nunca antes había hecho PNL. Me encontré con la asignación de Dirichlet Latente en Internet. Sin embargo, no estoy seguro de si este es el mejor enfoque para abordar mi problema.

Mi idea original: hacer de esto un problema de aprendizaje supervisado . Supongamos que ya tenemos una gran cantidad de datos etiquetados, lo que significa que hemos etiquetado correctamente los sectores de trabajo para una lista de candidatos. Entrenamos el modelo utilizando algoritmos ML (es decir, el vecino más cercano ...) y alimentamos esos datos no etiquetados , que son candidatos que no tienen experiencia laboral / son estudiantes, y tratamos de predecir a qué sector laboral pertenecerán.

Pregunta de actualización 2: ¿Sería una buena idea crear un archivo de texto extrayendo todo en un currículum e imprimiendo estos datos en el archivo de texto, de modo que cada currículum esté asociado con un archivo de texto, que contiene cadenas no estructuradas, y luego ¿aplica técnicas de minería de texto a los archivos de texto y hace que los datos se vuelvan estructurados o incluso crear una matriz de frecuencia de términos utilizados en los archivos de texto? Por ejemplo, el archivo de texto puede verse así:

I deployed ML algorithm in this project and... Skills: Java, Python, c++ ...

Esto es lo que quise decir con 'no estructurado', es decir, contraer todo en una sola cadena de línea.

¿Es este enfoque incorrecto? Corrígeme si crees que mi enfoque es incorrecto.

Pregunta 3: La parte difícil es: ¿cómo identificar y extraer las palabras clave ? ¿Usando el tmpaquete en R? ¿En qué algoritmo se tm basa el paquete? ¿Debo usar algoritmos de PNL? En caso afirmativo, ¿qué algoritmos debería mirar? Por favor, muéstrame algunos buenos recursos para ver también.

Cualquier idea sería genial.

Respuestas:


14

Mira este enlace.

Aquí, lo llevarán a cargar texto no estructurado para crear una nube de palabras. Puede adaptar esta estrategia y, en lugar de crear una nube de palabras, puede crear una matriz de frecuencia de términos utilizados. La idea es tomar el texto no estructurado y estructurarlo de alguna manera. Cambia todo a minúsculas (o mayúsculas), elimina palabras de detención y encuentra términos frecuentes para cada función de trabajo, a través de Matrices de Término de Documentos. También tienes la opción de detener las palabras. Si lees palabras, podrás detectar diferentes formas de palabras como la misma palabra. Por ejemplo, 'programado' y 'programación' podrían derivarse de 'programa'. Posiblemente puede agregar la aparición de estos términos frecuentes como una función ponderada en su entrenamiento de modelo ML.

También puede adaptar esto a frases frecuentes, encontrando grupos comunes de 2-3 palabras para cada función de trabajo.

Ejemplo:

1) Cargue bibliotecas y cree los datos de ejemplo

library(tm)
library(SnowballC)

doc1 = "I am highly skilled in Java Programming.  I have spent 5 years developing bug-tracking systems and creating data managing system applications in C."
job1 = "Software Engineer"
doc2 = "Tested new software releases for major program enhancements.  Designed and executed test procedures and worked with relational databases.  I helped organize and lead meetings and work independently and in a group setting."
job2 = "Quality Assurance"
doc3 = "Developed large and complex web applications for client service center. Lead projects for upcoming releases and interact with consumers.  Perform database design and debugging of current releases."
job3 = "Software Engineer"
jobInfo = data.frame("text" = c(doc1,doc2,doc3),
                     "job" = c(job1,job2,job3))

2) Ahora hacemos algo de estructuración de texto. Estoy seguro de que hay formas más rápidas / cortas de hacer lo siguiente.

# Convert to lowercase
jobInfo$text = sapply(jobInfo$text,tolower)

# Remove Punctuation
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[[:punct:]]"," ",x))

# Remove extra white space
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[ ]+"," ",x))

# Remove stop words
jobInfo$text = sapply(jobInfo$text, function(x){
  paste(setdiff(strsplit(x," ")[[1]],stopwords()),collapse=" ")
})

# Stem words (Also try without stemming?)
jobInfo$text = sapply(jobInfo$text, function(x)  {
  paste(setdiff(wordStem(strsplit(x," ")[[1]]),""),collapse=" ")
})

3) Hacer una fuente de corpus y una matriz de términos del documento.

# Create Corpus Source
jobCorpus = Corpus(VectorSource(jobInfo$text))

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

# Create Term Frequency Matrix
jobFreq = as.matrix(jobDTM)

Ahora tenemos la matriz de frecuencia, jobFreq, que es una matriz (3 por x), 3 entradas y X número de palabras.

Donde vayas de aquí depende de ti. Puede conservar solo palabras específicas (más comunes) y utilizarlas como características en su modelo. Otra forma es hacerlo simple y tener un porcentaje de palabras utilizadas en cada descripción del trabajo, digamos que "java" tendría un 80% de aparición en 'ingeniero de software' y solo un 50% en 'garantía de calidad'.

Ahora es el momento de buscar por qué 'aseguramiento' tiene 1 'r' y 'ocurrencia' tiene 2 'r'.


Me encantaría ver tu ejemplo.
user1769197

Actualizado con un ejemplo rápido.
nfmcclure

11

Simplemente extraiga palabras clave y entrene a un clasificador en ellas. Eso es todo, de verdad.

La mayor parte del texto en los CV no está realmente relacionado con las habilidades. Por ejemplo, considere la oración "Tengo experiencia y soy muy eficiente en Java". Aquí solo 1 de cada 7 palabras es un nombre de habilidad, el resto es solo un ruido que reducirá la precisión de su clasificación.

La mayoría de los CV no están realmente estructurados. O estructurado demasiado libremente. O use nombres inusuales para las secciones. O formatos de archivo que no conservan la estructura cuando se traducen a texto. Tengo experiencia extrayendo fechas, horas, nombres, direcciones e incluso intenciones de personas a partir de texto no estructurado, pero no una lista de habilidades (o universidad ni nada), ni siquiera de cerca.

Así que solo tokenice (y posiblemente elimine ) sus CV, seleccione solo palabras de la lista predefinida (puede usar LinkedIn o algo similar para obtener esta lista), cree un vector de características y pruebe un par de clasificadores (por ejemplo, SVM y Naive Bayes) .

(Nota: utilicé un enfoque similar para clasificar los perfiles de LinkedIn en más de 50 clases con una precisión> 90%, por lo que estoy seguro de que incluso la implementación ingenua funcionará bien).


Digamos que estoy analizando los datos de linkedin, ¿crees que sería una buena idea combinar la experiencia laboral previa, las recomendaciones de educación y las habilidades de un perfil en un archivo de texto y extraer palabras clave de él?
user1769197

LinkedIn ahora tiene etiquetas de habilidades que las personas se asignan a sí mismas y otros usuarios pueden respaldar, por lo que básicamente no hay necesidad de extraer palabras clave manualmente. Pero en el caso de datos menos estructurados, sí, puede ser útil fusionar todo y luego recuperar palabras clave. Sin embargo, recuerde la regla principal: pruébelo . La teoría es buena, pero solo los experimentos prácticos con diferentes enfoques revelarán el mejor.
amigo

@ffriend, ¿cómo obtenemos esa lista de palabras clave?
NG_21

1
@ffriend ¿Cuál es la mejor manera de extraer "experiencia" = '5 años', "Lenguaje" = 'C' de la siguiente oración. "He pasado 5 años desarrollando sistemas de seguimiento de errores y creando aplicaciones de sistema de gestión de datos en C". Utilicé Rake con NLTK y simplemente eliminó la palabra clave + puntuación, pero de la oración anterior no necesito palabras como desarrollo, seguimiento de errores, sistemas, creación, datos, etc. Gracias
Khalid Usman

3
@KhalidUsman: como ya trabaja con NLTL, eche un vistazo a las herramientas de reconocimiento de entidades con nombre , especialmente la sección "Agrupación con expresiones regulares". En general, desearía utilizar un diccionario de palabras clave (por ejemplo, "años", "C", etc.) y un conjunto simple de reglas (como "contiene 'C'" o "<número> años") para extraer entidades con nombre fuera de un texto de forma libre.
amigo

7

Este es un problema complicado. Hay muchas formas de manejarlo. Supongo que los currículums se pueden tratar como documentos semiestructurados. A veces, es beneficioso tener una estructura mínima en los documentos. Creo que en los currículums verías algunos datos tabulares. Es posible que desee tratarlos como pares de valores de atributos. Por ejemplo, obtendría una lista de términos para el atributo "Conjunto de habilidades".

La idea clave es configurar manualmente una lista de frases clave como "habilidad", "educación", "publicación", etc. El siguiente paso es extraer los términos que pertenecen a estas frases clave ya sea explotando la estructura de alguna manera (como como tablas) o al utilizar la proximidad de los términos en torno a estas frases clave, por ejemplo, el hecho de que la palabra "Java" está muy cerca del término "habilidad" podría indicar que la persona es experta en Java.

Después de extraer esta información, el siguiente paso podría ser crear un vector de características para cada una de estas frases clave. Luego puede representar un documento como un vector con diferentes campos (uno para cada frase clave). Por ejemplo, considere los siguientes dos currículums representados con dos campos, a saber, proyecto y educación .

Doc1: {proyecto: (java, 3) (c, 4)}, {educación: (computadora, 2), (física, 1)}

Doc2: {proyecto: (java, 3) (python, 2)}, {educación: (matemáticas, 3), (computadora, 2)}

En el ejemplo anterior, muestro un término con la frecuencia. Por supuesto, mientras extrae los términos, debe detener y eliminar las palabras vacías. A partir de los ejemplos, queda claro que la persona cuyo currículum es Doc1 tiene más habilidades en C que la de D2. En cuanto a la implementación, es muy fácil representar documentos como vectores de campo en Lucene.

Ahora, el siguiente paso es recuperar una lista clasificada de currículums dada una especificación de trabajo. De hecho, eso es bastante sencillo si también representa consultas (especificaciones de trabajo) como vectores de campo. Solo necesita recuperar una lista clasificada de candidatos (currículums) usando Lucene de una colección de currículums indexados.


Algoritmo sabio: ¿qué recomendarías?
user1769197

¿te refieres a algoritmo para calcular los vectores de currículum vitae más similares dado un vector de trabajo de consulta? puede usar cualquier algoritmo estándar como BM25 o Language Model ...
Debasis

Nunca he oído hablar de estos algoritmos en absoluto. ¿Son estos algoritmos de PNL o algo de ML?
user1769197

estos son modelos de recuperación estándar ... un modelo de recuperación define cómo calcular la similitud entre un documento (currículum en su caso) y una consulta (trabajo en su caso).
Debasis

No tengo conocimiento sobre la recuperación de información, ¿crees que los algoritmos de aprendizaje automático como la agrupación / vecino más cercano también funcionarán en mi caso?
user1769197

7

Trabajo para un sitio de empleos en línea y creamos soluciones para recomendar trabajos basados ​​en currículums. Nuestro enfoque toma el título de trabajo de una persona (o el título de trabajo deseado si es un estudiante y es conocido), junto con las habilidades que extraemos de su currículum y su ubicación (que es muy importante para la mayoría de las personas) y encuentra coincidencias con trabajos basados ​​en eso.

En términos de clasificación de documentos, tomaría un enfoque similar. Recomendaría calcular una matriz tf idf para cada currículum como un modelo estándar de bolsa de palabras, extrayendo solo el título del trabajo y las habilidades de la persona (para lo cual tendrá que definir una lista de habilidades para buscar), e ingresar eso en un ML algoritmo. Recomendaría probar knn, y un SVM, este último funciona muy bien con datos de texto de alta dimensión. Los SVM lineales tienden a funcionar mejor que los no lineales (por ejemplo, usando núcleos RBf). Si tiene resultados razonables, jugaría con funciones de extracción utilizando un analizador de lenguaje natural \ chunker, y también algunas frases personalizadas combinadas con expresiones regulares.


¿Sigues usando SVM cuando tienes 3 o más clases? ¿Y qué características desea extraer utilizando un analizador de lenguaje natural? Con qué propósito ?
user1769197

Puedes entrenar n svm para n clases usando una estrategia de uno contra el resto. SciKitLearn tiene código para hacerlo automáticamente. Técnicamente necesitas clasificadores n-1, pero he descubierto que tener n funciona mejor.
Simon

@ Simon ¿Puedes escribir los pasos completos para este sistema de recomendación? Tengo poca experiencia (implementar tesis de maestría) en ML, pero totalmente nueva en el campo de IR. Ahora estoy trabajando en este sistema y escribí los siguientes pasos. 1. Use NLTK para extraer palabras clave, 2. Calcule la puntuación para palabras clave y frases, 3. Stemmer, 4. Categorización (la tarea más difícil) y 5. Matriz de frecuencia, tf-idf o algo BM25. ¿Estoy en el camino correcto de implementación? Gracias
Khalid Usman

@KhalidUsman No puedo decirte exactamente cómo funciona, eso puede meterme en problemas. La solución más fácil sería poner los datos en Solr o Elastic Search y usar sus implementaciones de recomendación MLT. Un enfoque más sofisticado es extraer palabras y frases clave, pasar los documentos a través de LSA y hacer k-nn en los vectores resultantes. Entonces es posible que desee utilizar otras señales como el filtrado colaborativo y la popularidad general.
Simon

@ Simon, gracias por tu orientación. Estoy aplicando la segunda forma, he extraído palabras clave / frases clave usando RAKE + NLTK y después de eso estaba planeando aplicar tf-idf o BM25. Estoy en lo cierto? ¿Pueden explicar un poco la forma KNN, es decir, cómo aplicar knn en las palabras clave, ¿debo crear palabras clave como características? Gracias
Khalid Usman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.