Alternativas a TF-IDF y Cosine Similarity al comparar documentos de diferentes formatos


12

He estado trabajando en un proyecto pequeño y personal que toma las habilidades laborales de un usuario y sugiere la carrera más ideal para ellos en función de esas habilidades. Utilizo una base de datos de listados de trabajo para lograr esto. Por el momento, el código funciona de la siguiente manera:

1) Procese el texto de cada listado de trabajo para extraer las habilidades que se mencionan en el listado

2) Para cada carrera (por ejemplo, "Analista de datos"), combine el texto procesado de los listados de trabajo para esa carrera en un documento

3) Calcular el TF-IDF de cada habilidad dentro de los documentos de carrera

Después de esto, no estoy seguro de qué método debo usar para clasificar las carreras en función de una lista de habilidades de un usuario. El método más popular que he visto sería tratar las habilidades del usuario como un documento también, luego calcular el TF-IDF para el documento de habilidad y usar algo como la similitud del coseno para calcular la similitud entre el documento de habilidad y cada uno documento de carrera.

Esto no me parece la solución ideal, ya que la similitud de coseno se usa mejor cuando se comparan dos documentos del mismo formato. Para el caso, TF-IDF no parece la métrica adecuada para aplicar a la lista de habilidades del usuario. Por ejemplo, si un usuario agrega habilidades adicionales a su lista, el TF para cada habilidad disminuirá. En realidad, no me importa cuál es la frecuencia de las habilidades en la lista de habilidades del usuario, solo me importa que tengan esas habilidades (y tal vez qué tan bien las conocen).

Parece que una mejor métrica sería hacer lo siguiente:

1) Para cada habilidad que tenga el usuario, calcule el TF-IDF de esa habilidad en los documentos de carrera

2) Para cada carrera, sume los resultados de TF-IDF para todas las habilidades del usuario

3) Rango de carrera basado en la suma anterior

¿Estoy pensando en la línea correcta aquí? Si es así, ¿hay algún algoritmo que funcione en este sentido, pero que sea más sofisticado que una simple suma? ¡Gracias por la ayuda!


3
Echa un vistazo a Doc2vec, Gensim tiene la implementación
Blue482

Respuestas:


1

Tal vez podría usar incrustaciones de palabras para representar mejor la distancia entre ciertas habilidades. Por ejemplo, "Python" y "R" deberían estar más juntos que "Python" y "Gestión del tiempo" ya que ambos son lenguajes de programación.

La idea es que las palabras que aparecen en el mismo contexto deberían estar más cerca.

Una vez que tenga estas incrustaciones, tendrá un conjunto de habilidades para el candidato y un conjunto de habilidades de varios tamaños para los trabajos. A continuación, puede utilizar la Distancia del motor de la Tierra para calcular la distancia entre los conjuntos. Esta medida de distancia es bastante lenta (tiempo cuadrático), por lo que podría no escalar bien si tiene que realizar muchos trabajos.

Para tratar el problema de la escalabilidad, quizás podría clasificar los trabajos según la cantidad de habilidades que el candidato tiene en común en primer lugar, y favorecer estos trabajos.


1

Un método común y simple para hacer coincidir los "documentos" es utilizar la ponderación TF-IDF, como usted ha descrito. Sin embargo, según entiendo su pregunta, desea clasificar cada carrera (documento) en función de un conjunto de habilidades de los usuarios.

Si crea un "vector de consulta" a partir de las habilidades, puede multiplicar el vector con su matriz de términos y carreras (con todos los pesos de tf-idf como valores). El vector resultante le daría un puntaje de clasificación por documento de carrera que puede usar para elegir las mejores carreras para el conjunto de "habilidades de consulta".

q¯1×|terms|M|terms|×|documents|v¯M1×|documents|

Este método de clasificación es una de las más simples y existen muchas variaciones. La entrada TF-IDF en Wikipedia también describe brevemente este método de clasificación. También encontré estas preguntas y respuestas en SO sobre documentos coincidentes.


Sorprendentemente, un promedio simple de incrustaciones de palabras es a menudo tan bueno como un promedio ponderado de incrustaciones hechas con pesos Tf-Idf.
wacax


0

Puedes intentar usar "gensim". Hice un proyecto similar con datos no estructurados. Gensim dio mejores puntajes que el TFIDF estándar. También corrió más rápido.

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.