Project: finder, src: TrMatrix.cc
転置インデックスの構成およびファイルへの登録を行う
#include "TrMatrix.h"
#include <cstdlib>
void TrMatrix::save2BPTree(BPTree &bptree) {
for (std::unordered_map<NGram, DocumentList, NGram>::const_iterator i = matrix.begin(); i != matrix.end(); ++i) {
bptree.append((*i).first, (*i).second);
}
}
void TrMatrix::analyze(unsigned long long id, const char *utf8, int len8) {
// UCS4 に変換
int len4;
UCS4 *ucs4 = ucs4FromUtf8(utf8, len8, &len4);
if (ucs4 == 0 || len4 < NGRAM_SIZE) {
// 長さが足りない時は登録しない
if (ucs4) free(ucs4);
return;
}
// 1文字ずつずらしながら仮登録する
std::unordered_map<NGram, Document, NGram> work;
for (int i = 0; i < len4 - NGRAM_SIZE + 1; ++i) {
NGram key(ucs4 + i);
std::unordered_map<NGram, Document, NGram>::iterator itr = work.find(key);
if (itr == work.end()) {
// 新規のキー
Document doc(id);
doc.add(i);
work[key] = doc;
} else {
// 既存のキー
(*itr).second.add(i);
}
}
// 転置行列に登録する
for (std::unordered_map<NGram, Document, NGram>::const_iterator j = work.begin(); j != work.end(); ++j) {
std::unordered_map<NGram, DocumentList, NGram>::iterator itr = matrix.find((*j).first);
if (itr == matrix.end()) {
// 新規のキー
DocumentList doclist;
doclist.push_back((*j).second);
matrix[(*j).first] = doclist;
} else {
(*itr).second.push_back((*j).second);
}
}
free(ucs4);
}