11
votes

Comment améliorer mon algorithme pour trouver les sujets chauds comme Twitter fait

J'ai créé un travail de cron pour mon site Web qui fonctionne tous les 2 heures et compte les mots dans les aliments d'alimentation, puis affiche les 10 mots de comptage les plus élevés en tant que sujets à chaud.

Quelque chose que Twitter effectue une page d'accueil là-bas, de montrer les sujets les plus populaires en cours de discussion.

Qu'est-ce que mon travail cron fait actuellement est-il actuellement compte des mots, à l'exception des mots que j'ai mentionnés, des mots comme: xxx

mais cela ne fait pas résout complètement la question de l'élimination de tous les mots non requis. Et donnez uniquement les mots utiles.

Quelqu'un peut-il me guider à ce sujet et dites-moi comment puis-je améliorer mon algorithme?

Cordialement Zeeshan


3 commentaires

Je suppose qu'il y a un autre code qui lance les mots d'arrêt du texte. Est-ce que cela ne fonctionne pas? Vous voudrez publier ce code s'il n'élimine pas votre liste de mots non requis.


Non Mon code ne fonctionne bien ... Je cherche juste un filtre pour supprimer plus de ces mots non requis.


Votre liste d'arrêt ne semble pas être celle adaptée à Twitter. Cela inclut beaucoup de longs mots / expressions qui ne sont probablement pas utilisés pour une extrême restriction de Twitter sur la longueur de message, mais cela n'inclut pas les mots communs tels que "I", "et" et "mais" mais ". Si vous êtes intéressé, il s'agit de la liste des mots que j'utilise pour analyser les flux RSS, il pourrait s'agir d'un bon point de départ: GITUB.COM/DYER/ZEITGEIST/BLOB/MASTER/CORE/src/java/resour CES / ...


10 Réponses :


8
votes

Bienvenue dans le monde merveilleux du traitement des langues. Fondamentalement, tout comme des sujets de tendance et des amis sont une recherche d'anomalies dans une utilisation linguistique.

théoriquement, en analysant la fréquence des mots au fil du temps, vous devriez être capable de filtrer le bruit (mots communs, comme ceux que vous avez énumérés ci-dessus). Ce n'est pas trivial à mettre en œuvre, mais définitivement une possibilité.

Un autre devraoch serait de ne pas se concentrer sur la quantité brute de mots dans une période donnée, mais plutôt sur le motif dans lequel les sujets de tendance se développent. Ils se développent généralement un peu exponentiels et il devrait être possible de revalider les résultats de votre recherche existante en essayant d'appliquer un filtre qui goutte tous les "mots chauds" qui ne sont pas conformes à ce type de croissance.

juste quelques pensées: -)

EDIT:

Pour décrire encore ce que je voulais dire avec filtrage par fréquence, vous devriez peut-être vérifier sur des dictionnaires contenant des informations de fréquence sur les mots. Ce n'est pas si difficile de construire et avec un corpus solide (Wikipedia est libre de télécharger, je l'ai utilisé pour un test) Vous obtiendrez de bons résultats remarquables.


3 commentaires

Alors, Moritz, pensez-vous que Twitter utilise quelque chose comme votre deuxième approche pour le faire?


Je spéculerais simplement sur la façon dont vous pourriez le faire, mais je ne sais pas comment Twitter le fait, désolé: - /. Mais compte tenu des immenses quantités de données qu'ils traitent, je suppose qu'elles incorporent une approche plurialisée, plusieurs filtres différents appliqués.


Voir ma réponse pour savoir comment filtrer en fonction de la fréquence globale



1
votes

3 commentaires

C'est une superbe liste, mais je ne pense pas que c'est ce qu'il cherche. Il a déjà une liste de mots d'arrêt ( array (...) )


@brianreevvis - "Mais cela ne résout pas complètement la question de l'élimination de tous les mots non requis. Et donnez uniquement les mots utiles." - On dirait qu'il cherchait des moyens d'améliorer sa liste de mots d'arrêt pour moi.


Merci Eric, pour plus d'idées que vous avez données pour ce problème. Je cherche toujours une solution plus prometteuse, quelque chose qui est déjà utilisé.



1
votes

Je ne sais pas vraiment si vous recherchez une meilleure façon de filtrer des mots sans importance ou pour générer la liste actuelle de la top dix à partir d'un ensemble de mots valides.

Pour filtrage, je suggérerais un Approche noire Si vous voulez garder cela simple. Si vous voulez quelque chose de plus sophistiqué, vous pouvez créer une statistique qui détermine des mots utilisés équitablement souvent, qui sont ensuite filtrés à partir de votre liste de mots.

pour compter, tronquer et tronquer la liste "Thème de tendance" réelle , Je suggère ceci: xxx

appeler la fonction avec un paramètre Word jusqu'à ce que vous soyez terminé. Il vous donnera le nombre actuel de ce mot en retour, si cela vous est utile.

Appliquez-le une fois sans paramètres et cela vous donnera les dix premiers mots les plus souvent utilisés du mot que vous nourris à elle.

J'ai testé et les performances semblent ok jusqu'à présent.

