Создание облака тегов с помощью Solr - PullRequest
6 голосов
/ 06 сентября 2011

Уважаемое сообщество stackoverflow:

Учитывая некоторый текст, я хочу получить ТОП-50 наиболее часто встречающихся слов в тексте, создать из него облако тегов и, таким образом, показать суть текста.примерно в графическом виде.

Текст на самом деле представляет собой набор из примерно 100 комментариев. В каждом пункте (изображении) есть около 120 элементов, и я также хочу сохранить облакообновленный - сохраняя индексированные комментарии и используя код генерации облака для запуска каждый раз, когда появляется новый веб-запрос.

Я остановился на использовании Solr для индексации текста, и теперь задаюсь вопросом, как получить TOP 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 для меня?(или) Есть ли какая-то другая структура, которую я могу использовать?Мне нужно, чтобы новые комментарии индексировались по мере их поступления, чтобы облако тегов всегда обновлялось - что касается генератора облаков, он берет словарь взвешенных слов и превращает его в красивое изображение.

Это ответ не помогает.

EDIT - проверка ответа jpountz & paige cook

Вот результат, который я получил для этого запроса:

    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, спасибо за помощь в ограничении результатов, НО почему ВСЕ ПЯТЬДЕСЯТ отдельных <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>

Моя проблема заключается в том, как получить частоту термина в документе, а не частоту документа многих терминов.Например, я точно знаю, что слово «загрузочный» было словом, которое я использовал 6 раз в Post_content, поэтому я хочу отсортировать пары как (6, «загрузочный»), (5, «диск») для набора документов.

Ответы [ 3 ]

5 голосов
/ 06 сентября 2011

Вот статья, в которой описывается настройка облака тегов - Создание облака тегов с помощью Solr и PHP . Хотя часть PHP может быть неприменима к вам, фактическое поколение облака тегов, которое я считаю ...

В этой статье описывается метод создания текстового поля с помощью токенайзера пробелов для возврата отдельных слов и последующего выполнения поиска фасетов по этому полю. Я знаю, что вы можете установить пределы фасетов, так что в вашем случае вы можете получить только первые 100 результатов.

1 голос
/ 06 сентября 2011

Если документ Lucene является комментарием, вы можете использовать для этого огранку.Например, следующий запрос 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.

Однако этот подход будет:

  • сделать Solr экземпляромэкземпляр UnInvertedField для поля includes, для которого требовалась память,
  • подсчитывает количество документов, соответствующих термину, вместо общего числа вхождений этого термина.
0 голосов
/ 08 сентября 2011

Я придумала решение STOPGAP: (я называю каждый документ solr «постом» для примера)

В Solr есть компонент термина, целью которого, как представляется, является раскрытие всехпроиндексированные условия любого данного поля.Он в основном используется для реализации таких функций, как автозаполнение и другие функции, которые работают на уровне терминов.И он по умолчанию отсортирован по частоте - в поле появляются более часто встречающиеся термины.

Я создал динамическое поле с именем content_ и проиндексировал каждый пост-набор в своем собственном поле.на основе категории.Это означает, что будут сотни экземпляров динамического поля, каждое из которых содержит один пост-набор, и я могу использовать компонент термина в этом поле, чтобы получить ТОП-УСЛОВИЯ для этого пост-набора.

Как изображение:

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. Я не использовал огранку, потому что она в основном дает частоту в терминах количества документов, а не в количестве случаев, когда слово встречалось независимо от того, какой документ.
...