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);
}