Question

J'aimerais implémenter l'analyse LSA (Latent Semantic Analysis) en PHP afin de trouver des rubriques / balises pour les textes.

Voici ce que je pense devoir faire. Est-ce correct? Comment puis-je le coder en PHP? Comment déterminer quels mots choisir?

Je ne souhaite utiliser aucune bibliothèque externe. J'ai déjà une implémentation pour la décomposition en valeurs singulières (SVD) .

  1. Extrait tous les mots du texte donné.
  2. Pondérez les mots / phrases, par exemple avec tf – idf . Si la pondération est trop complexe, prenez simplement le nombre d’occurrences.
  3. Construire une matrice: les colonnes sont des documents de la base de données (le plus sera le mieux?), les lignes sont des mots uniques, les valeurs sont le nombre d’occurrences ou le poids.
  4. Effectuez la décomposition en valeurs singulières (SVD).
  5. Utilisez les valeurs de la matrice S (SVD) pour réduire les dimensions (comment?).

J'espère que vous pourrez m'aider. Merci beaucoup d'avance!

Était-ce utile?

La solution

Liens LSA:

Voici l'algorithme complet. Si vous avez une SVD, vous êtes la plupart du temps. Les documents ci-dessus l'expliquent mieux que moi.

Hypothèses:

  • votre fonction SVD donnera les valeurs singulières et les vecteurs singuliers par ordre décroissant. Sinon, vous devez faire plus d’acrobaties.

M : matrice de corpus, w (mots) sur d (documents) (w lignes, d colonnes). Ceux-ci peuvent être des comptes bruts, ou tfidf ou autre. Les mots vides peuvent ou ne peuvent pas être éliminés, et des tergiversations peuvent se produire (Landauer dit de garder les mots vides et de ne pas endiguer, mais oui à tfidf).

U,Sigma,V = singular_value_decomposition(M)

U:  w x w
Sigma:  min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values
V:  d x d matrix

Thus U * Sigma * V = M  
#  you might have to do some transposes depending on how your SVD code 
#  returns U and V.  verify this so that you don't go crazy :)

Ensuite, la réductionnalité .... le document LSA suggère une bonne approximation car la base consiste à conserver suffisamment de vecteurs de sorte que leurs valeurs singulières représentent plus de 50% du total des valeurs singulières.

Plus succinctement ... (pseudocode)

Let s1 = sum(Sigma).  
total = 0
for ii in range(len(Sigma)):
    val = Sigma[ii]
    total += val
    if total > .5 * s1:
        return ii

Ceci renverra le rang de la nouvelle base, qui était min (d, w) auparavant, et nous allons maintenant approximer avec {ii}.

