2017-09-12 3 views
0

Je suis en train de résoudre un problème de comparaison de phrases en utilisant l'approche naïve de résumer des vecteurs de mots et de comparer les résultats. Mon but est de faire correspondre les gens par intérêt, de sorte que l'ensemble de données se compose de noms et de courtes phrases décrivant leurs passe-temps. Les lots sont assez petits, quelques centaines de personnes, donc je voulais essayer avant de chercher dans doc2vec.phrase correspondant à gensim word2vec: modèle manuellement peuplé ne fonctionne pas

I préparer les données en le nettoyant complètement, en enlevant des mots d'arrêt, de jetons et lemmatizing. J'utilise un modèle pré-entraîné pour les vecteurs de mots qui renvoie des résultats adéquats lorsque je trouve des similitudes pour certains mots d'essai. Également essayé de résumer les mots de la phrase pour trouver des similitudes dans le modèle original - les correspondances ont un sens. Les similitudes seraient autour du sens général de l'expression.

Pour une correspondance de phrase que je suis en train de ce qui suit: créer un modèle vide

b = gs.models.Word2Vec(min_count=1, size=300, sample=0, hs=0) 

vocab aménageons des noms (ou personne id), aucune formation

#first create vocab with an empty vector 
test = [['test']] 
b.build_vocab(test) 
b.wv.syn0[b.wv.vocab['test'].index] = b.wv.syn0[b.wv.vocab['test'].index]*0 

#populate vocab from an array 
b.build_vocab([personIds], update=True) 

Summ vecteurs de mot de chaque phrase et stocker les résultats dans le modèle pour un id correspondant

#sentences are pulled from pandas dataset df. 'a' is a pre-trained model i use to get vectors for each word 

def summ(phrase, start_model): 
    ''' 
    vector addition function 
    ''' 
    #starting with a vector of 0's 
    sum_vec = start_model.word_vec("cat_NOUN")*0 
    for word in phrase: 
     sum_vec += start_model.word_vec(word) 
    return sum_vec 

for i, row in df.iterrows(): 
    try: 
     personId = row["ID"] 
     summVec = summ(df.iloc[i,1],a) 
     #updating syn0 for each name/id in vocabulary 
     b.wv.syn0[b.wv.vocab[personId].index] = summVec 
    except: 
     pass 

Je comprends que je ne devrait pas s'attendre à beaucoup de précision ici, mais l'impression t-SNE ne montre aucun regroupement que ce soit. Trouver des similitudes méthode ne parvient pas non plus à trouver des correspondances (< 0,2 coefficient de similitude essentiellement pour tout). []plot of the entire model[1]

Vous vous demandez si quelqu'un a une idée de l'endroit où je ne me trompe? Est-ce que mon approche est valide?

Répondre

0

Votre code, comme indiqué, ne fait aucun train() des mots-vecteurs (en utilisant votre texte local), ni ne précharge aucun vecteur d'ailleurs. Donc, tous les vecteurs qui existent - créés par les appels build_vocab() - seront toujours dans leurs emplacements de départ initialisés aléatoirement, et seront inutiles à des fins sémantiques.

Suggestions:

  • (a) former vos propres vecteurs de votre texte, ce qui est logique si vous avez une bonne quantité de texte; ou (b) charger des vecteurs d'ailleurs. Mais n'essayez pas de faire les deux. L'option update=True pour build_vocab() devrait être considérée comme une option experte, expérimentale - ne vaut que bricoler si vous avez déjà des choses fonctionnant dans des modes plus simples, et vous '(ou, dans le cas du code ci-dessus, aucune.)
  • Assurez-vous d'en avoir besoin et comprenez toutes les implications.
  • L'utilisation normale ne réattribuera jamais explicitement de nouvelles valeurs à la propriété syn0 du modèle Word2Vec - celles-ci sont gérées par les routines d'apprentissage de la classe, vous n'avez donc jamais besoin de les réinitialiser ou de les modifier. Vous devriez additionner vos propres vecteurs de résumé de texte, basés sur des vecteurs de mots, en dehors du modèle dans vos propres structures de données.
+0

merci pour votre réponse! J'ai été confus au sujet de la fonctionnalité syn0 parce que j'ai vu cette recommandation de mise à jour dans certaines discussions sur les groupes de google. J'ai eu un conseil pour essayer scipy.spatial.distance.cosine() pour le calcul de similarité et cela a fonctionné très bien pour moi. – Nick