2011-09-06 50 views
6

亲爱的计算器社区:建立一个标签云使用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个问题:

  1. 我得到的所有文档中的术语,不仅仅是前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”)。

+0

具体是我们可以使用的功能性查询,为此目的? – Zasz

+0

元素出现在构面结果中。 – Zasz

回答

0

我想出了一个权宜之计:(IM调用每个Solr的文档“后”为例子的缘故)

有一个术语组件Solr中,其目的似乎是揭露所有的索引任何特定领域的条款。它主要用于实现自动完成等功能以及其他可以在术语级别运行的功能。它默认按频率排序 - 首先出现在该领域更频繁出现的术语。

我所做的是创建一个名为content_的动态字段,并根据类别为每个后置集在其自己的字段中编制索引。这意味着将会有数百个动态字段的实例,每个实例都包含一个后置集合,并且我可以使用该字段上的terms组件来获取该后置集合的TOP 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 

该解决方案之类的工作对我来说,如果需要,你可以很容易地平均每个职位创建一个字段也。我也有兴趣知道使用像这样的动态字段的含义:这会是一个问题吗?

这怎么是从佩奇和jPountz答案不同的是:

  1. 术语频率在“A”字计数或“一套文档的”,而不是文档的数量包含计数期限。
  2. 我可以从一个文档中得到最常见的术语,如果需要也可以从一组文档中获得。
  3. 我没有使用faceting,因为它主要根据文档数量给出频率,而不是根据文档发生的次数而不考虑哪个文档。
+0

如果有更好的答案出现,我会高兴地标记他们是正确的,取消我的。 – Zasz

1

如果一个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的实例为includes领域,这需要内存UnInvertedField例如,
  • 计数的匹配项,而不是出现的总次数哪些文件数量这个术语。
+0

嘿,我试过你说我有奇怪的结果,我编辑了我的问题 – Zasz

5

这是一篇介绍设置标签云的文章 - Creating a Tag Cloud with Solr and PHP。虽然PHP部分可能并不适用于您,实际发电标签云,我相信是的......

这篇文章描述了一个空白标记生成器返回单个单词创建一个文本字段,然后执行的方法方面搜索这个领域。我知道你可以设置方面的限制,所以在你的情况下,你只能得到前100名的结果。

+0

我确实看过这篇文章,并且完成了那里所说的内容 - 这基本上是在我的领域做了一个包含内容的领域,我可以没有获得TOP X的频繁条款,而是我得到了我在问题 – Zasz

+0

中粘贴的结果根据您在尝试我的答案之后添加的信息以及@jpountz中的信息。您将需要执行两个单独的查询。 1.用正在搜索的文档来显示。 (不指定选项)2。方面只查询您在所有文档中进行搜索的位置,并从facet结果构建标签云。 –

+0

我只是从一个文档,一个领域的内容创建一个云! - 对于点编号1 =我不需要编写这样的查询,因为我知道要为其创建云的文档的标识。对于第2点如果我将所有文档分开,我会在所有文档中获得最高频率的术语,这意味着TOPMOST术语可以在任何文档中,因为我们使用q = *:*!我需要在我的ONE文档中使用最高频率的术语,而且我知道,谁的内容将成为云端。 – Zasz