【问题标题】:Building a tag cloud with solr使用 solr 构建标签云
【发布时间】:2011-11-11 05:04:30
【问题描述】:

尊敬的 stackoverflow 社区:

给定一些文本,我希望得到文本中最常用的 TOP 50 词,并从中创建一个标签云,从而以图形方式显示文本的要点。

文本实际上是一组 100 个左右的 cmets 每个 ITEM(一张图片)大约有 120 个项目,我还想保持云更新 - 通过保持 cmets 索引,并在每次出现新的 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>

如您所见,我有 2 个问题:

  1. 我获得了文档中针对该字段的所有术语,而不仅仅是前 100 个术语
  2. 而且它们没有按频率排序,所以我必须获取术语并在内存中对其进行排序以执行我正在尝试的操作。

有没有更好的方法? (或)我可以告诉 solr termvector 组件以某种方式对其进行排序并为我只提取 100 个吗? (或)我可以使用其他一些框架吗?我需要在新的 cmets 出现时对其进行索引,因此标签云始终是最新的 - 至于云生成器,它需要一个加权词字典,并将其变成一个漂亮的图像。

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 感谢您帮助限制结果,但是为什么所有 50 个单独的 &lt;int&gt; 元素都保持值 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>

我的问题是如何获取文档中的词频,而不是许多词的文档频率。例如,我知道 bootable 是我在 Post_content 中使用了 6 次的一个词,所以我想要对一组文档进行排序,如 (6,"bootable")、(5, "disc")。

【问题讨论】:

  • 具体来说是我们可以使用的功能查询吗?
  • 元素出现在构面结果中。

标签: java lucene solr visualization data-visualization


【解决方案1】:

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

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

【讨论】:

  • 我确实看过这篇文章并完成了那里所说的 - 这实际上是对包含内容的我的字段进行分面,我无法获得 TOP X 常用术语,而是得到我粘贴在问题中的结果
  • 根据您在尝试我的答案和来自@jpountz 的答案后添加的信息。您将需要执行两个单独的查询。 1. 使用您要搜索的文档来显示。 (未指定分面选项) 2. 仅分面查询,您可以在其中搜索所有文档 q=*:*&amp;facet=true &amp;facet.field=Post_Content&amp;facet.minCount=1&amp;facet.limit=50 并根据分面结果构建标签云。
  • 我正在创建一个仅包含一个文档、一个字段中的内容的云! - 对于点号 1 = 我不需要编写这样的查询,因为我知道要为其创建云的文档的 ID。对于第 2 点,如果我对所有文档进行分面,我将在所有文档中获得最常见的术语,这意味着当我们使用 q=*:*! 时,TOPMOST 术语可以在任何文档中!我需要我的 ONE 文档中的最高频率术语,我知道谁的 ID,以及谁的内容将成为云。
  • 感谢您的澄清。您将需要添加以下选项以获取构面项目的频率facet.method=fc 请参阅wiki.apache.org/solr/SolrFacetingOverview 了解更多详情
【解决方案2】:

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

但是,这种方法会:

  • 让 Solr 为需要内存的 includes 字段实例化一个 UnInvertedField 实例,
  • 计算与某个词匹配的文档数,而不是该词出现的总次数。

【讨论】:

  • 嘿我试过你说的我有奇怪的结果,我已经编辑了我的问题
【解决方案3】:

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

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

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

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

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

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

【讨论】:

  • 如果有更好的答案,我很乐意将其标记为正确,取消我的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多