使用solr构建标签云

Zas*_*asz 6 java lucene visualization solr data-visualization

亲爱的stackoverflow社区:

鉴于一些文本,我希望在文本中获得前50个最常用的单词,并从中创建一个标签云,从而以图形方式显示文本的内容.

文本实际上是一组100左右的评论PER每个ITEM(一张图片)有大约120个项目,我还希望保持云更新 - 通过保持评论索引,并使用云生成代码每次运行新的网络请求出现了.

我决定使用Solr索引文本,现在想知道如何从Solr TermsVectorComponant中获得前50个单词.以下是术语矢量组件返回的结果示例,在您打开术语频率后,通过说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>
Run Code Online (Sandbox Code Playgroud)

如你所见,我有两个问题:

  1. 我获得了该文档中的所有条款,不仅仅是前100名
  2. 并且它们没有按频率排序,因此我必须得到术语并将其排序在内存中以执行即时尝试.

有没有更好的办法?(或者)我可以告诉solr termvector组件以某种方式对它进行排序并为我提取100个吗?(或)我可以使用其他一些框架吗?我需要保留新的评论标记,因此标签云始终是最新的 - 对于云生成器,它需要一个加权单词的字典,并使其成为一个很好的图像.

这个答案没有帮助.

编辑 - 尝试jpountz和paige厨师的答案

这是我为此查询得到的结果:

    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>
Run Code Online (Sandbox Code Playgroud)

我有50个这样的元素,@ jpountz感谢帮助限制结果,但为什么所有五十个单独的<int>元素都保持值1?我的想法是:数字1表示与我的查询匹配的文档的数量(自我通过Id:Guid查询后,它只能是一个)并且它们不代表单词的频率Post_Content

为了证明这一点,我从查询中删除了Id:GUID,结果是:

<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>
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在文档中获取术语频率,而不是许多术语的文档频率.例如,我知道可引导的是我在Post_content中使用了6次的单词,所以我想要对一组文档进行排序,如(6,"可引导"),(5,"光盘").

Pai*_*ook 5

这篇文章描述了如何设置标签云 - 使用Solr和PHP创建标签云.虽然PHP部分可能不适用于您,但我相信标签云的实际生成是......

本文介绍了使用空白标记生成器创建文本字段以返回单个单词,然后对该字段执行构面搜索的方法.我知道您可以设置方面限制,因此在您的情况下,您只能获得前100个结果.


Zas*_*asz 0

我想出了一个权宜之计的解决方案:(为了举例,我将每个 solr 文档称为“帖子”)

Solr 中有一个 terms 组件,其目的似乎是公开任何给定字段的所有索引术语。它主要用于实现自动完成等功能以及在术语级别运行的其他功能。默认情况下,它按频率排序 - 该领域中出现频率更高的术语首先出现。

我所做的是创建一个名为的动态字段content_,并根据类别在其自己的字段中对每个帖子集进行索引。这意味着动态字段将有数百个实例,每个实例都包含一个帖子集,我可以使用该字段上的术语组件来获取该帖子集的热门术语。

如图:

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
Run Code Online (Sandbox Code Playgroud)

这个解决方案对我来说有点有用,如果需要,您也可以轻松地为每个帖子创建一个字段。我也有兴趣了解使用这样的动态字段的含义:这会是一个问题吗?

这与 Paige 和 jPountz 的答案有何不同:

  1. 术语频率是“A”或“一组文档”中的单词数,而不是包含该术语的文档数。
  2. 我可以从一个文档中获取出现频率最高的术语,如果需要,还可以从一组文档中获取出现次数最多的术语。
  3. 我没有使用分面,因为它主要给出文档数量的频率,而不是单词出现的次数,无论哪个文档。