亲爱的计算器社区:建立一个标签云使用Solr
鉴于一些文字,我希望得到的前50个高频词在文中,并创建一个标签云出来,从而表现出的要点以图形方式说明文本的内容。
的文本实际上是一组100条左右的评论PER每个项目(图片)大约有120项,而且我也想保持更新云 - 通过保持注释索引,并使用云代码每次运行时都会运行新的Web请求。
我决定使用Solr来索引文本,现在想知道如何获得Solr TermsVectorComponant中的前50个单词。下面是该条款矢量componant返回的结果的一个例子,你打开后词频说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>
正如你可以看到我有2个问题:
- 我得到的所有文档中的术语,不仅仅是前100个,而且它们不是按频率排序的,所以我必须得到条件并在内存中对它进行排序才能完成即将尝试的操作。
有没有更好的方法? (或)我可以告诉solr termvector组件以某种方式对其进行排序并仅为我提取100个? (或)有没有其他的框架可以使用?我需要保留新的评论,因为标签云始终是最新的 - 对于云生成器,它需要一个加权词的词典,并将它制作成一个很好的图像。
This答案没有帮助。
编辑 - 尝试jpountz &佩奇库克的回答
这里是我得到了这个查询的结果:
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感谢帮助限制结果,但为什么ALL FIFTY的个人<int>
元素保持价值?我的想法是:数字1代表了匹配我的查询(只能是一个,因为我查询的编号:GUID)的文件的数量,并不代表在Post_Content
单词的频率为了证明这一点,我删除编号:从查询结果和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,“bootable”),(5,“disc”)。
具体是我们可以使用的功能性查询,为此目的? – Zasz