我正在开发一个使用 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 倒排索引以便在搜索时加载它?目前,我使用 boost 来序列化索引:
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
对于倒排索引是否足够有效。- 为了对文档进行聚类,我从每个文档中获取所有关键字,然后循环遍历这些关键字以对相似的文档进行评分,但我想避免再次阅读每个文档并仅使用此倒排索引。但我认为这种数据结构会很昂贵。
预先感谢您的任何帮助!