0
votes

Pourquoi most_similar dans word2vec ne considère pas le terme lui-même?

Je travaille sur un projet de similarité d'entité. Le most_similar de most_similar le most_similar de word2vec fonctionne très bien à cet égard. Cependant, je souhaite également que le terme de recherche lui-même soit inclus dans le résultat. Cela devrait être quelque chose comme ceci:

>>> model = Word2Vec(sw_token, min_count=2)
>>> model = gensim.models.KeyedVectors.load("model.bin")
>>> model.wv.most_similar("melanoma", topn=5)

[('melanoma', 1.000000),
 ('cutaneous', 0.6512814164161682),
 ('uveal', 0.6295092701911926),
 ('gp100', 0.617050290107727),
 ('ligand-bearing', 0.614188551902771)]

Les documents officiels ne montrent rien qui puisse m'aider ici. De plus, s'il existe des termes tels que melanoma xyz comment pouvons-nous obtenir un mot tel que plus proche dans la plupart_similaire? Je comprends que cela prendra le mot en compte, donc deux mots comptent pour 2 pas un, donc ils ne sont pas similaires ici. peut être. Merci.


0 commentaires

3 Réponses :


0
votes

En ce qui concerne l'inclusion du terme de recherche dans la liste la plus similaire, vous pouvez simplement l'ajouter manuellement au début de la liste de sortie. Étant donné que la similitude cosinus d'un jeton avec lui-même est 1 , il doit toujours être le premier jeton de la liste renvoyée.

En ce qui concerne l'inclusion de termes tels que melanoma xyz vous pouvez parcourir votre corpus avant de vous entraîner et joindre tous ces termes en un seul jeton en utilisant «_» - c'est-à-dire melanoma_xyz . Notez que de cette façon, vous obtiendrez différents vecteurs pour "mélanome" et melanoma_xyz . Espérons qu'ils seront proches les uns des autres dans l'espace vectoriel.


0 commentaires

1
votes

La raison pour laquelle il se comporte comme il le fait est que votre comportement préféré n'est pas une préférence commune: la plupart des utilisateurs fournissant un seul mot comme point d'origine n'ont pas besoin que le même mot soit répété comme résultat supérieur. Bien sûr, le mot lui-même est le plus proche de lui-même et a une similitude cosinus de 1.0 . (De même, lorsque vous utilisez cette méthode dans le mode utile pour la résolution d'analogie - model.most_similar(positive=['queen', 'man'], negative=['king']] - aucun des mots fournis sont recherchés dans les réponses des candidats.)

Comme le note la réponse d'Itamar Trainnin , si vous en avez besoin pour une raison quelconque, vous pouvez ajouter vous-même ce résultat axiomatique.

Notez également que si vous fournissez des vecteurs bruts comme origine, plutôt qu'un mot clé pour rechercher l'origine, aucun filtrage des résultats basé sur les clés fournies ne se produit. Ainsi, ce qui suit inclura le 'melanoma' parmi les résultats:

model.wv.most_similar(positive=[model.wv['melanoma']], topn=5)

Ce que vous entendez par «s'il existe des termes tels que melanoma xyz comment pouvons-nous obtenir un mot plus proche dans la plupart_similaire» n'est pas clair. Il est possible d'avoir formé votre modèle avec le mot 'melanoma xyz' . (Si cela a été fourni sous forme de jeton de mot en nombre suffisant lors de la création et de la formation du modèle, un vecteur de mot sera appris pour ce jeton. Et ce jeton sera renvoyé, lorsqu'il fait partie des meilleurs résultats pour une requête most_similar() .

Mais si le modèle n'a pas été entraîné avec un tel jeton, il n'aura pas de vecteur pour cette chaîne, et donc 'melanoma xyz' ne peut pas être un résultat renvoyé. (Et, s'il est fourni comme origine, créerait une KeyError .)

Si 'melanoma xyz' est un concept distinct dans votre domaine, que vous aimeriez être traité comme son propre mot (et obtenir son propre vecteur de mots), vous pouvez envisager de changer votre tokenisation initiale pour la conserver comme une unité, plutôt que le diviser en ['melanoma', 'xyz'] . Cela pourrait être accompli par une liste triée sur le volet de groupes de mots à combiner, ou en utilisant une analyse statistique comme celle offerte par la classe Gensim Phrases . (Il est plus courant d'utiliser un trait '_' soulignement explicite '_' pour regrouper ces jetons en jetons uniques, pour plus de clarté.) Après un entraînement sur un tel texte, 'melanoma_xyz' aurait un vecteur de mot et recevrait donc un vecteur appris.

Si vous n'avez pas l'option de telles combinaisons de mots multiples explicites au début, vous pouvez également envisager:

  1. Lorsque vous avez une chaîne comme 'melanoma xyz' comme requête, divisez-la en deux mots - ['melanoma', 'xyz'] - et créez un vecteur unique de la moyenne de ces deux mots (si les deux sont indépendamment présent dans votre modèle). C'est grossier mais peut-être mieux que rien.

  2. Envisagez d'utiliser un modèle comme FastText - qui fait une version suralimentée de (1) où chaque fragment d'un mot contribue quelque peu à son vecteur de mot. Ainsi, lors de la fourniture d'un mot totalement inconnu, le simple chevauchement avec des fragments de mots qui ont été vus pendant la formation - comme 'mela' ou 'noma' ou 'xyz' - permet de créer un vecteur de mot approximatif. (De tels vecteurs ne sont pas géniaux, mais encore une fois généralement mieux que rien, bien que les listes de mots dans les ensembles de résultats n'incluent toujours que les mots réellement présents pendant l'entraînement.)


2 commentaires

Merci avant tout pour la réponse. Cependant, votre exemple de code fourni n'a pas fonctionné comme prévu. model.wv.most_similar(model.wv['melanoma'], topn=5) J'accepterai la réponse une fois que je serai en mesure de creuser un peu plus. Veuillez accepter mes excuses;


Désolé, j'ai changé le code pour placer explicitement le model.wv['melanoma'] comme un membre d'une liste fournie comme paramètre positive , ce qui devrait le faire se comporter comme décrit à l'origine.



-1
votes

Cela se produit parce que la probabilité qu'un mot se répète autour d'un mot est presque nulle. Le corpus sur lequel vous entraînez word2vec n'aura probablement pas de chaîne "mélanome mélanome" nulle part. Après avoir obtenu le vecteur de mot incorporé pour "mélanome", le vecteur qui maximise le produit scalaire avec "mélanome" sera "mélanome" lui-même mais de telles instances ne sont pas présentes dans le corpus d'entrée.


0 commentaires