TF-IDF とコサイン類似度を使用した小さな検索エンジンを開発しています。ページが追加されると、別のページで単語の頻度を維持するために逆索引を作成します。ストップワードとより一般的な単語、および複数形/動詞/などを削除します。ステミングされます。
私の逆インデックスは次のようになります。
map< string, map<int, float> > index
[
word_a => [ id_doc=>frequency, id_doc2=>frequency2, ... ],
word_b => [ id_doc->frequency, id_doc2=>frequency2, ... ],
...
]
このデータ構造を使用すると、 で idf の重みを取得できますword_a.size()
。クエリが与えられると、プログラムはキーワードをループし、ドキュメントにスコアを付けます。
データ構造がよくわからないので、質問は次のとおりです。
検索時にロードするために 500 Mo の転置インデックスを格納する方法は? 現在、ブーストを使用してインデックスをシリアル化しています。
ofstream ofs_index("index.sr", ios::binary); boost::archive::bynary_oarchive oa(ofs_index); oa << index;
そして、検索時にロードします。
ifstream ifs_index("index.sr", ios::binary); boost::archive::bynary_iarchive ia(ifs_index); ia >> index;
しかし、非常に遅く、読み込みに 10 秒ほどかかることもあります。
map
逆インデックスに対して十分に効率的かどうかはわかりません。- ドキュメントをクラスター化するために、各ドキュメントからすべてのキーワードを取得し、これらのキーワードをループして類似ドキュメントをスコアリングしますが、各ドキュメントを再度読み取ることは避け、この逆インデックスのみを使用したいと考えています。しかし、このデータ構造はコストがかかると思います。
助けてくれてありがとう!