Neural Network parse string data?


28

Donc, je commence tout juste à apprendre comment un réseau de neurones peut fonctionner pour reconnaître les modèles et classer les entrées, et j'ai vu comment un réseau de neurones artificiel peut analyser les données d'image et catégoriser les images ( démo avec convnetjs ), et la clé là-bas consiste à sous-échantillonner l'image et chaque pixel stimule un neurone d'entrée dans le réseau.

Cependant, j'essaie de comprendre si cela peut être fait avec des entrées de chaîne? Le cas d'utilisation que j'ai est un "moteur de recommandation" pour les films qu'un utilisateur a regardés. Les films ont beaucoup de données de chaîne (titre, intrigue, tags), et je pourrais imaginer "sous-échantillonner" le texte en quelques mots clés qui décrivent ce film, mais même si j'analyse les cinq premiers mots qui décrivent ce film, je pensez que j'aurais besoin de neurones d'entrée pour chaque mot anglais afin de comparer un ensemble de films? Je pourrais limiter les neurones d'entrée uniquement aux mots utilisés dans l'ensemble, mais pourrait-il alors grandir / apprendre en ajoutant de nouveaux films (l'utilisateur regarde un nouveau film, avec de nouveaux mots)? La plupart des bibliothèques que j'ai vues ne permettent pas d'ajouter de nouveaux neurones après que le système a été formé?

Existe-t-il un moyen standard de mapper les données de chaîne / mot / caractère aux entrées dans un réseau neuronal? Ou un réseau neuronal n'est-il pas vraiment le bon outil pour analyser des données de chaîne comme celle-ci (quel est un meilleur outil pour le filtrage de motifs dans les données de chaîne)?

Réponses:


19

L'utilisation d'un réseau de neurones pour la prédiction des données en langage naturel peut être une tâche délicate, mais il existe des méthodes éprouvées pour le rendre possible.

Dans le champ Traitement automatique du langage naturel (PNL), le texte est souvent représenté à l'aide du modèle de sac de mots. En d'autres termes, vous avez un vecteur de longueur n , où n est le nombre de mots de votre vocabulaire, et chaque mot correspond à un élément du vecteur. Pour convertir du texte en données numériques, il vous suffit de compter le nombre d'occurrences de chaque mot et de placer cette valeur à l'index du vecteur qui correspond au mot. Wikipedia décrit très bien ce processus de conversion. Étant donné que la longueur du vecteur est fixe, il est difficile de gérer les nouveaux mots qui ne correspondent pas à un index, mais il existe des moyens pour atténuer ce problème ( hachage de la fonction de recherche ).

Cette méthode de représentation présente de nombreux inconvénients - elle ne préserve pas la relation entre les mots adjacents et entraîne des vecteurs très clairsemés. Regarder les n-grammes aide à résoudre le problème de la préservation des relations entre les mots, mais pour l'instant concentrons-nous sur le deuxième problème, la rareté.

