Je cherche à résoudre le problème suivant: j'ai un ensemble de phrases comme ensemble de données et je veux pouvoir taper une nouvelle phrase et trouver la phrase à laquelle la nouvelle est la plus similaire dans l'ensemble de données. Un exemple ressemblerait à:
Nouvelle phrase: " I opened a new mailbox
"
Prédiction basée sur un ensemble de données:
Sentence | Similarity
A dog ate poop 0%
A mailbox is good 50%
A mailbox was opened by me 80%
J'ai lu que la similitude en cosinus peut être utilisée pour résoudre ces types de problèmes associés à tf-idf (et les RNN ne devraient pas apporter d'améliorations significatives aux méthodes de base), ou bien word2vec est utilisé pour des problèmes similaires. Ceux-ci sont-ils réellement viables dans ce cas spécifique également? Existe-t-il d'autres techniques / algorithmes pour résoudre ce problème (de préférence avec Python et SKLearn, mais je suis également ouvert à apprendre sur TensorFlow)?
la source
Réponses:
Votre problème peut être résolu avec Word2vec ainsi que Doc2vec. Doc2vec donnerait de meilleurs résultats car il prend en compte les phrases lors de l'apprentissage du modèle.
Solution Doc2vec
Vous pouvez former votre modèle doc2vec en suivant ce lien . Vous voudrez peut-être effectuer certaines étapes de prétraitement comme la suppression de tous les mots vides (des mots comme "le", "un", etc. qui n'ajoutent pas beaucoup de sens à la phrase). Une fois que vous avez formé votre modèle, vous pouvez trouver les phrases similaires en utilisant le code suivant.
Résultats:
Les résultats ci-dessus sont une liste de tuples pour
(label,cosine_similarity_score)
. Vous pouvez mapper les sorties aux phrases en faisanttrain[29670]
.Veuillez noter que l'approche ci-dessus ne donnera de bons résultats que si votre modèle doc2vec contient des incorporations pour les mots trouvés dans la nouvelle phrase. Si vous essayez d'obtenir une similitude pour certaines phrases de charabia comme
sdsf sdf f sdf sdfsdffg
, cela vous donnera peu de résultats, mais ce ne sont peut-être pas les phrases similaires réelles car votre modèle formé n'a peut-être pas vu ces mots de charabia lors de la formation du modèle. Essayez donc de former votre modèle sur autant de phrases que possible pour incorporer autant de mots pour de meilleurs résultats.Solution Word2vec
Si vous utilisez word2vec, vous devez calculer le vecteur moyen pour tous les mots de chaque phrase et utiliser la similitude en cosinus entre les vecteurs.
Calculer la similitude
la source
sentence_1.split()
fait de même.Word Mover's Distance (WMD) est un algorithme pour trouver la distance entre les phrases. WMD est basé sur des incorporations de mots (par exemple, word2vec) qui codent la signification sémantique des mots en vecteurs denses.
Par exemple:
Source: document "Des intégrations de mots aux distances des documents"
Le package gensim a une implémentation WMD .
Pour votre problème, vous devez comparer la phrase entrée à toutes les autres phrases et renvoyer la phrase qui a le plus d'ADM.
la source
Vous pouvez essayer une solution simple en utilisant sklearn et cela fonctionnera bien.
Utilisez tfidfvectorizer pour obtenir une représentation vectorielle de chaque texte
Adapter le vectoriseur à vos données, en supprimant les mots vides.
Transformez la nouvelle entrée avec le vectoriseur préalablement formé
Calculez la similitude en cosinus entre cette représentation et chaque représentation des éléments de votre ensemble de données.
Si vous avez un ensemble de données hugh, vous pouvez le regrouper (par exemple en utilisant KMeans de scikit learn) après avoir obtenu la représentation et avant de prédire de nouvelles données.
Ce code effectue toutes ces étapes. Vous pouvez le vérifier sur mon github repo .
la source
Il existe des travaux récents basés sur l'encodage automatique variationnel dans les modèles RNN.Génération de phrases à partir d'un espace continu , avec implémentations pytorch: code github .
ils ont réussi à compresser la caractéristique globale sémantique et syntaxique d'une phrase dans un espace latent exprimé peut-être avec quelques 10 à 30 variables aléatoires indépendantes finies (distribution factorisée).
l'idée nouvelle dans ce travail, ils interpolent entre deux phrases. et les résultats étaient assez étonnants.
la source
La solution généralisée comprend les étapes suivantes -
Pour 1. word2vec est le meilleur choix mais si vous ne voulez pas utiliser word2vec, vous pouvez faire quelques approximations. Une façon consiste à créer une matrice de cooccurrence de mots à partir de vos phrases entraînées, puis à y appliquer TSVD . Matrice de coccurance den Xn dimensionnalité lors de la conversion en n Xré dimensionnalité, fait des vecteurs de mots de ré dimensions.
Une fois que vous avez incorporé le mot de chaque mot, vous pouvez appliquer n'importe quelle métrique de similitude comme la similitude en cosinus, etc. sur chaque phrase pour mesurer la similitude avec les autres.
la source