2011-09-06 3 views
6

Chère communauté stackoverflow:Construire un nuage de tags avec solr

Compte tenu du texte, je souhaite obtenir les 50 mots les plus fréquents dans le texte, et créer un nuage de tags sur, et montrer ainsi l'essentiel de de quoi parle le texte d'une manière graphique. Le texte est en fait un ensemble de 100 commentaires pour chaque article (une image) il y a environ 120 articles, et je veux aussi garder le nuage à jour - en gardant les commentaires indexés, et en utilisant le cloud code de génération à exécuter chaque fois qu'une nouvelle requête Web apparaît.

Je me suis contenté d'utiliser Solr pour indexer le texte, et maintenant je me demandais comment obtenir les 50 mots TOP, sur Solr TermsVectorComponant. Voici un exemple des résultats retournés par les termes vecteur Componant, après avoir allumé la fréquence à long terme en disant tv.tf="true":

<lst name="doc-5"> 
    <str name="uniqueKey">MA147LL/A</str>  
    <lst name="includes"> 
     <lst name="cabl"><tf>5</tf></lst> 
     <lst name="earbud"><tf>3</tf></lst> 
     <lst name="headphon"><tf>10</tf></lst> 
     <lst name="usb"><tf>11</tf></lst> 
    </lst> 
    </lst> 

    <lst name="doc-9"> 
    <str name="uniqueKey">3007WFP</str> 
    <lst name="includes"> 
     <lst name="cabl"><tf>5</tf></lst> 
     <lst name="usb"><tf>4</tf></lst> 
    </lst> 
    </lst> 

Comme vous pouvez le voir, j'ai 2 problèmes:

  1. Je reçois tous les et ils ne sont pas triés par fréquence, donc je dois obtenir des termes et le trier en mémoire pour faire ce que j'essaie.

Y a-t-il un meilleur moyen? (ou) Puis-je dire à un composant de termrector de quelque façon de le trier et d'en ramasser seulement 100 pour moi? (ou) Y a-t-il un autre cadre que je peux utiliser? J'ai besoin de garder les nouveaux commentaires indexés comme ils viennent, de sorte que le nuage de tags est toujours à jour - En ce qui concerne le générateur de nuages, il prend un dictionnaire de mots pondérés, et en fait une belle image.

This réponse ne aide pas.

EDIT - essayer jpountz & paige réponse de cuisinier

Voici un résultat que je suis arrivé pour cette requête:

select?q=Id:d4439543-afd4-42fb-978a-b72eab0c07f9&facet=true 
&facet.field=Post_Content&facet.minCount=1&facet.limit=50 

<int name="also">1</int> 
<int name="ani">1</int> 
<int name="anoth">1</int> 
<int name="atleast">1</int> 
<int name="base">1</int> 
<int name="bcd">1</int> 
<int name="becaus">1</int> 
<int name="better">1</int> 
<int name="bigger">1</int> 
<int name="bio">1</int> 
<int name="boot">1</int> 
<int name="bootabl">1</int> 
<int name="bootload">1</int> 
<int name="bootscreen">1</int> 

je suis arrivé 50 de ces éléments, @jpountz merci pour aider à limiter la résultats, MAIS pourquoi tout le CINQUANTE des éléments individuels <int> détiennent la valeur ? Mes pensées sont: Le nombre 1 représente le nombre de documents correspondant à ma requête (qui ne peut être qu'un depuis que j'ai interrogé par Id: Guid) et ils ne représentent pas la fréquence des mots en Post_Content

Pour le prouver supprimé le Id: GUID de requête et le résultat a été:

<int name="content">33</int> 
<int name="can">17</int> 
<int name="on">16</int> 
<int name="so">16</int> 
<int name="some">16</int> 
<int name="all">15</int> 
<int name="i">15</int> 
<int name="do">14</int> 
<int name="have">14</int> 
<int name="my">14</int> 

Mon problème est de savoir comment obtenir la fréquence à long terme dans le document, et non la fréquence des documents de plusieurs termes. Par exemple je sais pour un fait que bootable était un mot que j'ai utilisé 6 fois dans Post_content, donc je veux des Pairs triés comme (6, "bootable"), (5, "disc") pour un ensemble de documents.

+0

est précisément de la requête fonctionnelle que nous pouvons utiliser, à cette fin? – Zasz

+0

Les éléments sont apparus dans les résultats des facettes. – Zasz

Répondre

0

Je suis venu avec une solution STOPGAP: (Im appeler un chaque document solr un « post » pour des exemples saké)

