Уважаемое сообщество 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 проблемы:
- Я получаю все термины в документе, для этого поля, а не только топ 100
- И они не сортируются по частоте, поэтому я должен получить термины и отсортировать их в памяти, чтобы сделать то, что япытаясь.
Есть ли лучший способ?(или) Могу ли я сказать компоненту 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, «диск») для набора документов.