web-dev-qa-db-fra.com

Utiliser Word2vec pour classer les mots en catégories

CONTEXTE

J'ai des vecteurs avec des exemples de données et chaque vecteur a un nom de catégorie (Lieux, Couleurs, Noms).

['john','jay','dan','nathan','bob']  -> 'Names'
['yellow', 'red','green'] -> 'Colors'
['tokyo','bejing','washington','mumbai'] -> 'Places'

Mon objectif est de former un modèle prenant une nouvelle chaîne d’entrée et prédisant à quelle catégorie il appartient. Par exemple, si une nouvelle entrée est "violette", je devrais pouvoir prédire "Couleurs" comme étant la bonne catégorie. Si la nouvelle entrée est "Calgary", il devrait prédire "Lieux" comme étant la bonne catégorie.

APPROCHE

J'ai fait des recherches et suis tombé sur Word2vec . Cette bibliothèque a une fonction "similitude" et "mostsimilarity" que je peux utiliser. Donc, une approche de force brute à laquelle j'ai pensé est la suivante:

  1. Prendre de nouvelles entrées.
  2. Calculez sa similarité avec chaque mot de chaque vecteur et prenez une moyenne.

Ainsi, par exemple, pour l'entrée "rose", je peux calculer sa similarité avec les mots du vecteur. Les "noms" prennent une moyenne puis le font également pour les 2 autres vecteurs. Le vecteur qui me donne la moyenne de similarité la plus élevée serait le vecteur correct pour que l'entrée appartienne.

PROBLÈME

Étant donné mes connaissances limitées en PNL et en apprentissage automatique, je ne suis pas sûr que ce soit la meilleure approche et, par conséquent, je cherche de l'aide et des suggestions pour de meilleures approches pour résoudre mon problème. Je suis ouvert à toutes les suggestions et je vous prie de signaler toutes les erreurs que j'ai pu commettre alors que je suis nouveau dans l'apprentissage automatique et le monde de la PNL.

11
Dinero

Si vous recherchez la solution la plus simple et la plus rapide, je vous suggérerais de vous baser sur les versions pré-formées de Word (Word2Vec ou GloVe) et de simplement créer un système de requête simple. Les vecteurs ont été formés sur un vaste corpus et sont susceptibles de contenir une approximation suffisante des données de votre domaine.

Voici ma solution ci-dessous:

import numpy as np

# Category -> words
data = {
  'Names': ['john','jay','dan','nathan','bob'],
  'Colors': ['yellow', 'red','green'],
  'Places': ['tokyo','bejing','washington','mumbai'],
}
# Words -> category
categories = {Word: key for key, words in data.items() for Word in words}

# Load the whole embedding matrix
embeddings_index = {}
with open('glove.6B.100d.txt') as f:
  for line in f:
    values = line.split()
    Word = values[0]
    embed = np.array(values[1:], dtype=np.float32)
    embeddings_index[Word] = embed
print('Loaded %s Word vectors.' % len(embeddings_index))
# Embeddings for available words
data_embeddings = {key: value for key, value in embeddings_index.items() if key in categories.keys()}

# Processing the query
def process(query):
  query_embed = embeddings_index[query]
  scores = {}
  for Word, embed in data_embeddings.items():
    category = categories[Word]
    dist = query_embed.dot(embed)
    dist /= len(data[category])
    scores[category] = scores.get(category, 0) + dist
  return scores

# Testing
print(process('pink'))
print(process('frank'))
print(process('moscow'))

Pour l'exécuter, vous devrez télécharger et décompresser les données GloVe pré-entraînées de here (attention, 800 Mo!). Lors de l'exécution, il devrait produire quelque chose comme ceci:

{'Colors': 24.655489603678387, 'Names': 5.058711671829224, 'Places': 0.90213905274868011}
{'Colors': 6.8597321510314941, 'Names': 15.570847320556641, 'Places': 3.5302454829216003}
{'Colors': 8.2919375101725254, 'Names': 4.58830726146698, 'Places': 14.7840416431427}

... qui semble assez raisonnable. Et c'est tout! Si vous n'avez pas besoin d'un aussi gros modèle, vous pouvez filtrer les mots dans glove en fonction de leur score tf-idf . N'oubliez pas que la taille du modèle dépend uniquement des données dont vous disposez et des mots que vous souhaitez pouvoir interroger.

18
Maxim

En outre, ce que sa valeur, PyTorch a une bonne et plus rapide mise en œuvre de Glove ces jours-ci.

0
mithunpaul