Как посчитать периодичность для набора документов? - PullRequest
6 голосов
/ 27 мая 2010

У меня есть Lucene-Index со следующими документами:

doc1 := { caldari, jita, shield, planet }
doc2 := { gallente, dodixie, armor, planet }
doc3 := { amarr, laser, armor, planet }
doc4 := { minmatar, rens, space }
doc5 := { jove, space, secret, planet }

, поэтому эти 5 документов используют 14 различных терминов:

[ caldari, jita, shield, planet, gallente, dodixie, armor, amarr, laser, minmatar, rens, jove, space, secret ]

частота каждого термина:

[ 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1 ]

для удобства чтения:

[ caldari:1, jita:1, shield:1, planet:4, gallente:1, dodixie:1, 
armor:2, amarr:1, laser:1, minmatar:1, rens:1, jove:1, space:2, secret:1 ]

Теперь я хочу узнать, как получить термин «вектор частоты» для набора документы?

например:

Set<Documents> docs := [ doc2, doc3 ]

termFrequencies = magicFunction(docs); 

System.out.pring( termFrequencies );

приведет к выводу:

[ caldari:0, jita:0, shield:0, planet:2, gallente:1, dodixie:1, 
armor:2, amarr:1, laser:1, minmatar:0, rens:0, jove:0, space:0, secret:0 ]

удалить все нули:

[ planet:2, gallente:1, dodixie:1, armor:2, amarr:1, laser:1 ]

Обратите внимание, что вектор результата содержит только термин частоты набора документы. НЕ общие частоты всего индекса! Термин «планета» присутствует 4 раза во всем индексе, но набор источников документов содержит только 2 раза.

Наивной реализацией было бы просто перебирать все документы в docs установить, создать карту и подсчитать каждый термин. Но мне нужно решение, которое также будет работать с размером набора документов 100 000 или 500 000.

Есть ли в Lucene функция, которую я могу использовать для получения этого термина-вектора? Если такой функции нет, как будет выглядеть структура данных? кто-то может создать во время индекса, чтобы получить такой термин вектор легко и быстро?

Я не эксперт по Lucene, поэтому извините, если решение очевидно или тривиально.

Возможно, стоит упомянуть: решение должно работать достаточно быстро для веб-приложения, применяемого к поисковым запросам клиентов.

Ответы [ 2 ]

5 голосов
/ 28 мая 2010

Зайдите сюда: http://lucene.apache.org/java/3_0_1/api/core/index.html и проверьте этот метод

org.apache.lucene.index.IndexReader.getTermFreqVectors(int docno);

вам нужно знать идентификатор документа. Это внутренний идентификатор lucene, и он обычно изменяется при каждом обновлении индекса (который удаляет :-)).

Я полагаю, что есть аналогичный метод для люцена 2.x.x

0 голосов
/ 27 мая 2010

Я не знаю, однако, Lucene; ваша наивная реализация будет масштабироваться при условии, что вы не читаете весь документ в память за один раз (то есть используете онлайн-анализатор). Текст на английском языке примерно на 83% избыточен, поэтому в вашем самом крупном документе будет карта с 85000 записей. Используйте одну карту на поток (и один поток на файл, объединенный в пул), и вы будете отлично масштабироваться.

Обновление: Если список терминов меняется не часто; Вы можете попытаться создать дерево поиска из символов в вашем списке терминов или создать идеальную хеш-функцию (http://www.gnu.org/software/gperf/) для ускорения анализа файла (сопоставление терминов поиска с целевыми строками). Возможно, просто большой HashMap будет выступи примерно так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...