Il est difficile de traiter directement avec ces vecteurs clairsemés (de nombreuses bibliothèques d'algèbre linéaire gèrent mal les entrées clairsemées), donc souvent l'étape suivante est la réduction de la dimensionnalité. Pour cela, nous pouvons nous référer au domaine de la modélisation de sujet : des techniques comme l' allocation de Dirichlet latente (LDA) et l' analyse sémantique latente (LSA) permettent la compression de ces vecteurs clairsemés en vecteurs denses en représentant un document comme une combinaison de sujets. Vous pouvez fixer le nombre de rubriques utilisées et, ce faisant, corriger la taille du vecteur de sortie produit par LDA ou LSA. Ce processus de réduction de dimensionnalité réduit considérablement la taille du vecteur d'entrée tout en essayant de perdre une quantité minimale d'informations.

Enfin, après toutes ces conversions, vous pouvez alimenter les sorties du processus de modélisation de sujet dans les entrées de votre réseau neuronal.


1
Faites-moi savoir si vous avez d'autres questions et je ferai de mon mieux pour vous fournir plus de détails.
Madison

Merci, cela me donne d'excellentes conditions pour continuer à explorer!
MidnightLightning

Soit dit en passant , je peux me rapporter au «hachage de fonctionnalités» car cela semble très similaire à un filtre de floraison , que je connais en travaillant avec du code de crypto-monnaie. Je me demande s'il est plus efficace d'avoir une fonction de hachage relier une fonction d'entrée à plusieurs positions d'index (style filtre fleuri) plutôt que d'avoir besoin d'une deuxième fonction de hachage pour définir le signe d'un index ...
MidnightLightning

6

Les réponses de @Emre et @Madison May présentent toutes deux de bons points sur le problème en question. Le problème consiste à représenter votre chaîne en tant que vecteur d'entité pour l'entrée dans le NN.

Tout d'abord, le problème dépend de la taille de la chaîne que vous souhaitez traiter. Les longues chaînes contenant des jetons may (généralement des mots) sont souvent appelées documents dans ce paramètre. Il existe des méthodes distinctes pour gérer les jetons / mots individuels.

Il existe plusieurs façons de représenter des documents. Beaucoup d'entre eux font l' hypothèse du sac de mots . Les types les plus simples représentent le document comme un vecteur du nombre de mots ou de la fréquence des termes (tf). Afin d'éliminer les effets de la longueur du document, les gens préfèrent généralement normaliser par le nombre de documents dans lesquels un terme apparaît, la fréquence du document ( tf-idf ).

Une autre approche est la modélisation de sujet, qui apprend une représentation latente de dimension inférieure des données. LDA et LSI / LSA sont des choix typiques, mais il est important de se rappeler que cela n'est pas supervisé. La représentation apprise ne sera pas nécessairement idéale pour tout apprentissage supervisé que vous faites avec votre NN. Si vous souhaitez faire de la modélisation de sujets, vous pouvez également essayer des modèles de sujets supervisés .

Pour les mots individuels, vous pouvez utiliser word2vec , qui exploite les NN pour incorporer des mots dans un espace de taille arbitraire. La similitude entre deux vecteurs de mots dans cet espace appris tend à correspondre à une similitude sémantique.

Une approche pionnière plus récente est celle des vecteurs de paragraphe , qui apprennent d'abord un modèle de mot de type word2vec, puis s'appuient sur cette représentation pour apprendre une représentation distribuée d'ensembles de mots (documents de toute taille). Cela a montré des résultats de pointe dans de nombreuses applications.

Lors de l'utilisation de NN dans la PNL, les gens utilisent souvent des architectures différentes, comme les réseaux neuronaux récurrents (comme les réseaux de mémoire à court terme ). Dans certains cas, les gens ont même utilisé des réseaux de neurones convolutifs sur du texte.


Je pense que word2Vec est vraiment la réponse la plus précise à la question. Il y a un très bon tutoriel Kaggle sur la façon de former et d'utiliser un: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

Merci, j'ai oublié le lien word2vec, j'en ajouterai un (en plus de celui que vous
listez

3

Ce n'est pas un problème sur les réseaux de neurones en soi, mais sur la représentation des données textuelles dans l'apprentissage automatique. Vous pouvez représenter les films, la distribution et le thème sous forme de variables catégorielles. L'intrigue est plus compliquée; vous voudriez probablement un modèle de sujet pour cela, mais je laisserais ça de côté jusqu'à ce que vous compreniez. Il fait précisément ce "sous-échantillonnage" textuel que vous avez mentionné.

Jetez un œil à ce didacticiel pour savoir comment coder des variables catégorielles pour les réseaux de neurones. Et bonne chance!


Il convient de noter que ce n'est pas explicitement un problème dans l'ensemble du machine learning, mais seulement un problème lorsqu'il s'agit de générer des vecteurs de fonctionnalités, qui ne sont pas omniprésents dans le machine learning.
Slater Victoroff

Quel type d'apprentissage automatique n'utilise pas de fonctionnalités?
Emre

La forêt aléatoire est un bon exemple de quelque chose pour lequel l'obtention d'un vecteur caractéristique du type que vous voyez dans les réseaux de neurones n'est pas un problème. Un grand nombre de méthodes non supervisées fonctionnent également sur des mots bruts plutôt que sur des vecteurs de fonctionnalités. Remarque: je n'ai pas dit qu'il existe des méthodes qui n'utilisent pas de fonctionnalités, mais seulement qu'il existe des méthodes qui ne reposent pas sur des vecteurs strictement structurés.
Slater Victoroff

Je ne sais pas ce que vous entendez par "strictement structuré".
Emre

strictement structuré est un vecteur 1d de unint8 par opposition à une liste contenant un dictionnaire, une matrice de poids et une série de chaînes
Slater Victoroff

0

J'ai essayé les 2 façons suivantes pour l'implémentation d'essai-n-test de réseaux de neurones avec du texte. Ce dernier fonctionne assez bien, mais avec des limites.

  1. Créez du vocabulaire en utilisant word2vect ou NLTK / jetons de mots personnalisés et attribuez un index à chaque mot. C'est cet index qui représente le mot sous forme de nombre.

    Défis:

    • Les index doivent être «normalisés» à l'aide de la mise à l'échelle des fonctionnalités.
    • Si la sortie du réseau neuronal a même une légère variation, alors la sortie peut être un index de mot inattendu (par exemple, si la sortie attendue est 250; mais NN sort 249 ou 251, alors ce pourrait être une sortie proche du contexte numérique; mais ce sont des index de mots différents). Le NN récurrent pour générer un indice de sortie peut être exploité ici.
    • Si de nouveaux mots sont ajoutés au vocabulaire, les index des jetons doivent être redimensionnés. Le modèle formé avec des valeurs précédemment mises à l'échelle peut devenir invalide et doit être re-formé.
  2. Utilisez la matrice d'identité, par exemple pour les mots "n", utilisez la matrice "nx n" ou (n-1 x n-1) où chaque ligne et colonne représente un mot. Mettez "1" dans la cellule d'intersection et "0" dans les lieux de repos. ( référence )

    Défis:

    • Chaque valeur d'entrée et de sortie est un vecteur "nx 1". Pour un vocabulaire de grande taille, c'est un calcul volumineux et plus lent.
    • Si de nouveaux mots sont ajoutés au vocabulaire, la matrice d'identité (c'est-à-dire le vecteur de mots) doit être recalculée. Le modèle formé avec des vecteurs précédemment calculés peut devenir invalide et doit être re-formé.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.