2011-09-06 70 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