Я частично согласен с комментарием @larsmans.Ваш вопрос на практике может действительно быть более сложным, чем вопрос, который вы разместили.
Однако, упрощая вопрос / проблему, я думаю, что ответ на ваш вопрос может быть одним из вариантов реализации Lucene: Lucene (Java), Lucene.Net (C #) или CLucene (C ++).
Следуя пунктам в вашем вопросе:
Luceneпозаботился бы о пункте 1, используя токенайзеры строк (вы можете настроить или использовать свой собственный).Для пункта 2 вы можете использовать TokenFilter подобно StopFilter , чтобы Lucene мог прочитать список стоп-слов ("the", "a", "an" ...), которые он не должениспользовать.Для пункта 3 вы можете использовать PorterStemFilter .Точка 4 немного сложнее, но ее можно выполнить с помощью настроенного TokenFilter .Пункты с 1 по 4 выполняются на этапе анализа / токенизации, за который отвечает Анализатор .
Что касается пункта 5, в Lucene вы можете хранить документы с полями.Документ может иметь произвольное количество и сочетание полей.Таким образом, вы можете создать один Документ для каждой комнаты чата со всем объединенным текстом, а другое поле документа будет ссылаться на комнату чата, из которой он был извлечен.Вы получите кучу документов Lucene, которые вы можете сравнить .Таким образом, вы можете сравнить свою текущую комнату чата с другими, чтобы увидеть, какая из них больше похожа на ту, в которой вы находитесь.
Если вам нужен только набор лучших ключевых слов для описания чата, ваши потребности ближе кизвлечение информации / автоматическое обобщение / определение темы, как сказал @larsmans.Но вы можете по-прежнему использовать Lucene для фазы синтаксического анализа / токенизации .
* Я ссылался на документы Java, но CLucene и Lucene.Net имеют очень похожие API, поэтому проблем не будетчтобы выяснить различия.