@larsmansのコメントに部分的に同意します。実際には、あなたの質問はあなたが投稿した質問よりも実際に複雑かもしれません。
ただし、質問/問題を単純化すると、質問に対する答えはLuceneの実装の1つである可能性があります:Lucene(Java)、Lucene.Net(C#)、またはCLucene(C ++)。
あなたの質問のポイントに従う:
Luceneは、文字列トークナイザーを使用してポイント1を処理します(独自にカスタマイズまたは使用できます)。ポイント2では、StopFilterのようなTokenFilterを使用して、 Luceneが使用してはならないストップワード( "the"、 "a"、 "an" ...)のリストを読み取ることができます。ポイント3では、PorterStemFilterを使用できます。ポイント4は少し注意が必要ですが、カスタマイズされたTokenFilterを使用して実行できます。ポイント1から4は、アナライザーが担当する分析/トークン化フェーズで実行されます。
ポイント5に関しては、Luceneでフィールド付きのドキュメントを保存できます。ドキュメントには、任意の数のフィールドの組み合わせを含めることができます。したがって、すべてのテキストを連結したチャットルームごとに1つのドキュメントを作成し、ドキュメントの別のフィールドに、それが抽出されたチャットルームを参照させることができます。比較できるLuceneドキュメントの束ができあがります。そのため、現在のチャットルームを他のチャットルームと比較して、現在のチャットルームに似ているものを確認できます。
@larsmansが言ったように、必要なのがチャットロムを説明するための最良のキーワードのセットである場合、あなたのニーズは情報抽出/自動要約/トピックスポッティングタスクに近いです。ただし、解析/トークン化フェーズでは引き続きLuceneを使用できます。
* Javaドキュメントを参照しましたが、CLuceneとLucene.NetのAPIは非常に似ているため、違いを理解するのにそれほど問題はありません。