Il y a une composante termes Solr, dont le but semble être d'exposer tous les indexées termes d'un champ donné. Il est principalement utilisé pour implémenter des fonctionnalités telles que l'auto-complétion, et d'autres fonctionnalités qui fonctionnent à un niveau terme. Et il est par défaut trié par fréquence - les termes les plus fréquents dans le domaine viennent en premier.

Ce que j'ai fait est créé un champ dynamique appelé content_ et indexé chaque post-set dans son propre champ basé sur la catégorie. Cela signifie qu'il y aura des centaines d'instances du champ dynamique contenant chacune un post-set, et je peux utiliser le composant terms sur ce champ pour obtenir TOP TERMS pour ce post-set.

Comme une image:

content_postSetOne : contains indexed version of a set of posts 
content_postSetTwo : contains indexed version of another set of posts 
content_postSetThree : contains indexed version of a third set of posts 

Cette solution est une sorte de travailler pour moi, et vous pouvez facilement créer un champ par Post a également en cas de besoin. Je suis également intéressé de connaître les implications de l'utilisation de champs dynamiques comme ceci: Est-ce que ce sera un problème?

Comment est-ce différent de Paige et jPountz réponse est:

  1. La fréquence à long terme est le nombre de mots « A » ou « un ensemble de Docs » et non le nombre de nombre de documents contenant le terme.
  2. Je peux obtenir les meilleurs termes apparaissant à l'intérieur d'un document et, si nécessaire, d'un ensemble de documents.
  3. Je n'ai pas utilisé le facettage car il donne principalement la fréquence en termes de nombre de documents et non pas en termes de nombre de fois où le mot s'est produit, quel que soit le doc.
+0

Si de meilleures réponses se présentent, je vais Je les marque volontiers comme étant juste, annulant le mien. – Zasz

1

Si un document Lucene est un commentaire, vous pouvez utiliser la facette pour ce faire. Par exemple, la requête suivante http://solr:port/solr/select?q={!lucene}uniqueKey:(MA147LL/A OR 3007WFP)&facet=true&facet.field=includes&facet.minCount=1&facet.limit=50 vous aidera à créer un nuage de tags pour les commentaires MA147LL/A et 3007WFP.

Cependant, cette approche:

  • faire Solr instancier une instance UnInvertedField pour le champ includes, qui a nécessité la mémoire,
  • compter le nombre de documents qui correspondent à un terme au lieu du nombre total d'occurrences de ce terme.
+0

Hey j'ai essayé ce que vous avez dit que j'ai des résultats étranges, je l'ai modifié ma question – Zasz

5

Voici un article qui décrit la mise en place d'un Nuage de Tags - Creating a Tag Cloud with Solr and PHP. Bien que la partie PHP ne puisse pas s'appliquer à vous, la génération réelle du nuage d'étiquettes est, je crois ...

Cet article décrit une méthode de création d'un champ de texte avec un tokenizer espace pour renvoyer des mots individuels, puis effectuer un recherche de facettes dans ce champ. Je sais que vous pouvez définir des limites de facettes, alors dans votre cas, vous ne pouvez obtenir que les 100 premiers résultats.

+0

je ne regarde l'article et avoir fait ce qui est dit là - ce qui est essentiellement un faire facettage sur mon champ qui contient le contenu, je peux Ne pas obtenir TOP X termes fréquents, à la place, je reçois le résultat que j'ai collé dans la question – Zasz

+0

Basé sur les informations que vous avez ajouté après avoir essayé ma réponse et celle de @jpountz. Vous devrez exécuter deux requêtes distinctes. 1. Avec les documents que vous cherchez à afficher. (pas d'options de facettage spécifiées) 2.Une requête à facette unique où vous effectuez une recherche parmi tous les documents 'q = *: * & facet = true & facet.field = Post_Content & facet.minCount = 1 & facet.limit = 50' et créez votre nuage de tags à partir des résultats des facettes. –

+0

Im créer un nuage avec seulement le contenu d'un document, un seul domaine! - pour le point numéro 1 = je n'ai pas besoin d'écrire une telle requête car je connais l'identifiant du document pour lequel je veux créer le nuage. Pour le point numéro 2 Si je fais une facette sur tous les documents, j'obtiendrai les termes les plus fréquents, parmi tous les docs, ce qui signifie que le terme TOPMOST peut être dans n'importe quel document comme nous utilisons q = *: *! J'ai besoin du terme «top freq» dans mon document ONE, celui que je connais, et dont le contenu va devenir le cloud. – Zasz

Questions connexes