Comment étiqueter automatiquement le contenu, les algorithmes et les suggestions nécessaires
je travaille avec de très grandes bases de données d'articles de journaux, je les ai dans une base de données MySQL, et je peux tous les interroger.
je cherche maintenant des façons de m'aider à étiqueter ces articles avec des étiquettes quelque peu descriptives.
tous ces articles sont accessibles à partir d'une URL qui ressemble à ceci:
http://web.site/CATEGORY/this-is-the-title-slug
donc au moins je peux utiliser la catégorie pour déterminer avec quel type de contenu nous travaillons. Cependant, Je veulent aussi tag basé sur l'article-texte.
mon approche initiale était de faire ceci:
- obtenir tous les articles
- Obtenir tous les mots, supprimer tous les signes de ponctuation, à séparer par un espace, et de les compter par accident
- analysez-les, et filtrez les mots non descriptifs courants comme "eux", "I", "ceci", "ces", "leurs" etc.
- quand tous les mots communs ont été éliminés, le seul ce qui reste, ce sont des mots dignes d'un tag.
Mais cela s'est avéré être plutôt une tâche manuelle, et pas très joli, ou utile.
cela a également souffert du problème des mots ou des noms qui sont divisés par espace, par exemple si 1.000 articles contient le nom "John Doe", et 1.000 articles contient le nom de "John Hanson", Je ne obtiendrais le mot "John" hors de lui, pas son prénom, et le nom de famille.
7 réponses
étiqueter automatiquement les articles est vraiment un problème de recherche et vous pouvez passer beaucoup de temps à réinventer la roue alors que d'autres ont déjà fait beaucoup de travail. Je conseillerais d'utiliser l'un des outils de traitement du langage naturel existants comme NLTK .
pour commencer, je suggérerais d'envisager la mise en œuvre d'un Tokeniser approprié (bien mieux que de se séparer par espace blanc), puis de jeter un oeil aux algorithmes de Chunking et de bourrage.
vous pourriez aussi vouloir compter les fréquences pour n-grammes , c.-à-d. une séquence de mots, au lieu de mots individuels. Cela permettrait de "séparer les mots d'un espace". Des outils comme NLTK ont des fonctions in-built pour cela.
enfin, alors que vous améliorez itérativement votre algorithme, vous pourriez vouloir former sur un sous-ensemble aléatoire de la base de données et ensuite essayer comment l'algorithme tags l'ensemble restant d'articles pour voir comment il fonctionne.
vous devez utiliser une métrique telle que tf-idf pour obtenir les étiquettes:
- compter la fréquence de chaque terme par document. C'est le terme fréquence , tf ( t , D ). Plus un terme apparaît souvent dans le document D , plus il est important pour d .
- compter, par terme, le nombre de documents dans lesquels le terme apparaît. C'est le fréquence de document , df ( t ). Plus le df est élevé, moins le terme est discriminant parmi vos documents et moins il est intéressant.
- Diviser tf par le journal de df: tfidf( t , D ) = tf( t , D ) / log(df( D ) + 1).
- pour chaque document, déclarez le haut k Termes par leur score TF-idf pour être les étiquettes pour ce document.
diverses implémentations de TF-idf sont disponibles; pour Java et .NET, il y a Lucene, pour Python il y a scikits.apprendre.
si vous voulez faire mieux que cela, utilisez modèles de langue . Cela nécessite une certaine connaissance de la théorie des probabilités.
regardez Kea . C'est un outil open source qui permet d'extraire des fichiers clés de documents textuels.
votre problème a aussi été discuté à plusieurs reprises à http://metaoptimize.com/qa :
si je comprends bien votre question, vous voulez regrouper les articles en classes de similarité. Par exemple, vous pourriez attribuer l'article 1 au "sport", l'article 2 à la "Politique", etc. Ou si vos classes sont plus fines, les mêmes articles pourraient être assignés à "Dallas Mavericks" et "GOP Presidential Race".
cela relève de la catégorie générale des algorithmes de "regroupement". Il existe de nombreux choix possibles de tels algorithmes, mais c'est un domaine de recherche actif (ce qui signifie que ce n'est pas un problème résolu, et donc aucun des algorithmes sont susceptibles de fonctionner aussi bien que vous le souhaitez).
je vous recommande d'examiner L'Allocation de Direchlet Latent (http://en.wikipedia.org/wiki/Latent_Dirichlet_allocation) ou "LDA". Je n'ai pas d'expérience personnelle avec l'une des implémentations LDA disponibles, donc je ne peux pas recommander un système spécifique (peut-être d'autres plus informés que je pourrais être en mesure de recommander un application.)
vous pourriez également considérer les mises en œuvre de clustering agglomérative disponibles dans LingPipe (voir http://alias-i.com/lingpipe/demos/tutorial/cluster/read-me.html ), bien que je soupçonne une mise en œuvre de L'EDL pourrait s'avérer un peu plus fiable.
quelques questions à considérer pendant que vous étudiez les systèmes de regroupement:
-
voulez-vous autoriser les fractions appartenance à une classe - par exemple, envisager un article sur les perspectives économiques et leurs effets potentiels sur la course à la présidence; ce document peut-il appartenir en partie au cluster "économie" et en partie au cluster "élection"? Certains algorithmes de regroupement permettent l'attribution partielle de classe et certains ne permettent pas
-
voulez-vous créer un ensemble de classes manuellement (c'est à dire, la liste de 'l'économie', 'sport', ...), ou préférez-vous apprendre l'ensemble des classes de la les données? Les étiquettes de classe manuelle peuvent exiger plus de supervision (intervention manuelle), mais si vous choisissez d'apprendre des données, les "étiquettes" ne seront probablement pas significatives pour un humain (par exemple, classe 1, classe 2, etc.), et même le contenu des cours peut ne pas être très instructif. C'est-à-dire que l'algorithme d'apprentissage trouvera des similitudes et des documents de regroupement qu'il considère comme similaires, mais les regroupements qui en résulteront ne correspondront peut-être pas à votre idée de ce qu'une "bonne" classe devrait contenir.
votre approche semble raisonnable et il y a deux façons d'améliorer le marquage.
- utilisez une liste connue de mots-clés/phrases pour votre étiquetage et si le nombre d'occurrences de ce mot/phrase est supérieur à un seuil (probablement basé sur la longueur de l'article) alors inclure l'étiquette.
- utilisez une partie de l'algorithme de marquage de la parole pour aider à réduire l'article dans un ensemble raisonnable de phrases et d'utiliser un méthode sensible pour en extraire les étiquettes. Une fois que vous avez réduit les articles en utilisant un tel algorithme, vous seriez en mesure d'identifier quelques bons mots/phrases candidats à utiliser dans votre liste de mots-clés/phrases pour la méthode 1.
si le contenu est une image ou une vidéo, veuillez consulter l'article de blog suivant:
http://scottge.net/2015/06/30/automatic-image-and-video-tagging /
il y a essentiellement deux approches pour extraire automatiquement des mots-clés des images et des vidéos.
- de Plusieurs instances d'Apprentissage (MIL)
- réseaux neuronaux profonds (DNN), réseaux neuronaux récurrents (RNN), et les variantes
dans l'article de blog ci-dessus, je liste les derniers documents de recherche pour illustrer les solutions. Certains d'entre eux incluent même le site de démonstration et le code source.
si le contenu est un grand texte document, s'il vous plaît consulter cet article de blog:
meilleure phrase APIs D'Extraction sur le marché http://scottge.net/2015/06/13/best-key-phrase-extraction-apis-in-the-market /
Merci, Scott
en supposant que vous avez un ensemble prédéfini de balises, vous pouvez utiliser L'API Elasticsearch Percolator comme cette réponse suggère:
Elasticsearch-utilisez un index" tags "pour découvrir tous les tags dans une chaîne donnée