Estou trabalhando em um projeto pequeno e pessoal, que utiliza as habilidades profissionais de um usuário e sugere a carreira ideal para elas, com base nessas habilidades. Eu uso um banco de dados de listas de empregos para conseguir isso. No momento, o código funciona da seguinte maneira:
1) Processe o texto de cada lista de tarefas para extrair as habilidades mencionadas na lista
2) Para cada carreira (por exemplo, "Analista de Dados"), combine o texto processado das listagens de tarefas para essa carreira em um documento
3) Calcule o TF-IDF de cada habilidade nos documentos de carreira
Depois disso, não tenho certeza de qual método devo usar para classificar carreiras com base em uma lista das habilidades de um usuário. O método mais popular que eu já vi seria tratar as habilidades do usuário como um documento, calcular o TF-IDF para o documento de habilidade e usar algo como similaridade de cosseno para calcular a semelhança entre o documento de habilidade e cada documento de carreira.
Isso não parece a solução ideal para mim, pois a semelhança de cosseno é melhor usada quando se compara dois documentos do mesmo formato. Por esse motivo, o TF-IDF não parece ser a métrica apropriada para aplicar à lista de habilidades do usuário. Por exemplo, se um usuário adicionar habilidades adicionais à sua lista, o TF de cada habilidade cairá. Na realidade, não me importo com a frequência das habilidades na lista de habilidades do usuário - apenas me importo com elas (e talvez com o quão bem elas conheçam).
Parece que uma métrica melhor seria fazer o seguinte:
1) Para cada habilidade que o usuário possui, calcule o TF-IDF dessa habilidade nos documentos de carreira
2) Para cada carreira, some os resultados do TF-IDF para todas as habilidades do usuário
3) Classifique a carreira com base na soma acima
Estou pensando na linha certa aqui? Em caso afirmativo, existem algoritmos que funcionam nesse sentido, mas são mais sofisticados do que uma simples soma? Obrigado pela ajuda!
fonte
Respostas:
Talvez você possa usar combinações de palavras para representar melhor a distância entre certas habilidades. Por exemplo, "Python" e "R" devem estar mais próximos que "Python" e "Gerenciamento de tempo", pois são as duas linguagens de programação.
A idéia é que as palavras que aparecem no mesmo contexto estejam mais próximas.
Depois de realizar esses casamentos, você terá um conjunto de habilidades para o candidato e conjuntos de habilidades de vários tamanhos para os trabalhos. Você pode usar a Distância do Movimentador de Terra para calcular a distância entre os conjuntos. Essa medida de distância é bastante lenta (tempo quadrático); portanto, pode não ser bem dimensionada se você tiver muitos trabalhos a realizar.
Para lidar com a questão da escalabilidade, talvez você possa classificar os trabalhos com base em quantas habilidades o candidato tem em comum em primeiro lugar e favorecer esses trabalhos.
fonte
Um método comum e simples de combinar "documentos" é usar a ponderação TF-IDF, como você descreveu. No entanto, como eu entendo sua pergunta, você deseja classificar cada carreira (documento) com base em um conjunto de habilidades dos usuários.
Se você criar um "vetor de consulta" a partir das habilidades, poderá multiplicar o vetor com sua matriz de termo-carreira (com todos os pesos tf-idf como valores). O vetor resultante forneceria uma pontuação de classificação por documento de carreira que você pode usar para escolher as principais carreiras do conjunto de "habilidades de consulta".
Este método de classificação é uma das mais simples e existem muitas variações. A entrada TF-IDF na Wikipedia também descreve esse método de classificação brevemente. Eu também encontrei essas perguntas e respostas no SO sobre documentos correspondentes.
fonte
Use o índice Jaccard . Isso servirá muito ao seu propósito.
fonte
Você pode tentar usar "gensim". Eu fiz um projeto semelhante com dados não estruturados. Gensim deu melhores pontuações que o TFIDF padrão. Também correu mais rápido.
fonte