Как узнать частоту использования терминов из нескольких слов в Lucene?

Я использую Lucene, чтобы получить частоту терминов в документах, то есть количество вхождений некоторых терминов в каждом документе. Я использую IndexReader.termDocs () для этой цели, и он отлично работает для однословных терминов, но поскольку все слова хранятся в индексе отдельно, он не работает для многословных терминов.

Пример (взят из этого вопроса): I ' m интересует частота употребления термина «баскетбольный мяч» (или даже «баскетбольный мяч»), но после токенизации будут два слова, и я смогу получить частоту употребления термина «корзина» и термина «мяч», но не от термина "баскетбол".

Я знаю все многословные термины, для которых я хочу получить частоту, также меня не интересует сохранение исходного текста - только для получения статистики. Итак, мой первый подход заключался в том, чтобы просто объединить слова в термин . Например, «Я вчера играл в баскетбол » превращается в «Я вчера играл в баскетбол » и «Мой любимый писатель Курт Воннегут » превращается в «Мой любимый писатель ] Курт Воннегут ". Этот работает: составные термины рассматриваются как любое другое отдельное слово, поэтому я легко могу определить частоту. Но этот метод некрасивый и, что более важно, очень медленный. Итак, я пришел к другому.

Мой второй подход состоит в том, чтобы написать специальный фильтр токенов , который будет захватывать токены и проверять, являются ли они частью заменяемых терминов (что-то вроде SynonymFilter из Lucene в действии ). В нашем случае, когда фильтр увидит слово «корзина», он прочитает еще один жетон, а если это «мяч», фильтр поместит один термин («баскетбол») вместо двух («корзина» и «мяч») в поток токенов вывода. Преимущество этого метода по сравнению с предыдущим заключается в том, что он ищет совпадения между полными словами и не просматривает полный текст на предмет подстрок. По факту, большинство жетонов будут иметь разную длину и поэтому будут отброшены, даже не проверяя соответствие какой-либо буквы в них. Но такой фильтр написать непросто, более того, я не уверен, что он будет достаточно быстрым, чтобы соответствовать моим потребностям.

Третий подход, о котором я могу думать, - это поиграть с позициями двух слов в тех же документах. Но, скорее всего, это потребует повторения TermDocs во время получения частотного времени, что стоит намного больше, чем время индексации.

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

Есть ли способ решить эту проблему?

Спасибо

5
задан Entretoize 15 February 2011 в 23:07
поделиться