(ici, '- > prime, pas transposition)

Nous créons de nouvelles matrices: U ', Sigma', V ', de tailles w x ii, ii x ii et ii x d.

C'est l'essence de l'algorithme LSA.

Cette matrice résultante U '* Sigma' * V 'peut être utilisée pour améliorer la recherche de similarité cosinus, ou vous pouvez choisir les 3 mots les plus fréquents pour chaque document qu'il contient, par exemple. Que ce soit plus qu'un simple tf-idf fait l'objet d'un débat.

Pour moi, les performances de LSA sont médiocres dans les ensembles de données du monde réel en raison de la polysémie et des ensembles de données comportant trop de sujets. Sa base mathématique / probabiliste n’est pas solide (elle suppose des distributions normales-gaussiennes, ce qui n’a aucun sens pour le nombre de mots).

Votre kilométrage variera certainement.

Marquage à l'aide de LSA (une méthode!)

  1. Construisez les matrices à dimensions réduites U 'Sigma' V 'en utilisant une SVD et une heuristique de réduction

  2. À la main, examinez la matrice U 'et proposez des termes décrivant chaque "sujet". Par exemple, si les parties les plus importantes de ce vecteur étaient "Bronx, Yankees, Manhattan". puis "New York City" pourrait être un bon terme pour cela. Conservez-les dans un tableau associatif ou une liste. Cette étape devrait être raisonnable puisque le nombre de vecteurs sera fini.

  3. En supposant que vous ayez un vecteur (v1) de mots pour un document, alors v1 * t (U ') donnera les "sujets" les plus forts pour ce document. Sélectionnez les 3 plus élevés, puis donnez leurs "sujets". tel que calculé à l'étape précédente.

Autres conseils

Cette réponse n’est pas directement liée à la question des affiches, mais à la méta-question de la procédure de marquage automatique des informations. Le PO mentionne la Reconnaissance des entités nommées, mais je pense qu’elles ont une signification plus importante dans le sens du marquage automatique. S'ils veulent vraiment dire NER, alors cette réponse est foutaise:)

Étant donné ces contraintes (600 éléments / jour, 100-200 caractères / élément) avec des sources divergentes, voici quelques options de marquage:

  1. À la main. Un analyste pourrait facilement en effectuer 600 par jour, probablement en quelques heures. Quelque chose comme Mechanical Turk d'Amazon, ou obliger les utilisateurs à le faire, pourrait également être réalisable. Avoir un certain nombre de "étiquetés à la main", même s'ils ne sont que 50 ou 100, sera une bonne base pour comparer les méthodes générées automatiquement ci-dessous.

  2. Réductions de dimensionnalité, utilisant LSA, Topic-Models (allocation de Dirichlet latente), etc.). J'ai eu très peu de chance avec LSA sur des ensembles de données du monde réel et je ne suis pas satisfait de sa base statistique. Je trouve que la LDA est bien meilleure et a une liste de diffusion incroyable qui a la meilleure pensée sur la façon d'attribuer des sujets à des textes.

  3. Une heuristique simple ... si vous avez des éléments d'actualité, alors exploitez la structure de celui-ci . Concentrez-vous sur la première phrase, jetez tous les mots courants (mots vides) et sélectionnez les 3 meilleurs noms des deux premières phrases. Ou alors, prenez tous les noms de la première phrase et voyez où cela vous mène. Si les textes sont tous en anglais, effectuez une partie de l'analyse de la parole sur l'ensemble du shebang et voyez ce que cela vous apporte. Avec des éléments structurés, tels que les reportages d'actualités, LSA et d'autres méthodes indépendantes de l'ordre (tf-idf) émettent beaucoup d'informations.

Bonne chance!

(si vous aimez cette réponse, retachez peut-être la question pour l'adapter)

Cela a l'air bien, jusqu'à la dernière étape. La notation habituelle pour SVD est qu’elle renvoie trois matrices A = USV *. S est une matrice diagonale (c’est-à-dire que tout est à zéro de la diagonale) qui, dans ce cas, donne essentiellement une mesure de la quantité capturée par chaque dimension des données originales. Les nombres ("valeurs singulières") vont baisser et vous pouvez rechercher une diminution du nombre de dimensions utiles. Sinon, vous voudrez simplement choisir un nombre arbitraire N pour le nombre de dimensions à prendre.

Ici, je suis un peu flou. Les coordonnées des termes (mots) dans l'espace à dimension réduite sont soit en U, soit en V, selon qu'ils se trouvent dans les lignes ou les colonnes de la matrice d'entrée. Je pense que les coordonnées des mots seront les rangées de U, c’est-à-dire que la première rangée de U correspond à la première rangée de la matrice d’entrée, c’est-à-dire le premier mot. Il suffit ensuite de prendre les N premières colonnes de cette ligne comme coordonnée du mot dans l'espace réduit.

HTH

Mise à jour:

Jusqu'à présent, ce processus ne vous dit pas exactement comment choisir les balises. Je n'ai jamais entendu parler de personnes utilisant LSI pour choisir des étiquettes (un algorithme d'apprentissage automatique pourrait être plus adapté à la tâche, comme les arbres de décision, par exemple). LSI vous indique si deux mots sont similaires. C’est loin d’attribuer des tags.

Il y a deux tâches: a) quels sont les ensembles de balises à utiliser? b) comment choisir les trois meilleurs tags?. Je ne sais pas trop comment LSI va vous aider à répondre à (a). Vous pouvez choisir le jeu d'étiquettes à la main. Toutefois, si vous utilisez LSI, les balises devraient probablement être des mots figurant dans les documents. Ensuite, pour (b), vous voulez choisir les balises les plus proches des mots trouvés dans le document. Vous pourriez expérimenter quelques façons de mettre cela en œuvre. Choisissez les trois balises les plus proches de n'importe quel mot du document, où la proximité est mesurée par la similarité cosinus (voir Wikipedia) entre la coordonnée de la balise (sa rangée dans U) et la coordonnée du mot (sa rangée). en U).

Il existe un fil de discussion SO supplémentaire sur les dangers de faire cela en PHP sur le link texte .

Plus précisément, il existe un lien vers ce document à l'adresse Cartographie sémantique latente , qui décrit comment obtenir les "sujets" résultants. pour un texte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top