亲爱的堆叠溢出社区:
给出一些文本,我希望得到文本中最常用的50个单词,并在其中创建一个标记云,从而以图形的方式显示文本的主旨。
text实际上是一组大约每项(一张图片)有100个注释的集合--大约有120个条目,我还想保持云的更新--保持注释索引,并在每次出现新的web请求时使用云生成代码来运行。
我决定使用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>如你所见,我有两个问题:
有更好的办法吗?(或)我能否告诉solr术语向量组件以某种方式对其进行排序,并只为我提取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>我得到了50个这样的元素,@jpountz,感谢您帮助限制了结果,但是为什么所有50个单独的<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>我的问题是如何获取文档中的术语频率,而不是许多术语的文档频率。例如,我知道可引导是我在Post_content中使用了6次的一个单词,所以我希望对一组文档进行排序,比如(6,“可引导”),(5,“磁盘”)。
发布于 2011-09-08 16:20:57
我想出了一个权宜之计的解决方案:(为了举例起见,我把每个solr文档称为"post“)
Solr中有一个术语组件,其目的似乎是公开任何给定字段的所有索引项。它主要用于实现诸如自动完成等功能,以及在一个术语级别上运行的其他功能。在默认情况下,它是按频率排序的--在该领域中,出现频率越高的术语就越优先。
我所做的是创建一个名为content_的动态字段,并根据类别在它自己的字段中对每个post集进行索引。这意味着将有数百个动态字段的实例,每个实例包含一个后置集,我可以使用该字段上的terms组件来获取该后集的顶级项。
作为一幅画:
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的答案有何不同:
发布于 2011-09-06 15:53:21
下面是一篇描述如何设置标记Cloud-使用Solr和PHP创建标记云的文章。虽然PHP部分可能不适用于您,但我认为标记云的实际生成是.
本文描述了一种使用空格标记器创建文本字段以返回单个单词的方法,然后对该字段执行方面搜索。我知道你可以设置面限制,所以在你的情况下,你只能得到前100名的结果。
发布于 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/A和3007WFP构建标记云。
然而,这一办法将:
includes实例,https://stackoverflow.com/questions/7318326
复制相似问题