首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用solr构建标记云

使用solr构建标记云
EN

Stack Overflow用户
提问于 2011-09-06 10:20:39
回答 3查看 6.4K关注 0票数 6

亲爱的堆叠溢出社区:

给出一些文本,我希望得到文本中最常用的50个单词,并在其中创建一个标记云,从而以图形的方式显示文本的主旨。

text实际上是一组大约每项(一张图片)有100个注释的集合--大约有120个条目,我还想保持云的更新--保持注释索引,并在每次出现新的web请求时使用云生成代码来运行。

我决定使用Solr索引文本,现在我想知道如何从Solr TermsVectorComponant中获得前50个单词。下面是一个由术语向量组件返回的结果的示例,在打开术语频率后,使用tv.tf="true"

代码语言:javascript
复制
  <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>

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

  1. 我了解文档中的所有条款,而不仅仅是前100位。
  2. 而且它们不是按频率排序的,所以我必须在内存中得到术语并对其进行排序,以便做我想做的事情。

有更好的办法吗?(或)我能否告诉solr术语向量组件以某种方式对其进行排序,并只为我提取100个?(或)我是否还可以使用其他框架?我需要在新的注释出现时进行索引,因此标记云总是最新的--对于云生成器来说,它需要一个加权单词字典,并将它变成一个很好的图像。

的回答没有帮助。

编辑-试用jpountz & paige的答案

下面是我为这个查询得到的结果:

代码语言:javascript
复制
    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>

我得到了50个这样的元素,@jpountz,感谢您帮助限制了结果,但是为什么所有50个单独的<int>元素都保存了值1?我的想法是:数字1表示与我的查询相匹配的文档的计数(因为我通过Id:Guid查询了一个文档),它们并不代表Post_Content中单词的频率。

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

代码语言:javascript
复制
<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>

我的问题是如何获取文档中的术语频率,而不是许多术语的文档频率。例如,我知道可引导是我在Post_content中使用了6次的一个单词,所以我希望对一组文档进行排序,比如(6,“可引导”),(5,“磁盘”)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-08 16:20:57

我想出了一个权宜之计的解决方案:(为了举例起见,我把每个solr文档称为"post“)

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

我所做的是创建一个名为content_的动态字段,并根据类别在它自己的字段中对每个post集进行索引。这意味着将有数百个动态字段的实例,每个实例包含一个后置集,我可以使用该字段上的terms组件来获取该后集的顶级项。

作为一幅画:

代码语言:javascript
复制
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

这个解决方案有点适合我,如果需要的话,您也可以轻松地为每个Post创建一个字段。我还想知道像这样使用动态字段的含义:这会是个问题吗?

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

  1. 频率一词是指"A“或"A组文档”中的单词数,而不是包含该词的文档数。
  2. 我可以从一个文档中获得最高出现的术语,如果需要的话,也可以从一组文档中获得。
  3. 我没有使用faceting,因为它主要根据文档的数量给出频率,而不是以单词发生的次数来表示,而不管哪个文档。
票数 0
EN

Stack Overflow用户

发布于 2011-09-06 15:53:21

下面是一篇描述如何设置标记Cloud-使用Solr和PHP创建标记云的文章。虽然PHP部分可能不适用于您,但我认为标记云的实际生成是.

本文描述了一种使用空格标记器创建文本字段以返回单个单词的方法,然后对该字段执行方面搜索。我知道你可以设置面限制,所以在你的情况下,你只能得到前100名的结果。

票数 5
EN

Stack Overflow用户

发布于 2011-09-06 11:55:03

如果Lucene文档是一个注释,您可以使用faceting来这样做。例如,下面的请求http://solr:port/solr/select?q={!lucene}uniqueKey:(MA147LL/A OR 3007WFP)&facet=true&facet.field=includes&facet.minCount=1&facet.limit=50将帮助您为注释MA147LL/A3007WFP构建标记云。

然而,这一办法将:

  • 使Solr为需要内存的UnInvertedField字段实例化includes实例,
  • 计算与某个术语匹配的文档数量,而不是该术语出现的总数。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7318326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档