Bien sûr, il s'agit simplement d'une suggestion et peut être raffinée beaucoup plus loin.


0 commentaires

8
votes

Voici comment nous avons mis en œuvre cela pour la Djangodose Live Feed pendant Djangocon (Remarque: Ceci est un hackjob, nous l'avons écrit en 1 après-midi sans test et bicolore de bifurcation occulatrie, de mieux que je puisse dire que la bifurcation n'a rien à voir avec n'importe quoi). Tout ce qui étant dit, il travaillait plus ou moins pour nous (signification dans la soirée de la bière a été suivi de manière appropriée). XXX


0 commentaires

3
votes

Voici une idée:

calculer la fréquence d'utilisation moyenne de chaque mot en anglais. Mettez ceux-ci dans une table de recherche. Vous voudrez probablement garder seulement les mots les plus courants. Choisissez un certain nombre de mots (disons, 5000) ou une fréquence minimale, cela a du sens. Vous voudrez probablement toujours avoir une liste de mots que vous ne montrez jamais. Si vous triez votre liste de mots par fréquence, cela ne vous mènera pas longtemps pour les examiner et choisir les mots pour toujours exclure.

Pour calculer la fréquence, vous avez besoin d'un échantillon d'entrée. Votre choix d'échantillon d'entrée affectera le résultat. Par exemple, Twitter pourrait utiliser chaque message Twitter jamais affiché comme échantillon d'entrée. Les sujets qui sont constamment discutés sur Twitter (par exemple, «Twitter» lui-même) perdraient de l'importance. Si vous voulez des sujets spécifiques à Twitter pour conserver leur signification, trouvez un autre exemple d'entrée.

L'algorithme de la fréquence informatique est simple:

  • pour chaque mot dans l'échantillon:
    • regarde ce mot dans le dictionnaire
    • ajoutez-en un à un compteur associé à ce mot
    • Pour normaliser les données, diviser la fréquence de chaque mot par le nombre de mots dans l'échantillon d'entrée.

      Maintenant, si vous exécutez le même algorithme sur les postes Twitter d'aujourd'hui, vous pouvez comparer les fréquences de mots d'aujourd'hui avec des fréquences de mots attendues.


1 commentaires

Oui, c'est fondamentalement le cœur du z-score.



11
votes

Si vous souhaitez que les valeurs aberrantes statiquement significatives, vous souhaiterez peut-être calculer un score Z pour chaque mot dans un sous-ensemble récent relatif au texte global.

Donc si P>

p_hat = t / n_t
p_0 = o / n_o

z = (p_hat - p_0) / sqrt((p_0 * (1 - p_0)) / n_t)


2 commentaires

On pourrait aussi dire que, à condition que la gamme de sujets n'est pas trop large, un filtre bayésien travaillerait également des merveilles. Utilisation de votre algythm en combinaison avec ce type de filtre, vous pouvez obtenir une très bonne base de données sur ce qui est un «mot réel» (jambon) et ce qui n'est pas (spam) ou collectez simplement la fréquence des mots utilisés, période et Numéro de tous les mots comme "spam" pour chaque fois qu'il est utilisé. Cela collectera l'utilisation de la noeud et facilement les mots d'arrêt. De plus, la liste est dynamique, vous n'aurez donc pas à rechercher des mots d'arrêt à l'avenir.


Penser plus fort sur le filtre bayésien plus. Si vous voulez devenir encore plus sophistiqué, vous pouvez attacher des points de vue sur lesdites sujets (supposant que les gens considèrent ces sujets chauds) et les mots en eux, comme «jambon» par la méthode bayésienne. Cela vous donnerait plus que des scores de spam et vous aiderait à déterminer ce que sont les "bons mots" pour identifier "de bons sujets". Peut-être pas tant de "sujets chauds", mais de sujets que vos utilisateurs sont intéressés tout d'œil.



1
votes

Vous voudrez peut-être rechercher l'utilisation des chaînes de Markov / Hidden Markov Models.

Ces modèles mathématiques ont été plutôt efficaces dans le traitement des langues naturelles.

Votre exactitude sur des sujets de tendance serait beaucoup plus élevée. (Et vous pouvez le laisser apprendre ...)


0 commentaires

1
votes

Vous voudrez peut-être consulter NLTK (Toolkit de langues naturelles). Il y a un livre gratuit qui vous apprendrait à l'utiliser à l'adresse http://www.nltk.org/book . Le seul inconvénient est qu'il est en python et je suppose que vous avez besoin d'une solution PHP. Ne soyez pas trop effrayé, car le livre ne s'attend pas à ce que vous connaissiez à l'avance Python.

NLKT est si très puissant et vaut vraiment la peine d'être examinée.


0 commentaires

3
votes

Voici une manière peu coûteuse et joyeuse de le faire.

toutes les 2 heures, créez un histogramme de vos fréquences de mots. Par exemple; P>

Snow 1500%
Britney 100%


0 commentaires

0
votes

n'est pas plus facile de numériser chaque entrée d'alimentation au moment de la création plutôt que de faire une grande recherche massive toutes les 2 heures?


0 commentaires