J'ai travaillé sur un petit projet personnel qui prend les compétences professionnelles d'un utilisateur et suggère la carrière la plus idéale pour lui en fonction de ces compétences. J'utilise une base de données de listes d'emplois pour y parvenir. Pour le moment, le code fonctionne comme suit:
1) Traitez le texte de chaque offre d'emploi pour extraire les compétences qui y sont mentionnées
2) Pour chaque carrière (par exemple "Data Analyst"), combinez le texte traité des listes d'emplois pour cette carrière dans un seul document
3) Calculez le TF-IDF de chaque compétence dans les documents de carrière
Après cela, je ne sais pas quelle méthode je devrais utiliser pour classer les carrières en fonction d'une liste de compétences d'un utilisateur. La méthode la plus populaire que j'ai vue serait de traiter également les compétences de l'utilisateur comme un document, puis de calculer le TF-IDF pour le document de compétences, et d'utiliser quelque chose comme la similitude en cosinus pour calculer la similitude entre le document de compétences et chaque document de carrière.
Cela ne me semble pas être la solution idéale, car la similitude cosinus est mieux utilisée lors de la comparaison de deux documents du même format. D'ailleurs, TF-IDF ne semble pas du tout la mesure appropriée à appliquer à la liste de compétences de l'utilisateur. Par exemple, si un utilisateur ajoute des compétences supplémentaires à sa liste, le TF de chaque compétence baissera. En réalité, je ne me soucie pas de la fréquence des compétences dans la liste des compétences de l'utilisateur - je me soucie simplement qu'ils possèdent ces compétences (et peut-être à quel point ils connaissent ces compétences).
Il semble qu'une meilleure mesure serait de procéder comme suit:
1) Pour chaque compétence de l'utilisateur, calculez le TF-IDF de cette compétence dans les documents de carrière
2) Pour chaque carrière, additionnez les résultats TF-IDF pour toutes les compétences de l'utilisateur
3) Classement de carrière basé sur la somme ci-dessus
Suis-je en train de penser dans le bon sens ici? Si oui, existe-t-il des algorithmes qui fonctionnent dans ce sens, mais sont-ils plus sophistiqués qu'une simple somme? Merci pour l'aide!
la source
Réponses:
Vous pourriez peut-être utiliser des incorporations de mots pour mieux représenter la distance entre certaines compétences. Par exemple, "Python" et "R" devraient être plus proches l'un de l'autre que "Python" et "Gestion du temps" car ils sont tous les deux des langages de programmation.
L'idée est que les mots qui apparaissent dans le même contexte devraient être plus proches.
Une fois que vous avez ces intégrations, vous auriez un ensemble de compétences pour le candidat et des ensembles de compétences de différentes tailles pour les emplois. Vous pouvez ensuite utiliser la distance de Earth Mover pour calculer la distance entre les ensembles. Cette mesure de distance est plutôt lente (temps quadratique), elle risque donc de ne pas bien évoluer si vous avez de nombreux travaux à effectuer.
Pour résoudre le problème d'évolutivité, vous pourriez peut-être classer les emplois en fonction du nombre de compétences que le candidat a en commun en premier lieu, et favoriser ces emplois.
la source
Une méthode simple et courante pour faire correspondre les «documents» consiste à utiliser la pondération TF-IDF, comme vous l'avez décrit. Cependant, si je comprends bien votre question, vous souhaitez classer chaque carrière (-document) en fonction d'un ensemble de compétences des utilisateurs.
Si vous créez un "vecteur de requête" à partir des compétences, vous pouvez multiplier le vecteur avec votre matrice terme-carrière (avec tous les poids tf-idf comme valeurs). Le vecteur résultant vous donnerait un score de classement par document de carrière que vous pouvez utiliser pour sélectionner les carrières les plus importantes pour l'ensemble des "compétences de requête".
Par exemple, si votre vecteur de requête est composé de zéros et de uns et est de taille, et votre matrice de document de est de taille, alors donnerait un vecteur de tailleavec des éléments égaux à la somme du poids TF-IDF de chaque terme de requête par document de carrière. 1×| terms| M| terms| ×| documents| ˉ v M1×| documents|q¯ 1×|terms| M |terms|×|documents| v¯M 1×|documents|
Cette méthode de classement est l'une des plus simples et de nombreuses variantes existent. L'entrée TF-IDF sur Wikipedia décrit également brièvement cette méthode de classement. J'ai également trouvé ce Q&A sur SO sur la correspondance des documents.
la source
Utilisez l' index Jaccard . Cela vous sera très utile.
la source
Vous pouvez essayer d'utiliser "gensim". J'ai fait un projet similaire avec des données non structurées. Gensim a donné de meilleurs scores que le TFIDF standard. Il a également fonctionné plus rapidement.
la source