Selon le Gensim Word2Vec , je peux utiliser le modèle word2vec dans le package gensim pour calculer la similitude entre 2 mots.
par exemple
trained_model.similarity('woman', 'man')
0.73723527
Cependant, le modèle word2vec ne parvient pas à prédire la similitude des phrases. Je découvre le modèle LSI avec la similitude des phrases dans gensim, mais, ce qui ne semble pas pouvoir être combiné avec le modèle word2vec. La longueur du corpus de chaque phrase que j'ai n'est pas très longue (moins de 10 mots). Alors, existe-t-il des moyens simples d'atteindre l'objectif?
Réponses:
C'est en fait un problème assez difficile que vous vous posez. Le calcul de la similitude des phrases nécessite la construction d'un modèle grammatical de la phrase, la compréhension des structures équivalentes (par exemple «il est allé au magasin hier» et «hier, il est allé au magasin»), la recherche de similitudes non seulement dans les pronoms et les verbes, mais aussi dans le noms propres, trouver des cooccurrences / relations statistiques dans de nombreux exemples textuels réels, etc.
La chose la plus simple que vous puissiez essayer - même si je ne sais pas dans quelle mesure cela fonctionnerait et que cela ne vous donnerait certainement pas les résultats optimaux - serait de commencer par supprimer tous les mots "d'arrêt" (des mots comme "le", "un ", etc. qui n'ajoutent pas beaucoup de sens à la phrase), puis exécutez word2vec sur les mots des deux phrases, additionnez les vecteurs dans une phrase, additionnez les vecteurs dans l'autre phrase, puis trouvez la différence entre les sommes. En les résumant au lieu de faire une différence mot-mot, vous ne serez au moins pas soumis à l'ordre des mots. Cela étant dit, cela échouera de nombreuses manières et n'est en aucun cas une bonne solution (bien que les bonnes solutions à ce problème impliquent presque toujours une certaine quantité de PNL, d'apprentissage automatique et d'autres intelligences).
Donc, la réponse courte est non, il n'y a pas de moyen facile de le faire (du moins de ne pas bien le faire).
la source
Puisque vous utilisez gensim, vous devriez probablement utiliser son implémentation doc2vec. doc2vec est une extension de word2vec au niveau de la phrase, de la phrase et du document. C'est une extension assez simple, décrite ici
http://cs.stanford.edu/~quocle/paragraph_vector.pdf
Gensim est agréable car il est intuitif, rapide et flexible. Ce qui est génial, c'est que vous pouvez récupérer les incorporations de mots pré-entraînées de la page officielle word2vec et la couche syn0 du modèle Doc2Vec de gensim est exposée afin que vous puissiez semer les incorporations de mots avec ces vecteurs de haute qualité!
GoogleNews-vectors-negative300.bin.gz (comme lié dans Google Code )
Je pense que gensim est certainement l'outil le plus simple (et jusqu'à présent pour moi, le meilleur) pour intégrer une phrase dans un espace vectoriel.
Il existe d'autres techniques phrase à vecteur que celle proposée dans l'article de Le & Mikolov ci-dessus. Socher et Manning de Stanford sont certainement deux des chercheurs les plus célèbres travaillant dans ce domaine. Leur travail a été basé sur le principe de la composition - la sémantique de la phrase vient de:
Ils ont proposé quelques modèles de ce type (de plus en plus complexes) pour savoir comment utiliser la compositionnalité pour créer des représentations au niveau des phrases.
2011 - déploiement de l'autoencodeur récursif (très comparativement simple. Commencez ici si vous êtes intéressé)
2012 - réseau de neurones matrice-vecteur
2013 - réseau de tenseurs neuronaux
2015 - Arbre LSTM
ses papiers sont tous disponibles sur socher.org. Certains de ces modèles sont disponibles, mais je recommanderais toujours le doc2vec de gensim. D'une part, l'URAE 2011 n'est pas particulièrement puissante. De plus, il est pré-entraîné avec des poids adaptés pour paraphraser les données d'actualité. Le code qu'il fournit ne vous permet pas de recycler le réseau. Vous ne pouvez pas non plus échanger différents vecteurs de mots, vous êtes donc coincé avec les incorporations pré-word2vec de 2011 de Turian. Ces vecteurs ne sont certainement pas au niveau de word2vec ou GloVe.
Je n'ai pas encore travaillé avec le Tree LSTM, mais cela semble très prometteur!
tl; dr Ouais, utilisez doc2vec de gensim. Mais d'autres méthodes existent!
la source
Si vous utilisez word2vec, vous devez calculer le vecteur moyen pour tous les mots de chaque phrase / document et utiliser la similitude cosinus entre les vecteurs:
Calculez la similitude:
la source
vous pouvez utiliser l'algorithme de distance de Word Mover. voici une description simple de WMD .
Ps: si vous rencontrez une erreur concernant l'importation de la bibliothèque pyemd , vous pouvez l'installer à l'aide de la commande suivante:
la source
Une fois que vous avez calculé la somme des deux ensembles de vecteurs de mots, vous devez prendre le cosinus entre les vecteurs, pas le diff. Le cosinus peut être calculé en prenant le produit scalaire des deux vecteurs normalisés. Ainsi, le nombre de mots n'est pas un facteur.
la source
Il y a une fonction de la documentation prenant une liste de mots et comparant leurs similitudes.
la source
Je voudrais mettre à jour la solution existante pour aider les personnes qui vont calculer la similitude sémantique des phrases.
Étape 1:
Chargez le modèle approprié en utilisant gensim et calculez les vecteurs de mots pour les mots de la phrase et stockez-les sous forme de liste de mots
Étape 2: Calcul du vecteur de phrase
Le calcul de la similitude sémantique entre les phrases était difficile auparavant, mais récemment un article intitulé " UNE BASE SIMPLE MAIS TOUGH-TO-BEAT POUR LES INCORPORATIONS DE SENTENCE " a été proposé qui suggère une approche simple en calculant la moyenne pondérée des vecteurs de mots dans la phrase, puis en supprimant les projections des vecteurs moyens sur leur première composante principale Ici le poids d'un mot w est a / (a + p (w)) avec a étant un paramètre et p (w) la fréquence de mot (estimée) appelée fréquence inverse lisse . Cette méthode fonctionne nettement mieux.
Un code simple pour calculer le vecteur de phrase en utilisant SIF (smooth inverse frequency) la méthode proposée dans l'article a été donnée ici
Étape 3: en utilisant sklearn cosine_similarity, chargez deux vecteurs pour les phrases et calculez la similitude.
C'est la méthode la plus simple et la plus efficace pour calculer la similarité des phrases.
la source
J'utilise la méthode suivante et cela fonctionne bien. Vous devez d'abord lancer un POSTagger puis filtrer votre phrase pour vous débarrasser des mots vides (déterminants, conjonctions, ...). Je recommande TextBlob APTagger . Ensuite, vous construisez un mot2vec en prenant la moyenne de chaque vecteur de mot dans la phrase. La méthode n_similarity de Gemsim word2vec fait exactement cela en permettant de passer deux ensembles de mots à comparer.
la source
Il existe des extensions de Word2Vec destinées à résoudre le problème de la comparaison de morceaux de texte plus longs comme des phrases ou des phrases. L'un d'eux est paragraph2vec ou doc2vec.
"Représentations distribuées de phrases et de documents" http://cs.stanford.edu/~quocle/paragraph_vector.pdf
http://rare-technologies.com/doc2vec-tutorial/
la source
Gensim implémente un modèle appelé Doc2Vec pour l' incorporation de paragraphes .
Il existe différents tutoriels présentés sous forme de notebooks IPython:
Une autre méthode s'appuierait sur Word2Vec et la distance de Word Mover (WMD) , comme indiqué dans ce didacticiel:
Une solution alternative serait de s'appuyer sur des vecteurs moyens:
Enfin, si vous pouvez exécuter Tensorflow, vous pouvez essayer: https://tfhub.dev/google/universal-sentence-encoder/2
la source
J'ai essayé les méthodes fournies par les réponses précédentes. Cela fonctionne, mais le principal inconvénient est que plus les phrases sont longues, plus la similitude sera grande (pour calculer la similitude, j'utilise le score cosinus des deux plongements moyens de deux phrases quelconques) car plus il y a de mots, plus les effets sémantiques positifs sont importants. sera ajouté à la phrase.
J'ai pensé que je devrais changer d'avis et utiliser la phrase incorporant à la place comme étudié dans cet article et ceci .
la source
Le groupe de recherche Facebook a publié une nouvelle solution appelée InferSent Les résultats et le code sont publiés sur Github, vérifiez leur repo. C'est vraiment génial. Je prévois de l'utiliser. https://github.com/facebookresearch/InferSent
leur article https://arxiv.org/abs/1705.02364 Résumé: De nombreux systèmes PNL modernes s'appuient sur des imbrications de mots, préalablement entraînées de manière non supervisée sur de grands corpus, comme fonctionnalités de base. Les efforts pour obtenir des incorporations pour de plus gros morceaux de texte, tels que des phrases, n'ont cependant pas été aussi fructueux. Plusieurs tentatives d'apprentissage de représentations non supervisées de phrases n'ont pas atteint des performances suffisamment satisfaisantes pour être largement adoptées. Dans cet article, nous montrons comment les représentations de phrases universelles entraînées à l'aide des données supervisées des ensembles de données Stanford Natural Language Inference peuvent constamment surpasser les méthodes non supervisées telles que les vecteurs SkipThought sur un large éventail de tâches de transfert. Tout comme la vision par ordinateur utilise ImageNet pour obtenir des fonctionnalités, qui peuvent ensuite être transférées vers d'autres tâches, notre travail tend à indiquer la pertinence de l'inférence du langage naturel pour transférer l'apprentissage à d'autres tâches de la PNL. Notre encodeur est accessible au public.
la source
Si vous n'utilisez pas Word2Vec, nous avons un autre modèle pour le trouver en utilisant BERT pour l'intégration. Vous trouverez ci-dessous le lien de référence https://github.com/UKPLab/sentence-transformers
Autre lien à suivre https://github.com/hanxiao/bert-as-service
la source