From 28a198f33cc98cfafb2941cb42043a5c23d7ac69 Mon Sep 17 00:00:00 2001 From: rosequ Date: Tue, 5 Dec 2017 12:23:08 -0500 Subject: [PATCH] Update bridge (#87) (#89) * initial commit of the updated bridge * moved bridge file to the root * after CR1 * after CR2 --- sm_cnn/.gitignore | 6 +- sm_cnn/README.md | 155 ++-- sm_cnn/__init__.py | 0 {sm_modified_cnn => sm_cnn}/args.py | 0 sm_cnn/bridge.py | 225 ++---- {sm_modified_cnn => sm_cnn}/create_dataset.sh | 0 sm_cnn/experimental_settings.py | 160 ---- sm_cnn/main.py | 277 +++---- sm_cnn/model.py | 149 ++-- sm_cnn/nn-architecture.png | Bin 127951 -> 0 bytes .../overlap_features.py | 0 sm_cnn/requirements.txt | 9 +- sm_cnn/run_eval.sh | 9 - sm_cnn/train.py | 417 +++++----- {sm_modified_cnn => sm_cnn}/trec_dataset.py | 8 +- sm_cnn/trec_eval-8.0/Makefile | 141 ---- sm_cnn/trec_eval-8.0/README | 385 ---------- sm_cnn/trec_eval-8.0/buf.h | 13 - sm_cnn/trec_eval-8.0/buf_util.c | 86 --- sm_cnn/trec_eval-8.0/common.h | 31 - sm_cnn/trec_eval-8.0/error_msgs.c | 93 --- sm_cnn/trec_eval-8.0/form_trvec.c | 201 ----- sm_cnn/trec_eval-8.0/get_qrels.c | 169 ----- sm_cnn/trec_eval-8.0/get_top.c | 192 ----- sm_cnn/trec_eval-8.0/help.info | 264 ------- sm_cnn/trec_eval-8.0/measures.c | 282 ------- sm_cnn/trec_eval-8.0/print_meas.c | 336 --------- sm_cnn/trec_eval-8.0/smart_error.h | 24 - sm_cnn/trec_eval-8.0/sysfunc.h | 39 - sm_cnn/trec_eval-8.0/tr_vec.h | 21 - sm_cnn/trec_eval-8.0/trec_eval.c | 256 ------- sm_cnn/trec_eval-8.0/trec_eval.h | 353 --------- sm_cnn/trec_eval-8.0/trec_eval_help.c | 203 ----- sm_cnn/trec_eval-8.0/trvec_teval.c | 673 ----------------- sm_cnn/tutorial.ipynb | 714 ------------------ sm_cnn/utils.py | 179 ----- {sm_modified_cnn => sm_cnn}/wiki_dataset.py | 8 +- sm_modified_cnn/.gitignore | 6 - sm_modified_cnn/README.md | 149 ---- sm_modified_cnn/eval/gdeval.pl | 340 --------- sm_modified_cnn/eval/trec_eval.9.0.tar.gz | Bin 392737 -> 0 bytes sm_modified_cnn/evaluate.py | 24 - sm_modified_cnn/main.py | 105 --- sm_modified_cnn/model.py | 83 -- sm_modified_cnn/requirements.txt | 4 - sm_modified_cnn/train.py | 205 ----- sm_modified_cnn/utils.py | 31 - 47 files changed, 532 insertions(+), 6493 deletions(-) delete mode 100644 sm_cnn/__init__.py rename {sm_modified_cnn => sm_cnn}/args.py (100%) rename {sm_modified_cnn => sm_cnn}/create_dataset.sh (100%) delete mode 100644 sm_cnn/experimental_settings.py delete mode 100644 sm_cnn/nn-architecture.png rename {sm_modified_cnn => sm_cnn}/overlap_features.py (100%) delete mode 100755 sm_cnn/run_eval.sh rename {sm_modified_cnn => sm_cnn}/trec_dataset.py (67%) delete mode 100755 sm_cnn/trec_eval-8.0/Makefile delete mode 100755 sm_cnn/trec_eval-8.0/README delete mode 100755 sm_cnn/trec_eval-8.0/buf.h delete mode 100755 sm_cnn/trec_eval-8.0/buf_util.c delete mode 100755 sm_cnn/trec_eval-8.0/common.h delete mode 100755 sm_cnn/trec_eval-8.0/error_msgs.c delete mode 100755 sm_cnn/trec_eval-8.0/form_trvec.c delete mode 100755 sm_cnn/trec_eval-8.0/get_qrels.c delete mode 100755 sm_cnn/trec_eval-8.0/get_top.c delete mode 100755 sm_cnn/trec_eval-8.0/help.info delete mode 100755 sm_cnn/trec_eval-8.0/measures.c delete mode 100755 sm_cnn/trec_eval-8.0/print_meas.c delete mode 100755 sm_cnn/trec_eval-8.0/smart_error.h delete mode 100755 sm_cnn/trec_eval-8.0/sysfunc.h delete mode 100755 sm_cnn/trec_eval-8.0/tr_vec.h delete mode 100755 sm_cnn/trec_eval-8.0/trec_eval.c delete mode 100755 sm_cnn/trec_eval-8.0/trec_eval.h delete mode 100755 sm_cnn/trec_eval-8.0/trec_eval_help.c delete mode 100755 sm_cnn/trec_eval-8.0/trvec_teval.c delete mode 100644 sm_cnn/tutorial.ipynb delete mode 100644 sm_cnn/utils.py rename {sm_modified_cnn => sm_cnn}/wiki_dataset.py (67%) delete mode 100644 sm_modified_cnn/.gitignore delete mode 100644 sm_modified_cnn/README.md delete mode 100755 sm_modified_cnn/eval/gdeval.pl delete mode 100644 sm_modified_cnn/eval/trec_eval.9.0.tar.gz delete mode 100644 sm_modified_cnn/evaluate.py delete mode 100644 sm_modified_cnn/main.py delete mode 100644 sm_modified_cnn/model.py delete mode 100644 sm_modified_cnn/requirements.txt delete mode 100644 sm_modified_cnn/train.py delete mode 100644 sm_modified_cnn/utils.py diff --git a/sm_cnn/.gitignore b/sm_cnn/.gitignore index 85d6be8..edd6884 100644 --- a/sm_cnn/.gitignore +++ b/sm_cnn/.gitignore @@ -1,5 +1,5 @@ *pyc -trec_eval-8.0/trec_eval -data/ +*.pt +text/ trained_models/ -trec_eval-8.0/trec_eval.dSYM +data/ diff --git a/sm_cnn/README.md b/sm_cnn/README.md index 49b69e0..c416852 100644 --- a/sm_cnn/README.md +++ b/sm_cnn/README.md @@ -1,80 +1,127 @@ ## SM model #### References: -1. Aliaksei _S_everyn and Alessandro _M_oschitti. 2015. Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks. In Proceedings of the 38th International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR '15). ACM, New York, NY, USA, 373-382. DOI: http://dx.doi.org/10.1145/2766462.2767738 +1. Aliaksei _S_everyn and Alessandro _M_oschitti. 2015. Learning to Rank Short Text Pairs with Convolutional Deep Neural +Networks. In Proceedings of the 38th International ACM SIGIR Conference on Research and Development in Information +Retrieval (SIGIR '15). ACM, New York, NY, USA, 373-382. DOI: http://dx.doi.org/10.1145/2766462.2767738 -### Requirements -gensim==1.0.1 -nltk==3.2.2 -numpy==1.11.3 -pandas==0.19.2 -torch==0.1.11+b13b701 - -Please install the requirements. See [Castor/README.md](../README.md) for pytorch installation details. - -### Training the model - -1. Setup repository layout. - -``` -mkdir castorini -cd castorini +### Setup +Clone and create the dataset: +```bash git clone https://github.com/castorini/data.git -git clone https://github.com/castorini/models.git git clone https://github.com/castorini/Castor.git ``` -This should generate: +You should you see the following tree: ``` +. ├── Castor │   ├── README.md +│   ├── baseline_results.tsv │   ├── idf_baseline │   ├── kim_cnn -│   ├── simple_qa_rnn -│   └── sm_cnn/ -├── data -│   ├── README.md -│   ├── TrecQA/ -│   └── word2vec/ -└── models +│   ├── mp_cnn +│   ├── setup.py +│   ├── sm_cnn +└── data + ├── GloVe + ├── ParagramEmbeddings ├── README.md - └── sm_cnn/ + ├── SimpleQuestions_v2 + ├── TrecQA + ├── WikiQA + ├── msrvid + ├── requirements.txt + ├── sick + ├── twitterPPDB + ├── utils + └── word2vec ``` -2. Preprocess data - -``` -cd data/TrecQA -python3 parse.py -python3 overlap_features.py -python3 build_vocab.py -``` - -3. Download word embeddings from [here](https://drive.google.com/folderview?id=0B-yipfgecoSBfkZlY2FFWEpDR3M4Qkw5U055MWJrenE5MTBFVXlpRnd0QjZaMDQxejh1cWs&usp=sharing) and save the ``aquaint+wiki.txt.gz.ndim=50.bin`` into ``data/word2vec/``. - - -4. Train the model - -Make trec_eval - -``` +To create the dataset: +```bash cd Castor/sm_cnn/ -cd trec_eval-8.0 -make clean && make -cd .. +./create_dataset.sh ``` -To train the S&M model on TrecQA + +We use `trec_eval` for evaluation: + +```bash +cd ../utils/ +./get_trec_eval.sh ``` -python main.py ../../models/sm_model/sm_model.TrecQA.TRAIN-ALL.2017-04-02.castor --paper-ext-feats + +### Training +Download the word2vec model from [here] (https://drive.google.com/file/d/0B2u_nClt6NbzUmhOZU55eEo4QWM/view?usp=sharing) +and copy it to the `data/` folder. + +You can train the SM model for the 4 following configurations: +1. __random__ - the word embedddings are initialized randomly and are tuned during training +2. __static__ - the word embeddings are static (Severyn and Moschitti, SIGIR'15) +3. __non-static__ - the word embeddings are tuned during training +4. __multichannel__ - contains static and non-static channels for question and answer conv layers + +To train on GPU 0 with static configuration: + +```bash +python train.py --mode static --gpu 0 ``` -**To use the GPU, add `--cuda`.** -The final model will be saved to ```../../models/sm_model/sm_model.TrecQA.TRAIN-ALL.2017-04-02.castor``` +NB: pass `--no_cuda` to use CPU -_NOTE:_ On first run, the program will create a memory-mapped cache for word e mbeddings (943MB) in ``data/word2vec``. -The cache allows for faster loading of data in future runs. +The trained model will be save to: +``` +saves/static_best_model.pt +``` -Run ```python main.py -h``` for more default options. +### Testing the model +``` +python main.py --trained_model saves/TREC/multichannel_best_model.pt +``` + +### Evaluation + +The performance on TrecQA dataset: + +### TrecQA: + +#### Best dev +Metric |rand |static|non-static|multichannel +-------|------|------|----------|------------ +MAP |0.8096|0.8162|0.8387 | 0.8274 +MRR |0.8560|0.8918|0.9058 | 0.8818 + +#### Test +Metric |rand |static|non-static|multichannel +-------|-------|------|----------|------------ +MAP |0.7441 |0.7524|0.7688 |0.7641 +MRR |0.8172 |0.8012|0.8144 |0.8174 + +### WikiQA: + +#### Best dev +Metric |rand |static|non-static|multichannel +-------|------|------|----------|------------ +MAP |0.7109|0.7204|0.7049 | 0.7245 +MRR |0.7169|0.7234|0.7075 | 0.7259 + +#### Test +Metric |rand |static|non-static|multichannel +-------|-------|------|----------|------------ +MAP |0.6313 |0.6378|0.6455 |0.6476 +MRR |0.6522 |0.6542|0.6689 |0.6646 + +NB: The results on WikiQA are based on the SM model hyperparameters. + + +### To create your own word2vec.pt file + ++ Download word2vec from [here](https://drive.google.com/drive/u/0/folders/0B-yipfgecoSBfkZlY2FFWEpDR3M4Qkw5U055MWJrenE5MTBFVXlpRnd0QjZaMDQxejh1cWs) +to the `data/` folder + +```bash +python utils.py --input data/aquaint+wiki.txt.gz.ndim=50.bin +``` \ No newline at end of file diff --git a/sm_cnn/__init__.py b/sm_cnn/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/sm_modified_cnn/args.py b/sm_cnn/args.py similarity index 100% rename from sm_modified_cnn/args.py rename to sm_cnn/args.py diff --git a/sm_cnn/bridge.py b/sm_cnn/bridge.py index 0c836ab..c6e48de 100644 --- a/sm_cnn/bridge.py +++ b/sm_cnn/bridge.py @@ -3,117 +3,75 @@ import os import sys from collections import Counter import argparse +import random -import re -import string import numpy as np import torch from nltk.tokenize import TreebankWordTokenizer -from torch.autograd import Variable -from py4j.java_gateway import JavaGateway +from torchtext import data from sm_cnn import model from sm_cnn.external_features import compute_overlap, compute_idf_weighted_overlap, stopped +from sm_cnn.trec_dataset import TrecDataset +from sm_cnn.wiki_dataset import WikiDataset +from anserini_dependency.RetrieveSentences import RetrieveSentences sys.modules['model'] = model - class SMModelBridge(object): - def __init__(self, model_file, word_embeddings_cache_file, index_path): - # init torch random seeds - torch.manual_seed(1234) - np.random.seed(1234) + def __init__(self, args): + if not args.cuda: + args.gpu = -1 + if torch.cuda.is_available() and args.cuda: + print("Note: You are using GPU for training") + torch.cuda.set_device(args.gpu) + torch.cuda.manual_seed(args.seed) + if torch.cuda.is_available() and not args.cuda: + print("Warning: You have Cuda but do not use it. You are using CPU for training") - # load model - self.model = model.QAModel.load(model_file) - self.model_file = model_file + torch.manual_seed(args.seed) + np.random.seed(args.seed) + random.seed(args.seed) - # load vectors - self.vec_dim = self._preload_cached_embeddings(word_embeddings_cache_file) - self.unk_term_vec = np.random.uniform(-0.25, 0.25, self.vec_dim) - - self.index = index_path + self.QID = data.Field(sequential=False) + self.QUESTION = data.Field(batch_first=True) + self.ANSWER = data.Field(batch_first=True) + self.LABEL = data.Field(sequential=False) + self.EXTERNAL = data.Field(sequential=False, tensor_type=torch.FloatTensor, batch_first=True, use_vocab=False, + preprocessing=data.Pipeline(lambda arr, _, train: [float(y) for y in arr])) - def _preload_cached_embeddings(self, cache_file): + if 'TrecQA' in args.dataset: + train, dev, test = TrecDataset.splits(self.QID, self.QUESTION, self.ANSWER, self.EXTERNAL, self.LABEL) + elif 'WikiQA' in args.dataset: + train, dev, test = WikiDataset.splits(self.QID, self.QUESTION, self.ANSWER, self.EXTERNAL, self.LABEL) + else: + print("Unsupported dataset") + exit() - with open(cache_file + '.dimensions') as d: - vocab_size, vec_dim = [int(e) for e in d.read().strip().split()] + self.QID.build_vocab(train, dev, test) + self.QUESTION.build_vocab(train, dev, test) + self.ANSWER.build_vocab(train, dev, test) + self.LABEL.build_vocab(train, dev, test) + self.retrieveSentencesObj = RetrieveSentences(args) + self.idf_json = self.retrieveSentencesObj.getTermIdfJSON() - self.W = np.memmap(cache_file, dtype=np.double, shape=(vocab_size, vec_dim)) + if args.cuda: + self.model = torch.load(args.model, map_location=lambda storage, location: storage.cuda(args.gpu)) + else: + self.model = torch.load(args.model, map_location=lambda storage, location: storage) - with open(cache_file + '.vocab') as f: - w2v_vocab_list = map(str.strip, f.readlines()) - - self.vocab_dict = {w:k for k, w in enumerate(w2v_vocab_list)} - return vec_dim - - - def parse(self, sentence, flags): + def parse(self, sentence): s_toks = TreebankWordTokenizer().tokenize(sentence) sentence = ' '.join(s_toks).lower() - - # model_input_args = self.model_file.split('.') - # punctuation = model_input_args[-3].split('-')[1] - # dash_words = model_input_args[-2].split('_')[1] - - if flags["dash_words"] == "split": - def split_hyphenated_words(sentence): - rtokens = [] - for term in sentence.split(): - for t in term.split('-'): - if t: - rtokens.append(t) - return ' '.join(rtokens) - sentence = split_hyphenated_words(sentence) - - if flags["punctuation"] == "remove": - regex = re.compile('[{}]'.format(re.escape(string.punctuation))) - def remove_punctuation(sentence): - rtokens = [] - for term in sentence.split(): - for t in regex.sub(' ', term).strip().split(): - if t: - rtokens.append(t) - return ' '.join(rtokens) - sentence = remove_punctuation(sentence) - return sentence - - def make_input_matrix(self, sentence): - terms = sentence.strip().split()[:60] - # word_embeddings = torch.zeros(max_len, vec_dim).type(torch.DoubleTensor) - word_embeddings = torch.zeros(len(terms), self.vec_dim).type(torch.DoubleTensor) - for i in range(len(terms)): - word = terms[i] - if word not in self.vocab_dict: - emb = torch.from_numpy(self.unk_term_vec) - else: - emb = torch.from_numpy(self.W[self.vocab_dict[word]]) - word_embeddings[i] = emb - input_tensor = torch.zeros(1, self.vec_dim, len(terms)) - input_tensor[0] = torch.transpose(word_embeddings, 0, 1) - return input_tensor - - - def get_tensorized_inputs(self, batch_ques, batch_sents, batch_ext_feats): - assert(1 == len(batch_ques)) - tensorized_inputs = [] - for i in range(len(batch_ques)): - xq = Variable(self.make_input_matrix(batch_ques[i])) - xs = Variable(self.make_input_matrix(batch_sents[i])) - ext_feats = Variable(torch.FloatTensor(batch_ext_feats[i])) - ext_feats = torch.unsqueeze(ext_feats, 0) - tensorized_inputs.append((xq, xs, ext_feats)) - return tensorized_inputs - - def rerank_candidate_answers(self, question, answers, idf_json, flags): + def rerank_candidate_answers(self, question, answers): # run through the model scores_sentences = [] - question = self.parse(question, flags) - term_idfs = json.loads(idf_json) + question = self.parse(question) + term_idfs = json.loads(self.idf_json) term_idfs = dict((k, float(v)) for k, v in term_idfs.items()) for term in question.split(): @@ -121,7 +79,7 @@ class SMModelBridge(object): term_idfs[term] = 0.0 for answer in answers: - answer = self.parse(answer, flags) + answer = self.parse(answer) for term in answer.split(): if term not in term_idfs: term_idfs[term] = 0.0 @@ -132,73 +90,56 @@ class SMModelBridge(object): compute_overlap(stopped([question]), stopped([answer])) idf_weighted_overlap_no_stopwords =\ compute_idf_weighted_overlap(stopped([question]), stopped([answer]), term_idfs) - ext_feats = [np.array(feats) for feats in zip(overlap, idf_weighted_overlap,\ - overlap_no_stopwords, idf_weighted_overlap_no_stopwords)] + ext_feats = str(overlap[0]) + " " + str(idf_weighted_overlap[0]) + " " + \ + str(overlap_no_stopwords[0]) + " " + str(idf_weighted_overlap_no_stopwords[0]) - xq, xa, x_ext_feats = self.get_tensorized_inputs([question], [answer], \ - ext_feats)[0] - pred = self.model(xq, xa, x_ext_feats) - pred = torch.exp(pred) - scores_sentences.append((pred.data.squeeze()[1], answer)) + + fields = [('question', self.QUESTION), ('answer', self.ANSWER), ('ext_feat', self.EXTERNAL)] + example = data.Example.fromlist([question, answer, ext_feats], fields) + this_question = self.QUESTION.numericalize(self.QUESTION.pad([example.question]), args.gpu) + this_answer = self.ANSWER.numericalize(self.ANSWER.pad([example.answer]), args.gpu) + this_external = self.EXTERNAL.numericalize(self.EXTERNAL.pad([example.ext_feat]), args.gpu) + self.model.eval() + scores = self.model(this_question, this_answer, this_external) + scores_sentences.append((scores[:, 2].cpu().data.numpy(), answer)) return scores_sentences -def get_term_idf_json_list(index_path, sent_list): - gateway = JavaGateway() - index = gateway.jvm.java.lang.String(index_path) - pyserini = gateway.jvm.io.anserini.py4j.PyseriniEntryPoint() - pyserini.initializeWithIndex(index_path) - java_list = gateway.jvm.java.util.ArrayList() - - for l in sent_list: - java_list.add(l) - - json_object = pyserini.getTermIdfJSONs(java_list) - return json_object - if __name__ == "__main__": - ap = argparse.ArgumentParser(description="Bridge Demo. Produces scores in trec_eval format", + parser = argparse.ArgumentParser(description="Bridge Demo. Produces scores in trec_eval format", formatter_class=argparse.ArgumentDefaultsHelpFormatter) - ap.add_argument('model', help="the path to the saved model file") - ap.add_argument('--word-embeddings-cache', help="the embeddings 'cache' file",\ - default='../../data/word2vec/aquaint+wiki.txt.gz.ndim=50.cache') - ap.add_argument('index_path', help="the path to the source corpus index") - # ap.add_argument('--paper-ext-feats', action="store_true", \ - # help="external features as per the paper") - ap.add_argument('--dataset-folder', help="the QA dataset folder {TrecQA|WikiQA}", - default='../../data/TrecQA/') - ap.add_argument("--punctuation", choices=["keep", "remove"], default="keep") - ap.add_argument("--dash-words", choices=["keep", "split"], default="keep") + parser.add_argument('--model', help="the path to the saved model file") + parser.add_argument('--dataset', help="the QA dataset folder {TrecQA|WikiQA}", default='../../data/TrecQA/') + parser.add_argument("--index", help="Lucene index", required=True) + parser.add_argument("--embeddings", help="Path of the word2vec index", default="") + parser.add_argument("--topics", help="topics file", default="") + parser.add_argument("--query", help="a single query", default="where was newton born ?") + parser.add_argument("--hits", help="max number of hits to return", default=100) + parser.add_argument("--scorer", help="passage scores", default="Idf") + parser.add_argument("--k", help="top-k passages to be retrieved", default=1) + parser.add_argument('--no_cuda', action='store_false', help='do not use cuda', dest='cuda') + parser.add_argument('--gpu', type=int, default=0) # Use -1 for CPU + parser.add_argument('--seed', type=int, default=3435) - args = ap.parse_args() + args = parser.parse_args() - smmodel = SMModelBridge( - args.model, - args.word_embeddings_cache, - args.index_path - ) + if not args.cuda: + args.gpu = -1 + + smmodel = SMModelBridge(args) train_set, dev_set, test_set = 'train', 'dev', 'test' - if 'TrecQA' in args.dataset_folder: + if 'TrecQA' in args.dataset: train_set, dev_set, test_set = 'train-all', 'raw-dev', 'raw-test' - flags = { - "punctuation": args.punctuation, - "dash_words": args.dash_words - } - for split in [dev_set, test_set]: outfile = open('bridge.{}.scores'.format(split), 'w') - questions = [q.strip() for q in \ - open(os.path.join(args.dataset_folder, split, 'a.toks')).readlines()] - answers = [q.strip() for q in \ - open(os.path.join(args.dataset_folder, split, 'b.toks')).readlines()] - labels = [q.strip() for q in \ - open(os.path.join(args.dataset_folder, split, 'sim.txt')).readlines()] - qids = [q.strip() for q in \ - open(os.path.join(args.dataset_folder, split, 'id.txt')).readlines()] + questions = [q.strip() for q in open(os.path.join(args.dataset, split, 'a.toks')).readlines()] + answers = [q.strip() for q in open(os.path.join(args.dataset, split, 'b.toks')).readlines()] + labels = [q.strip() for q in open(os.path.join(args.dataset, split, 'sim.txt')).readlines()] + qids = [q.strip() for q in open(os.path.join(args.dataset, split, 'id.txt')).readlines()] qid_question = dict(zip(qids, questions)) q_counts = Counter(questions) @@ -207,23 +148,21 @@ if __name__ == "__main__": docid_counter = 0 all_questions_answers = questions + answers - idf_json = get_term_idf_json_list(args.index_path, all_questions_answers) - for qid, question in sorted(qid_question.items(), key=lambda x: float(x[0])): num_answers = q_counts[question] q_answers = answers[answers_offset: answers_offset + num_answers] answers_offset += num_answers - sentence_scores = smmodel.rerank_candidate_answers(question, q_answers, idf_json, flags) + sentence_scores = smmodel.rerank_candidate_answers(question, q_answers) for score, sentence in sentence_scores: print('{} Q0 {} 0 {} sm_cnn_bridge.{}.run'.format( qid, docid_counter, score, - os.path.basename(args.dataset_folder) + os.path.basename(args.dataset) ), file=outfile) docid_counter += 1 - if 'WikiQA' in args.dataset_folder: + if 'WikiQA' in args.dataset: docid_counter = 0 outfile.close() diff --git a/sm_modified_cnn/create_dataset.sh b/sm_cnn/create_dataset.sh similarity index 100% rename from sm_modified_cnn/create_dataset.sh rename to sm_cnn/create_dataset.sh diff --git a/sm_cnn/experimental_settings.py b/sm_cnn/experimental_settings.py deleted file mode 100644 index 77a4b8a..0000000 --- a/sm_cnn/experimental_settings.py +++ /dev/null @@ -1,160 +0,0 @@ -# The following 5 conditions vary -# idf_source, stopwords_and_stemming, punctuation, words-with-hyphens -import argparse -import itertools -import shlex -import subprocess - -class Setting(object): - def __init__(self, label, value_flag_map): - self.label = label - self.choice_flags = value_flag_map - - def get_settings(self): - return self.choice_flags.keys() - - def get_choice(self, setting): - return self.choice_flags[setting] - - def get_options(self): - options = [] - for key in self.choice_flags.keys(): - options.append("{}:{}".format(self.label, key)) - return options - -class Experiments(object): - def __init__(self, qa_dataset, word_embeddings_file): - self.settings = {} - self.combinations = [] - self.qa_data = qa_dataset - self.w2v_file = word_embeddings_file - #self.cmd_root = "python main.py --dataset_folder {} --word_vectors_file {} --run-name-prefix run --epochs 1 --num_conv_filters 5".format(self.qa_data, self.w2v_file) - self.cmd_root = "python main.py --dataset_folder {} --word_vectors_file {} --run-name-prefix run --paper-ext-feats".format(self.qa_data, self.w2v_file) - self.eval_cmd_root = "../../Anserini/eval/trec_eval.9.0/trec_eval -m map -m recip_rank -m bpref" - self.rbp_cmd_root = "rbp_eval" - - def add_setting(self, setting): - self.settings[setting.label] = setting - self._setup_combinations() - - - def _setup_combinations(self): - all_settings = [] - for setting in self.settings.values(): - all_settings.append(setting.get_options()) - - self.combinations = [] - for c in itertools.product(*all_settings): - self.combinations.append(c) - - def _run_cmd(self, cmd): - pargs = shlex.split(cmd) - p = subprocess.Popen(pargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE, \ - bufsize=1, universal_newlines=True) - pout, perr = p.communicate() - return pout, perr - - def _run_eval(self): - for split in ['raw-dev', 'raw-test']: - cmd = '{} {}/{}.qrel run.{}.smrun'.format(self.eval_cmd_root, - self.qa_data, split, split) - out, err = self._run_cmd(cmd) - print(split, '------' ) - # trec_eval scores - metrics = [] - scores = [] - for line in str(out).split('\n'): - if not line.strip().split(): continue - fields = line.strip().split() - metrics.append(fields[0]) - scores.append(fields[-1]) - - # rbp_eval scores - cmd = '{} {}/{}.qrel run.{}.smrun'.format(self.rbp_cmd_root, - self.qa_data, split, split) - out, err = self._run_cmd(cmd) - for line in str(out).split('\n'): - if not line.startswith('p= 0.50'): continue - metrics.append('rbp_p0.5') - scores.append(' '.join(line.strip().split()[-2:])) - - print('\t'.join(metrics)) - print('\t'.join(scores)) - - - def run(self, indices): - """ - runs a particular combination of settings - """ - for ci in indices: - combo = self.combinations[ci] - print(combo) - cmd_args = [] - # set model name - model_name = 'sm_cnn.' - for setting_choice in combo: - setting, choice = setting_choice.split(':') - model_name += '{}-{}.'.format(setting, choice) - cmd_args.append(self.settings[setting].choice_flags[choice]) - model_name += 'model' - cmd = '{} {} {}'.format(self.cmd_root, ' '.join(cmd_args), model_name) - print(cmd) - out, err = self._run_cmd(cmd) - with open(model_name + '.log', 'w') as lf: - print('---------- OUT ------------', file=lf) - print(out, file=lf) - print('---------- ERR ------------', file=lf) - print(err, file=lf) - self._run_eval() - - def run_all(self): - """ - runs all experiments - """ - pass - - def list_settings(self): - """ - lists all settings - """ - for c in enumerate(self.combinations): - print(c) - print("--run X Y Z to run combinations number X Y Z") - - -if __name__ == "__main__": - ap = argparse.ArgumentParser(description="Lists exerimental settings and runs experiments") - ap.add_argument("--list", help="lists all available experimental settings combinations", - action="store_true") - ap.add_argument("--run", help='runs experimenal setting combination NUMBER(s)', - nargs="+", type=int) - ap.add_argument("indexPath", help="required for some combination of experiments") - ap.add_argument('qa_data', help="path to the QA dataset", - choices=['../../data/TrecQA', '../../data/WikiQA']) - ap.add_argument('word_embeddings_file', help="the word embeddings file") - - args = ap.parse_args() - - experiments = Experiments(args.qa_data, args.word_embeddings_file) - - experiments.add_setting(Setting('idf_source', { - 'qa-data':'', - 'corpus-index': '--index-for-corpusIDF {}'.format(args.indexPath) - })) - - experiments.add_setting(Setting('punctuation', { - 'keep': '', - 'remove': '--stop-punct' - })) - - experiments.add_setting(Setting('dash_words', { - 'keep': '', - 'split': '--dash-split' - })) - - experiments.list_settings() - - if args.run: - experiments.run(args.run) - - diff --git a/sm_cnn/main.py b/sm_cnn/main.py index a36a921..f4bbf8f 100644 --- a/sm_cnn/main.py +++ b/sm_cnn/main.py @@ -1,23 +1,15 @@ -import argparse - -import os -import shlex -import subprocess -import sys - import numpy as np -import pandas as pd -import torch - -import utils -from external_features import stopped, stemmed, compute_idf_weighted_overlap, compute_overlap,\ - get_qadata_only_idf, set_external_features_as_per_paper,\ - set_external_features_as_per_paper_and_stem -from train import Trainer -from model import QAModel - -# logging setup +import random import logging + +import torch +from torchtext import data + +from args import get_args +from utils.relevancy_metrics import get_map_mrr +from trec_dataset import TrecDataset +from wiki_dataset import WikiDataset + logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) @@ -27,185 +19,86 @@ formatter = logging.Formatter('%(levelname)s - %(message)s') ch.setFormatter(formatter) logger.addHandler(ch) -def logargs(func): - def inner(*args, **kwargs): - logger.info('%s : %s %s' % (func.__name__, args, kwargs)) - return func(*args, **kwargs) - return inner +args = get_args() +config = args + +torch.manual_seed(args.seed) + +if not args.cuda: + args.gpu = -1 +if torch.cuda.is_available() and args.cuda: + logger.info("Note: You are using GPU for training") + torch.cuda.set_device(args.gpu) + torch.cuda.manual_seed(args.seed) +if torch.cuda.is_available() and not args.cuda: + logger.info("Warning: You have Cuda but do not use it. You are using CPU for training") +np.random.seed(args.seed) +random.seed(args.seed) + +QID = data.Field(sequential=False) +QUESTION = data.Field(batch_first=True) +ANSWER = data.Field(batch_first=True) +LABEL = data.Field(sequential=False) +EXTERNAL = data.Field(sequential=True, tensor_type=torch.FloatTensor, batch_first=True, use_vocab=False, + postprocessing=data.Pipeline(lambda arr, _, train: [float(y) for y in arr])) + +if config.dataset == 'TREC': + train, dev, test = TrecDataset.splits(QID, QUESTION, ANSWER, EXTERNAL, LABEL) +elif config.dataset == 'wiki': + train, dev, test = WikiDataset.splits(QID, QUESTION, ANSWER, EXTERNAL, LABEL) +else: + print("Unsupported dataset") + exit() + +QID.build_vocab(train, dev, test) +QUESTION.build_vocab(train, dev, test) +ANSWER.build_vocab(train, dev, test) +LABEL.build_vocab(train, dev, test) + +train_iter = data.Iterator(train, batch_size=args.batch_size, device=args.gpu, train=True, repeat=False, + sort=False, shuffle=True) +dev_iter = data.Iterator(dev, batch_size=args.batch_size, device=args.gpu, train=False, repeat=False, + sort=False, shuffle=False) +test_iter = data.Iterator(test, batch_size=args.batch_size, device=args.gpu, train=False, repeat=False, + sort=False, shuffle=False) + +config.target_class = len(LABEL.vocab) +config.questions_num = len(QUESTION.vocab) +config.answers_num = len(ANSWER.vocab) +print("Label dict:", LABEL.vocab.itos) + +if args.cuda: + model = torch.load(args.trained_model, map_location=lambda storage, location: storage.cuda(args.gpu)) +else: + model = torch.load(args.trained_model, map_location=lambda storage,location: storage) + +index2label = np.array(LABEL.vocab.itos) +index2qid = np.array(QID.vocab.itos) -def compute_map_mrr(dataset_folder, set_folder, test_scores, run_name_prefix=None): - # logger.info("Running trec_eval script...") - N = len(test_scores) +def predict(dataset, test_mode, dataset_iter): + model.eval() + dataset_iter.init_epoch() - qids_test, y_test = utils.get_test_qids_labels(dataset_folder, set_folder) + qids = [] + predictions = [] + labels = [] + for dev_batch_idx, dev_batch in enumerate(dataset_iter): + qid_array = index2qid[np.transpose(dev_batch.qid.cpu().data.numpy())] + true_label_array = index2label[np.transpose(dev_batch.label.cpu().data.numpy())] - # Call TrecEval code to calc MAP and MRR - df_submission = pd.DataFrame(index=np.arange(N), \ - columns=['qid', 'iter', 'docno', 'rank', 'sim', 'run_id']) - df_submission['qid'] = qids_test - df_submission['iter'] = 0 - df_submission['docno'] = np.arange(N) - df_submission['rank'] = 0 - df_submission['sim'] = test_scores - df_submission['run_id'] = 'smmodel' - df_submission.to_csv(os.path.join(dataset_folder, 'submission.txt'), \ - header=False, index=False, sep=' ') - if run_name_prefix: - df_submission.to_csv('{}.{}.smrun'.format(run_name_prefix, set_folder),\ - header=False, index=False, sep=" ") + scores = model(dev_batch.question, dev_batch.answer, dev_batch.ext_feat) + score_array = scores[:, 2].cpu().data.numpy() - df_gold = pd.DataFrame(index=np.arange(N), columns=['qid', 'iter', 'docno', 'rel']) - df_gold['qid'] = qids_test - df_gold['iter'] = 0 - df_gold['docno'] = np.arange(N) - df_gold['rel'] = y_test - df_gold.to_csv(os.path.join(args.dataset_folder, 'gold.txt'), header=False, index=False, sep=' ') + qids.extend(qid_array.tolist()) + predictions.extend(score_array.tolist()) + labels.extend(true_label_array.tolist()) - # subprocess.call("/bin/sh run_eval.sh '{}'".format(args.dataset_folder), shell=True) - pargs = shlex.split("/bin/sh run_eval.sh '{}'".format(dataset_folder)) - p = subprocess.Popen(pargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - pout, perr = p.communicate() + dev_map, dev_mrr = get_map_mrr(qids, predictions, labels) + logger.info("{} {}".format(dev_map, dev_mrr)) - lines = pout.split(b'\n') - map = float(lines[0].strip().split()[-1]) - mrr = float(lines[1].strip().split()[-1]) - return map, mrr +# Run the model on the dev set +predict(config.dataset, 'dev', dataset_iter=dev_iter) - -if __name__ == "__main__": - ap = argparse.ArgumentParser(description='pytorch port of the SM model', \ - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - ap.add_argument('model_outfile', help='file to save final model') - ap.add_argument('--word_vectors_file', \ - help='NOTE: a cache will be created for faster loading for word vectors',\ - default="../../data/word2vec/aquaint+wiki.txt.gz.ndim=50.bin") - ap.add_argument('--dataset_folder', help='directory containing train, dev, test sets', \ - default="../../data/TrecQA") - ap.add_argument('--classes', type=int, default=2) - # external features related arguments - ap.add_argument('--no-ext-feats', action="store_true", \ - help="will not include external features in the model") - ap.add_argument('--paper-ext-feats', action="store_true", default=True, \ - help="external features as per the paper") - ap.add_argument('--paper-ext-feats-stem', action="store_true", \ - help="external features as per the paper") - # system arguments - ap.add_argument('--cuda', action='store_true', help='use CUDA if available') - ap.add_argument('--num_threads', help="the number of simultaneous processes to run", \ - type=int, default=4) - # training arguments - ap.add_argument('--batch_size', type=int, default=1, help="training mini-batch size") - ap.add_argument('--filter_width', type=int, default=5, help="number of convolution channels") - ap.add_argument('--eta', help='Initial learning rate', default=0.001, type=float) - ap.add_argument('--mom', help='SGD Momentum', default=0.0, type=float) - ap.add_argument('--train', help='switches to train set', action="store_true") - # epoch related arguments - ap.add_argument('--epochs', type=int, default=25, help="number of training epochs") - ap.add_argument('--patience', type=int, default=5, \ - help="if there is no appreciable change in model after epochs, then stop") - # debugging arguments - ap.add_argument('--debug_single_batch', action="store_true", \ - help="will stop program after training 1 input batch") - ap.add_argument('--num_conv_filters', default=100, type=int, \ - help="the number of convolution channels (lesser is faster)") - ap.add_argument('--no_loss_reg', help="no loss regularization", action="store_true") - ap.add_argument('--test_on_each_epoch', action="store_true", \ - help='runs test on each epoch to track final performance') - ap.add_argument("--skip-training", help="will load pre-trained model", action="store_true") - ap.add_argument("--run-name-prefix", help="will output train|dev|test runs with provided prefix") - ap.add_argument("--stop-punct", help='removes punctuation', action="store_true") - ap.add_argument("--dash-split", help="split words containing hyphens", action="store_true") - ap.add_argument("--index-for-corpusIDF", help="fetches idf from Index. provide index path. will\ - generate a vocabFile") - ap.add_argument('--seed', help='Random seed', type=int, default=1234) - ap.add_argument('--nocudnn', help='Disable the CuDNN backend', action="store_true") - - args = ap.parse_args() - - torch.manual_seed(args.seed) - np.random.seed(args.seed) - if args.cuda and torch.cuda.is_available(): - torch.cuda.manual_seed(args.seed) - if args.nocudnn: - torch.backends.cudnn.enabled = False - - torch.set_num_threads(args.num_threads) - - train_set, dev_set, test_set = 'train-all', 'raw-dev', 'raw-test' - if args.train: - train_set, dev_set, test_set = 'train', 'clean-dev', 'clean-test' - - # cache word embeddings - cache_file = os.path.splitext(args.word_vectors_file)[0] + '.cache' - utils.cache_word_embeddings(args.word_vectors_file, cache_file) - - vocab_size, vec_dim = utils.load_embedding_dimensions(cache_file) - - # instantiate model - net = QAModel(vec_dim, args.filter_width, args.num_conv_filters, args.no_ext_feats, cuda=args.cuda) - - # initialize the trainer - trainer = Trainer(net, args.eta, args.mom, args.no_loss_reg, vec_dim, args.cuda) - logger.info("Loading input data...") - # load input data - trainer.load_input_data(args.dataset_folder, cache_file, train_set, dev_set, test_set) - logger.info("Setting up external features...") - # setup external features - # TODO: remember to update args.* in testing loop below - if args.paper_ext_feats: - logger.info("--paper-ext-feats") - ext_feats_for_splits = \ - set_external_features_as_per_paper(trainer, args.index_for_corpusIDF) - # ^^ we are saving the features to be used while testing at the end of training - elif args.paper_ext_feats_stem: - logger.info("--paper-ext-feats-stem") - ext_feats_for_splits = \ - set_external_features_as_per_paper_and_stem(trainer, args.index_for_corpusIDF) - - - if not args.skip_training: - best_map = 0.0 - best_model = 0 - - for i in range(args.epochs): - logger.info('------------- Training epoch {} --------------'.format(i+1)) - train_accuracy = trainer.train(train_set, args.batch_size, args.debug_single_batch) - if args.debug_single_batch: sys.exit(0) - - dev_scores = trainer.test(dev_set, args.batch_size) - - dev_map, dev_mrr = compute_map_mrr(args.dataset_folder, dev_set, dev_scores) - logger.info("------- MAP {}, MRR {}".format(dev_map, dev_mrr)) - - if dev_map - best_map > 1e-3: # new map is better than best map - best_model = i - best_map = dev_map - - QAModel.save(net, args.model_outfile) - logger.info('Achieved better dev_map ... saved model') - - if args.test_on_each_epoch: - test_scores = trainer.test(test_set, args.batch_size) - map, mrr = compute_map_mrr(args.dataset_folder, test_set, test_scores) - logger.info("------- MAP {}, MRR {}".format(map, mrr)) - - if (i - best_model) >= args.patience: - logger.warning('No improvement since the last {} epochs. Stopping training'\ - .format(i - best_model)) - break - - logger.info(' ------------ Training epochs completed! ------------') - logger.info('Best dev MAP in training phase = {:.4f}'.format(best_map)) - - trained_model = QAModel.load(args.model_outfile) - evaluator = Trainer(trained_model, args.eta, args.mom, args.no_loss_reg, vec_dim, args.cuda) - - for split in [test_set, dev_set]: - evaluator.load_input_data(args.dataset_folder, cache_file, None, None, split) - if args.paper_ext_feats or args.paper_ext_feats_stem: - evaluator.data_splits[split][-1] = ext_feats_for_splits[split] - #set_external_features_as_per_paper(evaluator) - split_scores = evaluator.test(split, args.batch_size) - map, mrr = compute_map_mrr(args.dataset_folder, split, split_scores, args.run_name_prefix) - logger.info("-------{} MAP {}, MRR {}".format(split, map, mrr)) +# Run the model on the test set +predict(config.dataset, 'test', dataset_iter=test_iter) diff --git a/sm_cnn/model.py b/sm_cnn/model.py index 3fe3755..42085ea 100644 --- a/sm_cnn/model.py +++ b/sm_cnn/model.py @@ -1,92 +1,79 @@ import torch import torch.nn as nn + import torch.nn.functional as F -# logging setup -import logging -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) +class SmPlusPlus(nn.Module): + def __init__(self, config): + super(SmPlusPlus, self).__init__() + output_channel = config.output_channel + questions_num = config.questions_num + answers_num = config.answers_num + words_dim = config.words_dim + filter_width = config.filter_width + self.mode = config.mode -ch = logging.StreamHandler() -ch.setLevel(logging.DEBUG) -formatter = logging.Formatter('%(levelname)s - %(message)s') -ch.setFormatter(formatter) -logger.addHandler(ch) + n_classes = config.target_class + ext_feats_size = 4 - -class QAModel(nn.Module): - - @staticmethod - def save(model, model_fname): - torch.save(model, model_fname) - - - @staticmethod - def load(model_fname): - return torch.load(model_fname) - - - def __init__(self, input_n_dim, filter_width, \ - conv_filters=100, no_ext_feats=False, ext_feats_size=4, n_classes=2, cuda=False): - super(QAModel, self).__init__() - - self.no_ext_feats = no_ext_feats - - self.conv_channels = conv_filters - n_hidden = 2*self.conv_channels + (0 if no_ext_feats else ext_feats_size) - - self.conv_q = nn.Sequential( - nn.Conv1d(input_n_dim, self.conv_channels, filter_width, padding=filter_width-1), - nn.Tanh() - ) - - self.conv_a = nn.Sequential( - nn.Conv1d(input_n_dim, self.conv_channels, filter_width, padding=filter_width-1), - nn.Tanh() - ) - - self.combined_feature_vector = nn.Linear(2*self.conv_channels + \ - (0 if no_ext_feats else ext_feats_size), n_hidden) - - self.combined_features_activation = nn.Tanh() - self.dropout = nn.Dropout(0.5) - self.hidden = nn.Linear(n_hidden, n_classes) - self.logsoftmax = nn.LogSoftmax() - - if cuda and torch.cuda.is_available(): - self.conv_q, self.conv_a = self.conv_q.cuda(), self.conv_a.cuda() - self.combined_feature_vector = self.combined_feature_vector.cuda() - self.combined_features_activation = self.combined_features_activation.cuda() - self.dropout, self.hidden, self.logsoftmax = self.dropout.cuda(), self.hidden.cuda(), self.logsoftmax.cuda() - - def forward(self, question, answer, ext_feats): - - q = self.conv_q.forward(question) - q = F.max_pool1d(q, q.size()[2]) - q = q.view(-1, self.conv_channels) - # logger.debug('forward q: {}'.format(q)) - - a = self.conv_a.forward(answer) - a = F.max_pool1d(a, a.size()[2]) - a = a.view(-1, self.conv_channels) - - x = None - if self.no_ext_feats: - x = torch.cat([q, a], 1) - # logger.debug('no_ext_feats') + if self.mode == 'multichannel': + input_channel = 2 else: - x = torch.cat([q, a, ext_feats], 1) - # logger.debug('with ext_feats') + input_channel = 1 - # logger.debug('featvec x: {}'.format(x)) - # logger.debug(x.creator) + self.question_embed = nn.Embedding(questions_num, words_dim) + self.answer_embed = nn.Embedding(answers_num, words_dim) + self.static_question_embed = nn.Embedding(questions_num, words_dim) + self.nonstatic_question_embed = nn.Embedding(questions_num, words_dim) + self.static_answer_embed = nn.Embedding(answers_num, words_dim) + self.nonstatic_answer_embed = nn.Embedding(answers_num, words_dim) + self.static_question_embed.weight.requires_grad = False + self.static_answer_embed.weight.requires_grad = False - x = self.combined_feature_vector.forward(x) - x = self.combined_features_activation.forward(x) + self.conv_q = nn.Conv2d(input_channel, output_channel, (filter_width, words_dim), padding=(filter_width - 1, 0)) + self.conv_a = nn.Conv2d(input_channel, output_channel, (filter_width, words_dim), padding=(filter_width - 1, 0)) + + self.dropout = nn.Dropout(config.dropout) + n_hidden = 2 * output_channel + ext_feats_size + + self.combined_feature_vector = nn.Linear(n_hidden, n_hidden) + self.hidden = nn.Linear(n_hidden, n_classes) + + def forward(self, x_question, x_answer, x_ext): + if self.mode == 'rand': + question = self.question_embed(x_question).unsqueeze(1) + answer = self.answer_embed(x_answer).unsqueeze(1) # (batch, sent_len, embed_dim) + x = [F.tanh(self.conv_q(question)).squeeze(3), F.tanh(self.conv_a(answer)).squeeze(3)] + x = [F.max_pool1d(i, i.size(2)).squeeze(2) for i in x] # max-over-time pooling + # actual SM model mode (Severyn & Moschitti, 2015) + elif self.mode == 'static': + question = self.static_question_embed(x_question).unsqueeze(1) + answer = self.static_answer_embed(x_answer).unsqueeze(1) # (batch, sent_len, embed_dim) + x = [F.tanh(self.conv_q(question)).squeeze(3), F.tanh(self.conv_a(answer)).squeeze(3)] + x = [F.max_pool1d(i, i.size(2)).squeeze(2) for i in x] # max-over-time pooling + elif self.mode == 'non-static': + question = self.nonstatic_question_embed(x_question).unsqueeze(1) + answer = self.nonstatic_answer_embed(x_answer).unsqueeze(1) # (batch, sent_len, embed_dim) + x = [F.tanh(self.conv_q(question)).squeeze(3), F.tanh(self.conv_a(answer)).squeeze(3)] + x = [F.max_pool1d(i, i.size(2)).squeeze(2) for i in x] # max-over-time pooling + elif self.mode == 'multichannel': + question_static = self.static_question_embed(x_question) + answer_static = self.static_answer_embed(x_answer) + question_nonstatic = self.nonstatic_question_embed(x_question) + answer_nonstatic = self.nonstatic_answer_embed(x_answer) + question = torch.stack([question_static, question_nonstatic], dim=1) + answer = torch.stack([answer_static, answer_nonstatic], dim=1) + x = [F.tanh(self.conv_q(question)).squeeze(3), F.tanh(self.conv_a(answer)).squeeze(3)] + x = [F.max_pool1d(i, i.size(2)).squeeze(2) for i in x] # max-over-time pooling + else: + print("Unsupported Mode") + exit() + + # append external features and feed to fc + x.append(x_ext) + x = torch.cat(x, 1) + + x = F.tanh(self.combined_feature_vector(x)) x = self.dropout(x) x = self.hidden(x) - x = self.logsoftmax(x) - - return x - - + return x \ No newline at end of file diff --git a/sm_cnn/nn-architecture.png b/sm_cnn/nn-architecture.png deleted file mode 100644 index 3734c858a2b6811d340fa4d465b7faa12c84248f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127951 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ǵ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 N>1Xod#iDv|{|~$JJ{kZ3 diff --git a/sm_modified_cnn/overlap_features.py b/sm_cnn/overlap_features.py similarity index 100% rename from sm_modified_cnn/overlap_features.py rename to sm_cnn/overlap_features.py diff --git a/sm_cnn/requirements.txt b/sm_cnn/requirements.txt index 20759b0..0c28e6b 100644 --- a/sm_cnn/requirements.txt +++ b/sm_cnn/requirements.txt @@ -1,5 +1,4 @@ -gensim==1.0.1 -nltk==3.2.1 -numpy==1.11.3 -pandas==0.19.2 -pytorch==0.1.12 +nltk==3.2.4 +numpy==1.13.1 +pytorch==0.2.0 +torchtext==0.2.0 diff --git a/sm_cnn/run_eval.sh b/sm_cnn/run_eval.sh deleted file mode 100755 index 21202d6..0000000 --- a/sm_cnn/run_eval.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/csh -f - -exp_dir=$1 -judgement=${exp_dir}/gold.txt -output=${exp_dir}/submission.txt - -./trec_eval-8.0/trec_eval -q -c ${judgement} ${output} > ${output}.treceval -tail -29 ${output}.treceval | grep -e 'map' -e 'recip_rank' -exit 0 diff --git a/sm_cnn/train.py b/sm_cnn/train.py index 4af588e..768cedc 100644 --- a/sm_cnn/train.py +++ b/sm_cnn/train.py @@ -1,261 +1,210 @@ import time - +import os import numpy as np +import random + import torch import torch.nn as nn -import torch.optim as optim -from torch.autograd import Variable +from torchtext import data -import utils +from args import get_args +from model import SmPlusPlus +from utils.relevancy_metrics import get_map_mrr +from trec_dataset import TrecDataset +from wiki_dataset import WikiDataset +from evaluate import evaluate -# logging setup -import logging -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) +args = get_args() +config = args -ch = logging.StreamHandler() -ch.setLevel(logging.DEBUG) -formatter = logging.Formatter('%(levelname)s - %(message)s') -ch.setFormatter(formatter) -logger.addHandler(ch) +torch.manual_seed(args.seed) + +def set_vectors(field, vector_path): + if os.path.isfile(vector_path): + stoi, vectors, dim = torch.load(vector_path) + field.vocab.vectors = torch.Tensor(len(field.vocab), dim) + + for i, token in enumerate(field.vocab.itos): + wv_index = stoi.get(token, None) + if wv_index is not None: + field.vocab.vectors[i] = vectors[wv_index] + else: + # initialize with U(-0.25, 0.25) vectors + field.vocab.vectors[i] = torch.FloatTensor(dim).uniform_(-0.25, 0.25) + else: + print("Error: Need word embedding pt file") + exit(1) + return field + +# Set default configuration in : args.py +args = get_args() +config = args + +# Set random seed for reproducibility +torch.manual_seed(args.seed) +torch.backends.cudnn.deterministic = True +if not args.cuda: + args.gpu = -1 +if torch.cuda.is_available() and args.cuda: + print("Note: You are using GPU for training") + torch.cuda.set_device(args.gpu) + torch.cuda.manual_seed(args.seed) +if torch.cuda.is_available() and not args.cuda: + print("You have Cuda but you're using CPU for training.") +np.random.seed(args.seed) +random.seed(args.seed) + +QID = data.Field(sequential=False) +QUESTION = data.Field(batch_first=True) +ANSWER = data.Field(batch_first=True) +LABEL = data.Field(sequential=False) +EXTERNAL = data.Field(sequential=True, tensor_type=torch.FloatTensor, batch_first=True, use_vocab=False, + postprocessing=data.Pipeline(lambda arr, _, train: [float(y) for y in arr])) + +if config.dataset == 'TREC': + train, dev, test = TrecDataset.splits(QID, QUESTION, ANSWER, EXTERNAL, LABEL) +elif config.dataset == 'wiki': + train, dev, test = WikiDataset.splits(QID, QUESTION, ANSWER, EXTERNAL, LABEL) +else: + print("Unsupported dataset") + exit() + +QID.build_vocab(train, dev, test) +QUESTION.build_vocab(train, dev, test) +ANSWER.build_vocab(train, dev, test) +LABEL.build_vocab(train, dev, test) -class Trainer(object): +QUESTION = set_vectors(QUESTION, args.vector_cache) +ANSWER = set_vectors(ANSWER, args.vector_cache) - def __init__(self, model, eta, mom, no_loss_reg, vec_dim, cuda=False): - # set the random seeds for every instance of trainer. - # needed to ensure reproduction of random word vectors for out of vocab terms - torch.manual_seed(1234) - np.random.seed(1234) - self.cuda = cuda - self.unk_term = np.random.uniform(-0.25, 0.25, vec_dim) +train_iter = data.Iterator(train, batch_size=args.batch_size, device=args.gpu, train=True, repeat=False, + sort=False, shuffle=True) +dev_iter = data.Iterator(dev, batch_size=args.batch_size, device=args.gpu, train=False, repeat=False, + sort=False, shuffle=False) +test_iter = data.Iterator(test, batch_size=args.batch_size, device=args.gpu, train=False, repeat=False, + sort=False, shuffle=False) - self.reg = 1e-5 - self.no_loss_reg = no_loss_reg - self.model = model - self.criterion = nn.CrossEntropyLoss() - #self.criterion = nn.NLLLoss() - self.optimizer = optim.SGD(self.model.parameters(), lr=eta, momentum=mom, \ - weight_decay=(0 if no_loss_reg else self.reg)) +config.target_class = len(LABEL.vocab) +config.questions_num = len(QUESTION.vocab) +config.answers_num = len(ANSWER.vocab) - self.data_splits = {} - self.embeddings = {} - self.vec_dim = vec_dim +print("Dataset {} Mode {}".format(args.dataset, args.mode)) +print("VOCAB num", len(QUESTION.vocab)) +print("LABEL.target_class:", len(LABEL.vocab)) +print("LABELS:", LABEL.vocab.itos) +print("Train instance", len(train)) +print("Dev instance", len(dev)) +print("Test instance", len(test)) + +if args.resume_snapshot: + if args.cuda: + model = torch.load(args.resume_snapshot, map_location=lambda storage, location: storage.cuda(args.gpu)) + else: + model = torch.load(args.resume_snapshot, map_location=lambda storage, location: storage) +else: + model = SmPlusPlus(config) + model.static_question_embed.weight.data.copy_(QUESTION.vocab.vectors) + model.nonstatic_question_embed.weight.data.copy_(QUESTION.vocab.vectors) + model.static_answer_embed.weight.data.copy_(ANSWER.vocab.vectors) + model.nonstatic_answer_embed.weight.data.copy_(ANSWER.vocab.vectors) + + if args.cuda: + model.cuda() + print("Shift model to GPU") - def load_input_data(self, dataset_root_folder, word_vectors_cache_file, \ - train_set_folder, dev_set_folder, test_set_folder, load_ext_feats=True): - for set_folder in [test_set_folder, dev_set_folder, train_set_folder]: - if set_folder: - questions, sentences, labels, maxlen_q, maxlen_s, vocab = \ - utils.read_in_dataset(dataset_root_folder, set_folder) +parameter = filter(lambda p: p.requires_grad, model.parameters()) - self.data_splits[set_folder] = [questions, sentences, labels, maxlen_q, maxlen_s] +# the SM model originally follows SGD but Adadelta is used here +optimizer = torch.optim.Adadelta(parameter, lr=args.lr, weight_decay=args.weight_decay) +criterion = nn.CrossEntropyLoss() +early_stop = False +best_dev_map = 0 +iterations = 0 +iters_not_improved = 0 +epoch = 0 +start = time.time() +header = ' Time Epoch Iteration Progress (%Epoch) Loss Dev/Loss Accuracy Dev/Accuracy' +dev_log_template = ' '.join('{:>6.0f},{:>5.0f},{:>9.0f},{:>5.0f}/{:<5.0f} {:>7.0f}%,{:>8.6f},{:8.6f},{:12.4f},{:12.4f}'.split(',')) +log_template = ' '.join('{:>6.0f},{:>5.0f},{:>9.0f},{:>5.0f}/{:<5.0f} {:>7.0f}%,{:>8.6f},{},{:12.4f},{}'.split(',')) +os.makedirs(args.save_path, exist_ok=True) +os.makedirs(os.path.join(args.save_path, args.dataset), exist_ok=True) +print(header) - default_ext_feats = [np.zeros(4)] * len(self.data_splits[set_folder][0]) - self.data_splits[set_folder].append(default_ext_feats) +index2label = np.array(LABEL.vocab.itos) +index2qid = np.array(QID.vocab.itos) +index2question = np.array(ANSWER.vocab.itos) - utils.load_cached_embeddings(word_vectors_cache_file, vocab, self.embeddings, - [] if "train" in set_folder else self.unk_term) +while True: + if early_stop: + print("Early Stopping. Epoch: {}, Best Dev Acc: {}".format(epoch, best_dev_map)) + break + epoch += 1 + train_iter.init_epoch() + n_correct, n_total = 0, 0 + for batch_idx, batch in enumerate(train_iter): + iterations += 1 + model.train(); optimizer.zero_grad() + scores = model(batch.question, batch.answer, batch.ext_feat) + n_correct += (torch.max(scores, 1)[1].view(batch.label.size()).data == batch.label.data).sum() + n_total += batch.batch_size + train_acc = 100. * n_correct / n_total - def regularize_loss(self, loss): - - flattened_params = [] - - for p in self.model.parameters(): - f = p.data.clone() - flattened_params.append(f.view(-1)) - - fp = torch.cat(flattened_params) - - loss = loss + 0.5 * self.reg * fp.norm() * fp.norm() - - # for p in self.model.parameters(): - # loss = loss + 0.5 * self.reg * p.norm() * p.norm() - - return loss - - - def _train(self, xq, xa, ext_feats, ys): - - self.optimizer.zero_grad() - output = self.model(xq, xa, ext_feats) - loss = self.criterion(output, ys) - # logger.debug('loss after criterion {}'.format(loss)) - - # NOTE: regularizing location 1 - if not self.no_loss_reg: - loss = self.regularize_loss(loss) - # logger.debug('loss after regularizing {}'.format(loss)) - + loss = criterion(scores, batch.label) loss.backward() + optimizer.step() - # logger.debug('AFTER backward') - #logger.debug('params {}'.format([p for p in self.model.parameters()])) - # logger.debug('params grads {}'.format([p.grad for p in self.model.parameters()])) + # Evaluate performance on validation set + if iterations % args.dev_every == 1: + # switch model into evaluation mode + model.eval() + dev_iter.init_epoch() + n_dev_correct = 0 + dev_losses = [] - # NOTE: regularizing location 2. It would seem that location 1 is correct? - #if not self.no_loss_reg: - # loss = self.regularize_loss(loss) - # logger.debug('loss after regularizing {}'.format(loss)) + qids = [] + predictions = [] + labels = [] + for dev_batch_idx, dev_batch in enumerate(dev_iter): + qid_array = index2qid[np.transpose(dev_batch.qid.cpu().data.numpy())] + true_label_array = index2label[np.transpose(dev_batch.label.cpu().data.numpy())] - self.optimizer.step() + scores = model(dev_batch.question, dev_batch.answer, dev_batch.ext_feat) + n_dev_correct += (torch.max(scores, 1)[1].view(dev_batch.label.size()).data == dev_batch.label.data).sum() + dev_loss = criterion(scores, dev_batch.label) + dev_losses.append(dev_loss.data[0]) + index_label = np.transpose(torch.max(scores, 1)[1].view(dev_batch.label.size()).cpu().data.numpy()) + label_array = index2label[index_label] + # get the relevance scores + score_array = scores[:, 2].cpu().data.numpy() - # logger.debug('AFTER step') - #logger.debug('params {}'.format([p for p in self.model.parameters()])) - # logger.debug('params grads {}'.format([p.grad for p in self.model.parameters()])) + qids.extend(qid_array.tolist()) + predictions.extend(score_array.tolist()) + labels.extend(true_label_array.tolist()) - return loss.data[0], self.pred_equals_y(output, ys) + dev_map, dev_mrr = get_map_mrr(qids, predictions, labels) + print(dev_log_template.format(time.time() - start, + epoch, iterations, 1 + batch_idx, len(train_iter), + 100. * (1 + batch_idx) / len(train_iter), loss.data[0], + sum(dev_losses) / len(dev_losses), train_acc, dev_map)) + # Update validation results + if dev_map > best_dev_map: + iters_not_improved = 0 + best_dev_map = dev_map + snapshot_path = os.path.join(args.save_path, args.dataset, args.mode+'_best_model.pt') + torch.save(model, snapshot_path) + else: + iters_not_improved += 1 + if iters_not_improved >= args.patience: + early_stop = True + break - def pred_equals_y(self, pred, y): - _, best = pred.max(1) - best = best.data.long().squeeze() - return torch.sum(y.data.long() == best) - - - def test(self, set_folder, batch_size): - logger.info('----- Predictions on {} '.format(set_folder)) - - questions, sentences, labels, maxlen_q, maxlen_s, ext_feats = \ - self.data_splits[set_folder] - word_vectors, vec_dim = self.embeddings, self.vec_dim - - self.model.eval() - - batch_size = 1 - - total_loss = 0.0 - total_correct = 0.0 - num_batches = np.ceil(len(questions)/batch_size) - y_pred = np.zeros(len(questions)) - ypc = 0 - - for k in range(int(num_batches)): - batch_start = k * batch_size - batch_end = (k+1) * batch_size - # convert raw questions and sentences to tensors - batch_inputs, batch_labels = self.get_tensorized_inputs( - questions[batch_start:batch_end], - sentences[batch_start:batch_end], - labels[batch_start:batch_end], - ext_feats[batch_start:batch_end], - word_vectors, vec_dim - ) - - xq, xa, x_ext_feats = batch_inputs[0] - y = batch_labels[0] - - pred = self.model(xq, xa, x_ext_feats) - loss = self.criterion(pred, y) - pred = torch.exp(pred) - total_loss += loss - # total_correct += self.pred_equals_y(pred, y) - - y_pred[ypc] = pred.data.squeeze()[1] - # ^ we want to score for relevance, NOT the predicted class - ypc += 1 - - # logger.info('{}_correct {}'.format(set_folder, total_correct)) - # logger.info('{}_loss {}'.format(set_folder, total_loss.data[0])) - logger.info('{} total {}'.format(set_folder, len(labels))) - # logger.info('{}_loss = {:.4f}, acc = {:.4f}'.format(set_folder, total_loss.data[0]/len(labels), float(total_correct)/len(labels)) - #logger.info('{}_loss = {:.4f}'.format(set_folder, total_loss.data[0]/len(labels))) - - return y_pred - - - def train(self, set_folder, batch_size, debug_single_batch): - train_start_time = time.time() - - questions, sentences, labels, maxlen_q, maxlen_s, ext_feats = \ - self.data_splits[set_folder] - word_vectors, vec_dim = self.embeddings, self.vec_dim - - # set model for training modep - self.model.train() - - train_loss, train_correct = 0., 0. - num_batches = np.ceil(len(questions)/float(batch_size)) - - for k in range(int(num_batches)): - batch_start = k * batch_size - batch_end = (k+1) * batch_size - - # convert raw questions and sentences to tensors - batch_inputs, batch_labels = self.get_tensorized_inputs( - questions[batch_start:batch_end], - sentences[batch_start:batch_end], - labels[batch_start:batch_end], - ext_feats[batch_start:batch_end], - word_vectors, vec_dim - ) - - xq, xa, x_ext_feats = batch_inputs[0] - - ys = batch_labels[0] - - batch_loss, batch_correct = self._train(xq, xa, x_ext_feats, ys) - - # logger.debug('batch_loss {}, batch_correct {}'.format(batch_loss, batch_correct)) - train_loss += batch_loss - # train_correct += batch_correct - if debug_single_batch: - break - - # logger.info('train_correct {}'.format(train_correct)) - logger.info('train_loss {}'.format(train_loss)) - logger.info('total training batches = {}'.format(num_batches)) - logger.info('train_loss = {:.4f}'.format( - train_loss/num_batches - )) - logger.info('training time = {:.3f} seconds'.format(time.time() - train_start_time)) - return train_correct/num_batches - - - def make_input_matrix(self, sentence, word_vectors, vec_dim): - terms = sentence.strip().split()[:60] - # NOTE: we are truncating the inputs to 60 words. - - word_embeddings = torch.zeros(len(terms), vec_dim).type(torch.DoubleTensor) - for i in range(len(terms)): - word = terms[i] - emb = torch.from_numpy(word_vectors[word]) - word_embeddings[i] = emb - - input_tensor = torch.zeros(1, vec_dim, len(terms)) - input_tensor[0] = torch.transpose(word_embeddings, 0, 1) - if self.cuda and torch.cuda.is_available(): - input_tensor = input_tensor.cuda() - return input_tensor - - - def get_tensorized_inputs(self, batch_ques, batch_sents, batch_labels, batch_ext_feats, \ - word_vectors, vec_dim): - batch_size = len(batch_ques) - # NOTE: ideal batch size is one, because sentences are all of different length. - # In other words, we have no option but to feed in sentences one by one into the model - # and compute loss at the end. - - # TODO: what if the sentences in a batch are all of different lengths? - # - should be have the longest sentence as 2nd dim? - # - would zero endings work for other smaller sentences? - - y = torch.LongTensor(batch_size).type(torch.LongTensor) - if self.cuda and torch.cuda.is_available(): - y = y.cuda() - - tensorized_inputs = [] - for i in range(len(batch_ques)): - xq = Variable(self.make_input_matrix(batch_ques[i], word_vectors, vec_dim)) - xs = Variable(self.make_input_matrix(batch_sents[i], word_vectors, vec_dim)) - ext_feats = torch.FloatTensor(batch_ext_feats[i]) - if self.cuda and torch.cuda.is_available(): - ext_feats = ext_feats.cuda() - ext_feats = Variable(ext_feats) - ext_feats = torch.unsqueeze(ext_feats, 0) - y[i] = batch_labels[i] - tensorized_inputs.append((xq, xs, ext_feats)) - - return tensorized_inputs, Variable(y) + if iterations % args.log_every == 1: + # print progress message + print(log_template.format(time.time() - start, + epoch, iterations, 1 + batch_idx, len(train_iter), + 100. * (1 + batch_idx) / len(train_iter), loss.data[0], ' ' * 8, + n_correct / n_total * 100, ' ' * 12)) diff --git a/sm_modified_cnn/trec_dataset.py b/sm_cnn/trec_dataset.py similarity index 67% rename from sm_modified_cnn/trec_dataset.py rename to sm_cnn/trec_dataset.py index 3621c49..9298475 100644 --- a/sm_modified_cnn/trec_dataset.py +++ b/sm_cnn/trec_dataset.py @@ -1,16 +1,14 @@ from torchtext import data -import os class TrecDataset(data.TabularDataset): dirname = 'data' @classmethod - def splits(cls, question_id, question_field, answer_field, external_field, label_field, - train='train.tsv', validation='dev.tsv', test='test.tsv'): + def splits(cls, question_id, question_field, answer_field, external_field, label_field, root='.data', + train='trecqa.train.tsv', validation='trecqa.dev.tsv', test='trecqa.test.tsv'): path = './data' - prefix_name = 'trecqa.' return super(TrecDataset, cls).splits( - os.path.join(path, prefix_name), train, validation, test, + path, root, train, validation, test, format='TSV', fields=[('qid', question_id), ('label', label_field), ('question', question_field), ('answer', answer_field), ('ext_feat', external_field)] ) diff --git a/sm_cnn/trec_eval-8.0/Makefile b/sm_cnn/trec_eval-8.0/Makefile deleted file mode 100755 index f58087b..0000000 --- a/sm_cnn/trec_eval-8.0/Makefile +++ /dev/null @@ -1,141 +0,0 @@ -BIN = /home/smart/bin -H = . - -VERSIONID = 8.0 - -# gcc -CC = gcc -CFLAGS = -g -I$H -O3 -Wall -DVERSIONID=\"$(VERSIONID)\" -CFLAGS = -g -I$H -Wall -DVERSIONID=\"$(VERSIONID)\" - -# cc -###CC = cc -###CFLAGS = -I$H -g -DVERSIONID=\"$(VERSIONID)\" - -# Other macros used in some or all makefiles -INSTALL = /bin/mv - - -OBJS = trec_eval.o get_qrels.o get_top.o form_trvec.o measures.o print_meas.o\ - trvec_teval.o buf_util.o error_msgs.o \ - trec_eval_help.o - - -SRCS = trec_eval.c get_qrels.c get_top.c form_trvec.c measures.c print_meas.c\ - trvec_teval.c buf_util.c error_msgs.c \ - trec_eval_help.c - -SRCH = common.h trec_eval.h smart_error.h sysfunc.h tr_vec.h buf.h - -SRCOTHER = README Makefile test bpref_bug - -trec_eval: $(SRCS) Makefile $(SRCH) - $(CC) $(CFLAGS) -o trec_eval $(SRCS) -lm - -install: $(BIN)/trec_eval - -quicktest: trec_eval - ./trec_eval test/qrels.test test/results.test | diff - test/out.test - ./trec_eval -a test/qrels.test test/results.test | diff - test/out.test.a - ./trec_eval -a -q test/qrels.test test/results.test | diff - test/out.test.aq - ./trec_eval -a -q -c test/qrels.test test/results.trunc | diff - test/out.test.aqc - ./trec_eval -a -q -c -M100 test/qrels.test test/results.trunc | diff - test/out.test.aqcM - /bin/echo "Test succeeeded" - -longtest: trec_eval - /bin/rm -rf test.long; mkdir test.long - ./trec_eval test/qrels.test test/results.test > test.long/out.test - ./trec_eval -a test/qrels.test test/results.test > test.long/out.test.a - ./trec_eval -a -q test/qrels.test test/results.test > test.long/out.test.aq - ./trec_eval -a -q -c test/qrels.test test/results.trunc > test.long/out.test.aqc - ./trec_eval -a -q -c -M100 test/qrels.test test/results.trunc > test.long/out.test.aqcM - diff test.long test - -$(BIN)/trec_eval: trec_eval - if [ -f $@ ]; then $(INSTALL) $@ $@.old; fi; - $(INSTALL) trec_eval $@ - -##4########################################################################## -##5########################################################################## -# All code below this line (except for automatically created dependencies) -# is independent of this particular makefile, and should not be changed! -############################################################################# - -######################################################################### -# Odds and ends # -######################################################################### -clean semiclean: - /bin/rm -f *.o *.BAK *~ trec_eval trec_eval.*.shar out.trec_eval Makefile.bak - -shar: - shar -X $(SRCOTHER) $(SRCS) $(SRCH) > trec_eval.$(VERSIONID).shar - -lint: - lint $(SRCS) - -######################################################################### -# Determining program dependencies # -######################################################################### -depend: - grep '^#[ ]*include' *.c \ - | sed -e 's?:[^"]*"\([^"]*\)".*?: \$H/\1?' \ - -e '/ makedep - echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep - echo '$$r makedep' >>eddep - echo 'w' >>eddep - cp Makefile Makefile.bak - ed - Makefile < eddep - /bin/rm eddep makedep - echo '# DEPENDENCIES MUST END AT END OF FILE' >> Makefile - echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> Makefile - echo '# see make depend above' >> Makefile - -# DO NOT DELETE THIS LINE -- make depend uses it - -buf_util.o: ./common.h -buf_util.o: ./sysfunc.h -buf_util.o: ./buf.h -error_msgs.o: ./smart_error.h -error_msgs.o: ./sysfunc.h -form_trvec.o: ./common.h -form_trvec.o: ./sysfunc.h -form_trvec.o: ./smart_error.h -form_trvec.o: ./tr_vec.h -form_trvec.o: ./trec_eval.h -form_trvec.o: ./buf.h -get_qrels.o: ./common.h -get_qrels.o: ./sysfunc.h -get_qrels.o: ./smart_error.h -get_qrels.o: ./trec_eval.h -get_top.o: ./common.h -get_top.o: ./sysfunc.h -get_top.o: ./smart_error.h -get_top.o: ./trec_eval.h -measures.o: ./common.h -measures.o: ./sysfunc.h -measures.o: ./buf.h -measures.o: ./trec_eval.h -print_meas.o: ./common.h -print_meas.o: ./sysfunc.h -print_meas.o: ./buf.h -print_meas.o: ./trec_eval.h -trec_eval.o: ./common.h -trec_eval.o: ./sysfunc.h -trec_eval.o: ./smart_error.h -trec_eval.o: ./tr_vec.h -trec_eval.o: ./trec_eval.h -trec_eval.o: ./buf.h -trec_eval_help.o: ./common.h -trvec_teval.o: ./common.h -trvec_teval.o: ./sysfunc.h -trvec_teval.o: ./smart_error.h -trvec_teval.o: ./tr_vec.h -trvec_teval.o: ./trec_eval.h -# DEPENDENCIES MUST END AT END OF FILE -# IF YOU PUT STUFF HERE IT WILL GO AWAY -# see make depend above diff --git a/sm_cnn/trec_eval-8.0/README b/sm_cnn/trec_eval-8.0/README deleted file mode 100755 index 6bc8722..0000000 --- a/sm_cnn/trec_eval-8.0/README +++ /dev/null @@ -1,385 +0,0 @@ -trec_eval is the standard tool used by the TREC community for -evaluating an ad hoc retrieval run, given the results file and a -standard set of judged results. - ------------------------------------------------------------------------------- -Installation: Should be as easy as typing "make" in the source directory, -if gcc is available. Otherwise, comment out the gcc lines (lines 5-6) and -uncomment out the cc lines (lines 9-10) -If you wish the trec_eval binary to be placed in a standard location, alter -the first line of Makefile appropriately. - ------------------------------------------------------------------------------- -Testing: sample input and output files are included in the directory test. -"make quicktest" will perform some sample simple evaluations and compare -the results. - ------------------------------------------------------------------------------- -Usage: Most options can be ignored. The only one most folks will need -is the "-q" flag, to indicate whether to output results for individual -queries as well as the averages over all queries. Official TREC usage -might be something like - trec_eval -q -c -M1000 official_qrels submitted_results -to ensure correct evaluation if submitted_results doesn't have results -for all queries, or returns more than 1000 documents per query. - - ------------------------------------------------------------------------------- -Change Log ------------------------------------------------------------------------------- -Version 8.0, full bpref bug fix, see file bpref_bug. I decided to up the - version number since bpref results are incompatible with previous - results (though the changes are small). - -11/8/05: Bpref_bug: New file explaining bug and impact (conclusions after - rerunning all of SIGIR 2004 bpref paper experiments). -11/5/05: Added new measures: micro_prec, micro_recall, micro_bpref. I thought - I had an application for micro_bpref averaging (summing components of - measure over all docs (ignoring topics) and then computing measure), - but micro_bpref still proved a rotten measure. Left code in case - someone ever actually finds an application for valid micro averaging. -11/5/05: Added new measures: old_bpref, old_bpref_top10pRnonrel. These are - the old buggy measures included only for backward comparisons. -11/5/05: trvec_teval.c: Broke apart old trvec_trec_eval to calculate - different types of measures separately. Very hard to decipher - old code (though still difficult with new code) since parts of - the calculations for a measure were so far apart. - ------------------------------------------------------------------------------- -Version 7.4, minor changes from 7.3 - -11/4/05: trvec_teval.c: fixed bpref bug if very low (< R) numbers of non-rel - judgements available (divided by num_nonrel_ret instead of - num_nonrel). (pointed out by Ian Soboroff). -11/3/05: trvec_teval.c: bpref_10, bpref_5 had zero division problems if - no rel docs were retrieved. (pointed out by Ian Soboroff). -10/23/05: form_trvec.c: Added check for duplicate docno's in results and qrels. - (pointed out by Shlomo Geva. Default behavior used to be that - duplicate result docno's were always non-rel, but that changed in - later versions, so had better test explicitly for it and complain). -10/23/05: README: sample invocation of trec_eval had arguments reversed. - (pointed out by Carol Peters). -10/23/05: moved gm_ap to be a major measure (always printed). changed - measures.c, test/out*, README - ------------------------------------------------------------------------------- - -Version 7.3, a reasonably major rewrite from earlier versions in terms -of internal structure and default output format (now relational), but -the input format and measures calculated remain the same (or at least -upward compatible). - ------------------------------------------------------------------------------- -end of ChangeLog ------------------------------------------------------------------------------- - -Adding measures: To add a new measure: - 1. Add space for the measure in TREC_EVAL structure of "trec_eval.h" - 2. Add description of measure in "measures.c". See "trec_eval.h" for - definition of the fields. This description is used for - printing, accumulating, and averaging the measure values. - 3. Calculate the measure in "trvec_teval.c". Unfortunately, this has - gotten very long over the years as more measures are added, but - most of it can be ignored. I should write a simple version of - just the "short" measures so the structure can be seen better. - ------------------------------------------------------------------------------- - -Files: -Makefile Compile and test trec_eval -README This file -test Collection of sample input and output for trec_eval -trec_eval.c Main procedure -get_qrels.c Called by main to read the standard judged documents (qrels) -get_top.c Called by main to read the results file to be evaluated -form_trvec.c Called by main to put the results and qrels for an individual - query in the proper format to be evaluated. -trvec_teval.c Called by main to evaluate an individual query -print_meas.c Called by main to print an evaluated query, and to accumulate - the results for later averaging over the queries. -measures.c Description of the measures used by printing. -trec_eval_help.c Descriptions of trec_eval, the output, and the measures. - -trec_eval.h Basic evaluation structures. -bpref_bug: Description of bug in bpref that existed in trec_eval versions 6 - through 7.3. - -The rest of the files are small utility portions from SMART. -tr_vec.h -smart_error.h -sysfunc.h -buf.h -common.h -buf_util.c -error_msgs.c - ------------------------------------------------------------------------------- - -The rest of this file consists of information printed by "trec_eval -h": -(If you REALLY want a complete list of measures calculated, you can add the -time based measures and run "trec_eval -T -h".) - -trec_eval [-h] [-q] [-a] [-o] [-c] [-l [-N] [-M] [-Ua] [-Ub] [-Uc] [-Ud] [-T] trec_rel_file trec_top_file - -Calculate and print various evaluation measures, evaluating the results -in trec_top_file against the relevance judgements in trec_rel_file. - -There are a fair number of options, of which only the lower case options are -normally ever used. - -h: Print full help message and exit - -q: In addition to summary evaluation, give evaluation for each query - -a: Print all evaluation measures calculated, instead of just the - main official measures for TREC. - -o: Print everything out in old, nonrelational format (default is relational) - -c: Average over the complete set of queries in the relevance judgements - instead of the queries in the intersection of relevance judgements - and results. Missing queries will contribute a value of 0 to all - evaluation measures (which may or may not be reasonable for a - particular evaluation measure, but is reasonable for standard TREC - measures.) - -l: Num indicates the minimum relevance judgement value needed for - a document to be called relevant. (All measures used by TREC eval are - based on binary relevance). Used if trec_rel_file contains relevance - judged on a multi-relevance scale. Default is 1. - -N: Number of docs in collection - -M: Max number of docs per topic to use in evaluation (discard rest). - -Ua: Value to use for 'a' coefficient of utility computation. - relevant nonrelevant - retrieved a b - nonretrieved c d - -Ub: Value to use for 'b' coefficient of utility computation. - -Uc: Value to use for 'c' coefficient of utility computation. - -Ud: Value to use for 'd' coefficient of utility computation. - -J: Calculate all values only over the judged (either relevant or - nonrelevant) documents. All unjudged documents are removed from the - retrieved set before any calculations (possibly leaving an empty set). - DO NOT USE, unless you really know what you're doing - very easy to get - reasonable looking, but invalid, numbers. - -T: Treat similarity as time that document retrieved. Compute - several time-based measures after ranking docs by time retrieved - (first doc (lowest sim) retrieved ranked highest). - Only done if -a selected. - - -Read text tuples from trec_top_file of the form - 030 Q0 ZF08-175-870 0 4238 prise1 - qid iter docno rank sim run_id -giving TREC document numbers (a string) retrieved by query qid -(a string) with similarity sim (a float). The other fields are ignored, -with the exception that the run_id field of the last line is kept and -output. In particular, note that the rank field is ignored here; -internally ranks are assigned by sorting by the sim field with ties -broken deterministicly (using docno). -Sim is assumed to be higher for the docs to be retrieved first. -File may contain no NULL characters. -Lines may contain fields after the run_id; they are ignored. - -Relevance for each docno to qid is determined from text_qrels_file, which -consists of text tuples of the form - qid iter docno rel -giving TREC document numbers (docno, a string) and their relevance (rel, -an integer) to query qid (a string). iter string field is ignored. -Fields are separated by whitespace, string fields can contain no whitespace. -File may contain no NULL characters. - -The text tuples with relevance judgements are converted to TR_VEC form -and then submitted to the SMART evaluation routines. -The qid,did,rank,sim,rel fields of TR_VEC are filled in; -action,iter fields are set to 0. -The rel field is set to -1 if the document was not judged (not in -text_qrels_file). Most measures, but not all, will treat -1 the same as 0, -namely nonrelevant. Note that relevance_level is used to determine if the -document is relevant during score calculations. -Queries for which there are no relevant docs are ignored. -Warning: queries for which there are relevant docs but no retrieved docs -are also ignored by default. This allows systems to evaluate over subsets -of the relevant docs, but means if a system improperly retrieves no docs, -it will not be detected. Use the -c flag to avoid this behavior. - -EXPLANATION OF OFFICIAL VALUES PRINTED OF OLD NON-RELATIONAL FORMAT. -Relational Format prints the same values, but all lines are of the form - measure_name query value - -1. Total number of documents over all queries - Retrieved: - Relevant: - Rel_ret: (relevant and retrieved) - These should be self-explanatory. All values are totals over all - queries being evaluated. -2. Interpolated Recall - Precision Averages: - at 0.00 - at 0.10 - ... - at 1.00 - See any standard IR text (especially by Salton) for more details of - recall-precision evaluation. Measures precision (percent of retrieved - docs that are relevant) at various recall levels (after a certain - percentage of all the relevant docs for that query have been retrieved). - 'Interpolated' means that, for example, precision at recall - 0.10 (ie, after 10% of rel docs for a query have been retrieved) is - taken to be MAXIMUM of precision at all recall points >= 0.10. - Values are averaged over all queries (for each of the 11 recall levels). - These values are used for Recall-Precision graphs. -3. Average precision (non-interpolated) over all rel docs - The precision is calculated after each relevant doc is retrieved. - If a relevant doc is not retrieved, its precision is 0.0. - All precision values are then averaged together to get a single number - for the performance of a query. Conceptually this is the area - underneath the recall-precision graph for the query. - The values are then averaged over all queries. -4. Precision: - at 5 docs - at 10 docs - ... - at 1000 docs - The precision (percent of retrieved docs that are relevant) after X - documents (whether relevant or nonrelevant) have been retrieved. - Values averaged over all queries. If X docs were not retrieved - for a query, then all missing docs are assumed to be non-relevant. -5. R-Precision (precision after R (= num_rel for a query) docs retrieved): - Measures precision (or recall, they're the same) after R docs - have been retrieved, where R is the total number of relevant docs - for a query. Thus if a query has 40 relevant docs, then precision - is measured after 40 docs, while if it has 600 relevant docs, precision - is measured after 600 docs. This avoids some of the averaging - problems of the 'precision at X docs' values in (4) above. - If R is greater than the number of docs retrieved for a query, then - the nonretrieved docs are all assumed to be nonrelevant. - -Major measures (again) with their relational names: -num_ret Total number of documents retrieved over all queries -num_rel Total number of relevant documents over all queries -num_rel_ret Total number of relevant documents retrieved over all queries -map Mean Average Precision (MAP) -gm_ap Average Precision. Geometric Mean, q_score=log(MAX(map,.00001)) -R-prec R-Precision (Precision after R (= num-rel for topic) documents retrieved) -bpref Binary Preference, top R judged nonrel -recip_rank Reciprical rank of top relevant document -ircl_prn.0.00 Interpolated Recall - Precision Averages at 0.00 recall -ircl_prn.0.10 Interpolated Recall - Precision Averages at 0.10 recall -ircl_prn.0.20 Interpolated Recall - Precision Averages at 0.20 recall -ircl_prn.0.30 Interpolated Recall - Precision Averages at 0.30 recall -ircl_prn.0.40 Interpolated Recall - Precision Averages at 0.40 recall -ircl_prn.0.50 Interpolated Recall - Precision Averages at 0.50 recall -ircl_prn.0.60 Interpolated Recall - Precision Averages at 0.60 recall -ircl_prn.0.70 Interpolated Recall - Precision Averages at 0.70 recall -ircl_prn.0.80 Interpolated Recall - Precision Averages at 0.80 recall -ircl_prn.0.90 Interpolated Recall - Precision Averages at 0.90 recall -ircl_prn.1.00 Interpolated Recall - Precision Averages at 1.00 recall -P5 Precision after 5 docs retrieved -P10 Precision after 10 docs retrieved -P15 Precision after 15 docs retrieved -P20 Precision after 20 docs retrieved -P30 Precision after 30 docs retrieved -P100 Precision after 100 docs retrieved -P200 Precision after 200 docs retrieved -P500 Precision after 500 docs retrieved -P1000 Precision after 1000 docs retrieved - - -Minor measures with their relational names: -exact_prec Exact Precision over retrieved set -exact_recall Exact Recall over retrieved set -11-pt_avg Average over all 11 points of recall-precision graph -3-pt_avg Average over 3 points of recall-precision graph -avg_doc_prec Rel doc precision averaged over all relevant docs (NOT over topics) -exact_relative_prec Exact relative precision -avg_relative_prec Average relative precision -exact_unranked_avg_prec Exact Unranked Average Precision -exact_relative_unranked_avg_prec Exact Relative Unranked Average Precision -map_at_R Average Precision over first R docs retrieved -int_map Interpolated Mean Average Precision -exact_int_R_rcl_prec Exact R-based-interpolated-Precision -int_map_at_R Average Interpolated Precision for first R docs retrieved -bpref_allnonrel Binary Preference, all judged nonrel -bpref_retnonrel Binary Preference, all retrieved judged nonrel -bpref_topnonrel Binary Preference, top 100 judged nonrel -bpref_top5Rnonrel Binary Preference, top 5R judged nonrel -bpref_top10Rnonrel Binary Preference, top 10R judged nonrel -bpref_top10pRnonrel Binary Preference, top 10 + R judged nonrel -bpref_top25pRnonrel Binary Preference, top 25 + R judged nonrel -bpref_top50pRnonrel Binary Preference, top 50 + R judged nonrel -bpref_top25p2Rnonrel Binary Preference, top 25 + 2*R judged nonrel -bpref_retall Binary Preference, Only retrieved judged rel and nonrel -bpref_5 Binary Preference, top 5 rel, top 5 nonrel -bpref_10 Binary Preference, top 10 rel, top 10 nonrel -bpref_num_all Binary Preference, Number not retrieved before (all judged) -bpref_num_ret Binary Preference, Number retrieved after -bpref_num_correct Binary Preference, Number correct preferences -bpref_num_possible Binary Preference, Number possible correct_preferences -old_bpref Buggy Version 7.3. Binary Preference, top R judged nonrel -old_bpref_top10pRnonrel Buggy Version 7.3. Binary Preference,top 10+R judged nonrel -gm_bpref Binary Preference, top R judged nonrel, Geometric Mean, q_score=log(MAX(bpref,.00001)) -rank_first_rel Rank of top relevant document (0 if none) -recall5 Recall after 5 docs retrieved -recall10 Recall after 10 docs retrieved -recall15 Recall after 15 docs retrieved -recall20 Recall after 20 docs retrieved -recall30 Recall after 30 docs retrieved -recall100 Recall after 100 docs retrieved -recall200 Recall after 200 docs retrieved -recall500 Recall after 500 docs retrieved -recall1000 Recall after 1000 docs retrieved -0.20R-prec R-based precision- precision after 0.20 * R docs retrieved -0.40R-prec R-based precision- precision after 0.40 * R docs retrieved -0.60R-prec R-based precision- precision after 0.60 * R docs retrieved -0.80R-prec R-based precision- precision after 0.80 * R docs retrieved -1.00R-prec R-based precision- precision after 1.00 * R docs retrieved -1.20R-prec R-based precision- precision after 1.20 * R docs retrieved -1.40R-prec R-based precision- precision after 1.40 * R docs retrieved -1.60R-prec R-based precision- precision after 1.60 * R docs retrieved -1.80R-prec R-based precision- precision after 1.80 * R docs retrieved -2.00R-prec R-based precision- precision after 2.00 * R docs retrieved -relative_prec5 Relative precision after 5 docs retrieved -relative_prec10 Relative precision after 10 docs retrieved -relative_prec15 Relative precision after 15 docs retrieved -relative_prec20 Relative precision after 20 docs retrieved -relative_prec30 Relative precision after 30 docs retrieved -relative_prec100 Relative precision after 100 docs retrieved -relative_prec200 Relative precision after 200 docs retrieved -relative_prec500 Relative precision after 500 docs retrieved -relative_prec1000 Relative precision after 1000 docs retrieved -unranked_avg_prec5 Unranked Average Precision after 5 docs retrieved -unranked_avg_prec10 Unranked Average Precision after 10 docs retrieved -unranked_avg_prec15 Unranked Average Precision after 15 docs retrieved -unranked_avg_prec20 Unranked Average Precision after 20 docs retrieved -unranked_avg_prec30 Unranked Average Precision after 30 docs retrieved -unranked_avg_prec100 Unranked Average Precision after 100 docs retrieved -unranked_avg_prec200 Unranked Average Precision after 200 docs retrieved -unranked_avg_prec500 Unranked Average Precision after 500 docs retrieved -unranked_avg_prec1000 Unranked Average Precision after 1000 docs retrieved -relative_unranked_avg_prec5 Relative Unranked Average Precision after 5 docs retrieved -relative_unranked_avg_prec10 Relative Unranked Average Precision after 10 docs retrieved -relative_unranked_avg_prec15 Relative Unranked Average Precision after 15 docs retrieved -relative_unranked_avg_prec20 Relative Unranked Average Precision after 20 docs retrieved -relative_unranked_avg_prec30 Relative Unranked Average Precision after 30 docs retrieved -relative_unranked_avg_prec100 Relative Unranked Average Precision after 100 docs retrieved -relative_unranked_avg_prec200 Relative Unranked Average Precision after 200 docs retrieved -relative_unranked_avg_prec500 Relative Unranked Average Precision after 500 docs retrieved -relative_unranked_avg_prec1000 Relative Unranked Average Precision after 1000 docs retrieved -utility_1.0_-1.0_0.0_0.0 Utility (a,b,c,d) Coefficients 1.0_-1.0_0.0_0.0 -rcl_at_142_nonrel Recall averaged at X nonrel docs X= 142 -fallout_recall_0 Fallout - Recall Averages- recall after 0 nonrel docs retrieved -fallout_recall_14 Fallout - Recall Averages- recall after 14 nonrel docs retrieved -fallout_recall_28 Fallout - Recall Averages- recall after 28 nonrel docs retrieved -fallout_recall_42 Fallout - Recall Averages- recall after 42 nonrel docs retrieved -fallout_recall_56 Fallout - Recall Averages- recall after 56 nonrel docs retrieved -fallout_recall_71 Fallout - Recall Averages- recall after 71 nonrel docs retrieved -fallout_recall_85 Fallout - Recall Averages- recall after 85 nonrel docs retrieved -fallout_recall_99 Fallout - Recall Averages- recall after 99 nonrel docs retrieved -fallout_recall_113 Fallout - Recall Averages- recall after 113 nonrel docs retrieved -fallout_recall_127 Fallout - Recall Averages- recall after 127 nonrel docs retrieved -fallout_recall_142 Fallout - Recall Averages- recall after 142 nonrel docs retrieved -int_0.20R-prec Interpolated R-based precision, after 0.20 * R docs retrieved -int_0.40R-prec Interpolated R-based precision, after 0.40 * R docs retrieved -int_0.60R-prec Interpolated R-based precision, after 0.60 * R docs retrieved -int_0.80R-prec Interpolated R-based precision, after 0.80 * R docs retrieved -int_1.00R-prec Interpolated R-based precision, after 1.00 * R docs retrieved -int_1.20R-prec Interpolated R-based precision, after 1.20 * R docs retrieved -int_1.40R-prec Interpolated R-based precision, after 1.40 * R docs retrieved -int_1.60R-prec Interpolated R-based precision, after 1.60 * R docs retrieved -int_1.80R-prec Interpolated R-based precision, after 1.80 * R docs retrieved -int_2.00R-prec Interpolated R-based precision, after 2.00 * R docs retrieved -micro_prec Total relevant retrieved documents / Total retrieved documents -micro_recall Total relevant retrieved documents / Total relevant documents -micro_bpref Total correct preferences / Total possible preferences diff --git a/sm_cnn/trec_eval-8.0/buf.h b/sm_cnn/trec_eval-8.0/buf.h deleted file mode 100755 index 5f2f84c..0000000 --- a/sm_cnn/trec_eval-8.0/buf.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef BUFH -#define BUFH -/* $Header: /home/smart/release/src/h/buf.h,v 11.0 1992/07/21 18:18:32 chrisb Exp $*/ - -/* structure used for passing around text (buf) which possibly includes - NULLs. see buf_util.c for add_buf(). */ -typedef struct { - int size; - int end; - char *buf; -} SM_BUF; - -#endif /* BUFH */ diff --git a/sm_cnn/trec_eval-8.0/buf_util.c b/sm_cnn/trec_eval-8.0/buf_util.c deleted file mode 100755 index 754eb07..0000000 --- a/sm_cnn/trec_eval-8.0/buf_util.c +++ /dev/null @@ -1,86 +0,0 @@ -#ifdef RCSID -static char rcsid[] = "$Header: /home/smart/release/src/libgeneral/buf_util.c,v 11.0 1992/07/21 18:21:04 chrisb Exp $"; -#endif - -/* Copyright (c) 1991, 1990, 1984 - Gerard Salton, Chris Buckley. - - Permission is granted for use of this file in unmodified form for - research purposes. Please contact the SMART project to obtain - permission for other uses. -*/ - -/******************** PROCEDURE DESCRIPTION ************************ - *0 Utility procedure to add the memory contents of new.buf to result.buf - *2 add_buf (new, result) - *3 SM_BUF *new; - *3 SM_BUF *result; - *7 Both new and result are of type - *7 typedef struct { - *7 int size; * allocated space for buf * - *7 int end; * end of valid data in buf * - *7 char *buf; * buffer of arbitrary data * - *7 } SM_BUF; - *7 - *7 Append the data in new to the end of the data in result. The data can - *7 be arbitrary data, eg, include '\0's. - *7 Return UNDEF if can't allocate enough space for the result, 0 otherwise. -***********************************************************************/ - -#include "common.h" -#include "sysfunc.h" -#include "buf.h" - -int -add_buf (new, result) -SM_BUF *new, *result; -{ - if (result->size == 0) { - if (NULL == (result->buf = malloc ((unsigned) new->end * 2 + 1))) - return (UNDEF); - result->size = 2 * new->end + 1; - result->end = 0; - } - else if (new->end >= result->size - result->end) { - if (NULL == (result->buf = - realloc (result->buf, - (unsigned) result->size * 2 + new->end))) - return (UNDEF); - result->size += result->size + new->end; - } - - bcopy (new->buf, &result->buf[result->end], new->end); - result->end += new->end; - - return (0); -} - -/******************** PROCEDURE DESCRIPTION ************************ - *0 Utility procedure to add the string new to result.buf - *2 add_buf_string (new, result) - *3 char *new; - *3 SM_BUF *result; - - *7 Result is of type - *7 typedef struct { - *7 int size; * allocated space for buf * - *7 int end; * end of valid data in buf * - *7 char *buf; * buffer of arbitrary data * - *7 } SM_BUF; - *7 - *7 Append the data in new to the end of the data in result. - *7 Return UNDEF if can't allocate enough space for the result, 0 otherwise. -***********************************************************************/ - -int -add_buf_string (new, result) -char *new; -SM_BUF *result; -{ - SM_BUF temp_buf; - temp_buf.end = strlen (new); - temp_buf.buf = new; - - return (add_buf (&temp_buf, result)); - -} - diff --git a/sm_cnn/trec_eval-8.0/common.h b/sm_cnn/trec_eval-8.0/common.h deleted file mode 100755 index 80007df..0000000 --- a/sm_cnn/trec_eval-8.0/common.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef COMMONH -#define COMMONH - -#include - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif - -#define UNDEF -1 - -#define MAX(A,B) ((A) > (B) ? (A) : (B)) -#define MIN(A,B) ((A) > (B) ? (B) : (A)) - -#ifndef MAXLONG -#define MAXLONG 2147483647L /* largest long int. no. */ -#endif - -/* - * Some useful macros for making malloc et al easier to use. - * Macros handle the casting and the like that's needed. - */ -#define Malloc(n,type) (type *) malloc( (unsigned) ((n)*sizeof(type))) -#define Realloc(loc,n,type) (type *) realloc( (char *)(loc), \ - (unsigned) ((n)*sizeof(type))) -#define Free(loc) (void) free( (char *)(loc) ) - -#endif /* COMMONH */ diff --git a/sm_cnn/trec_eval-8.0/error_msgs.c b/sm_cnn/trec_eval-8.0/error_msgs.c deleted file mode 100755 index 0eb23d0..0000000 --- a/sm_cnn/trec_eval-8.0/error_msgs.c +++ /dev/null @@ -1,93 +0,0 @@ -#ifdef RCSID -static char rcsid[] = "$Header: /home/smart/release/./src/libgeneral/error_msgs.c,v 10.1 91/11/05 23:49:06 smart Exp Locker: smart $"; -#endif - -/* Copyright (c) 1991, 1990, 1984 - Gerard Salton, Chris Buckley. - - Permission is granted for use of this file in unmodified form for - research purposes. Please contact the SMART project to obtain - permission for other uses. -*/ - -/******************** PROCEDURE DESCRIPTION ************************ - *0 print a SMART error message - *2 print_error (new_routine, new_message) - *3 char *new_routine; - *3 char *new_message; - *6 Global UNIX variables errno, sys_nerr, sys_errlist are used, as well - *6 as SMART global variables smart_errlist and smart_errno; - - *7 Print an error message to stderr. At point of error determination, - *7 either smart_errno should be set, or (if UNIX library error) errno will - *7 be set. If smart_errno is set, then the routine name that detected the - *7 error and a message are printed. In addition, the routine name that prints - *7 the error and it's message (eg action to be taken) are printed. - *9 smart_errno should be more widely used, in particular to locate the - *9 procedure the error occurs in. Many errors can only get "located" - *9 by setting trace. -***********************************************************************/ - -#include -#include "smart_error.h" -#include "sysfunc.h" - -/* Declarations of external variables defined in "smart_error.h" */ - -int smart_errno; /* If > 0 and <= sys_nerr then refers to */ - /* sys_errlist, else if >= smart_errmin */ - /* and <= smart_errmax, then smart_errlist */ -char *smart_message; /* Message to be printed (often filename) */ -char *smart_routine; /* Major routine issuing error message */ - - -extern int errno; - -char *smart_errlist[] = { - "Inconsistency check", - "Illegal value for seek", - "Illegal mode for object", - "Illegal parameter value" -}; - -void -print_error (new_routine, new_message) -char *new_routine; -char *new_message; -{ - if (smart_errno > 0 && smart_errno < SMART_MINERR) { - (void) fprintf (stderr, "%s: in %s: '%s' %s - %s\n", - new_routine, - smart_routine, - smart_message, - strerror(smart_errno), - new_message); - } - else if (smart_errno >= SMART_MINERR && - smart_errno < SMART_MINERR + SMART_NUMERR) { - (void) fprintf (stderr, "%s: in %s: '%s' %s - %s\n", - new_routine, - smart_routine, - smart_message, - smart_errlist[smart_errno - SMART_MINERR], - new_message); - } - else if (smart_errno == 0 && errno != 0) { - /* Presumably error detected directly by new_routine */ - /* after system call */ - (void) fprintf (stderr, "%s: '%s' - %s\n", - new_routine, - strerror(errno), - new_message); - } - else { - (void) fprintf (stderr, "%s: Undetermined error detected - %s\n", - new_routine, - new_message); - } - - /* Reset the global error indicators */ - errno = 0; - smart_errno = 0; - smart_message = NULL; - smart_routine = NULL; -} diff --git a/sm_cnn/trec_eval-8.0/form_trvec.c b/sm_cnn/trec_eval-8.0/form_trvec.c deleted file mode 100755 index 432fdab..0000000 --- a/sm_cnn/trec_eval-8.0/form_trvec.c +++ /dev/null @@ -1,201 +0,0 @@ -#include "common.h" -#include "sysfunc.h" -#include "smart_error.h" -#include "tr_vec.h" -#include "trec_eval.h" -#include "buf.h" - -static int comp_tr_tup_rank(), comp_tr_tup_did(), comp_tr_docno(), - comp_qrels_docno(), comp_sim_docno(), comp_negsim_docno(); - -/* Space reserved for output TR_TUP tuples */ -static TR_TUP *start_tr_tup; -static long max_tr_tup = 0; - -int -form_trvec (epi, trec_top, trec_qrels, tr_vec, num_rel) -EVAL_PARAM_INFO *epi; -TREC_TOP *trec_top; -TREC_QRELS *trec_qrels; -TR_VEC *tr_vec; -long *num_rel; -{ - TR_TUP *tr_tup; - TEXT_QRELS *qrels_ptr, *end_qrels; - long i; - - /* Reserve space for output tr_tups, if needed */ - if (trec_top->num_text_tr > max_tr_tup) { - if (max_tr_tup > 0) - (void) free ((char *) start_tr_tup); - max_tr_tup += trec_top->num_text_tr; - if (NULL == (start_tr_tup = Malloc (max_tr_tup, TR_TUP))) - return (UNDEF); - } - - /* Sort trec_top by sim, breaking ties lexicographically using docno */ - if (epi->time_flag) { - qsort ((char *) trec_top->text_tr, - (int) trec_top->num_text_tr, - sizeof (TEXT_TR), - comp_negsim_docno); - } - else { - qsort ((char *) trec_top->text_tr, - (int) trec_top->num_text_tr, - sizeof (TEXT_TR), - comp_sim_docno); - } - - /* Add ranks to trec_top (starting at 1) */ - for (i = 0; i < trec_top->num_text_tr; i++) { - trec_top->text_tr[i].rank = i+1; - } - - /* Sort trec_top lexicographically */ - qsort ((char *) trec_top->text_tr, - (int) trec_top->num_text_tr, - sizeof (TEXT_TR), - comp_tr_docno); - - for (i = 1; i < trec_top->num_text_tr; i++) { - if (0 == strcmp (trec_top->text_tr[i].docno, - trec_top->text_tr[i-1].docno)) { - set_error (SM_ILLPA_ERR, "Duplicate top docs docno", trec_top->text_tr[i].docno); - return (UNDEF); - } - } - - /* Sort trec_qrels lexicographically */ - qsort ((char *) trec_qrels->text_qrels, - (int) trec_qrels->num_text_qrels, - sizeof (TEXT_QRELS), - comp_qrels_docno); - - /* Find number of relevant docs, and check for duplicates */ - *num_rel = 0; - for (i = 0; i < trec_qrels->num_text_qrels; i++) { - //if (i > 0 && (0 == strcmp (trec_qrels->text_qrels[i].docno, - // trec_qrels->text_qrels[i-1].docno))) { - // set_error (SM_ILLPA_ERR, "Duplicate qrels docno", trec_qrels->text_qrels[i].docno); - // return (UNDEF); - //} - if (trec_qrels->text_qrels[i].rel >= epi->relevance_level) - (*num_rel)++; - } - - /* Go through trec_top, trec_qrels in parallel to determine which - docno's are in both (ie, which trec_top are relevant). Once relevance - is known, convert trec_top tuple into TR_TUP. */ - tr_tup = start_tr_tup; - qrels_ptr = trec_qrels->text_qrels; - end_qrels = &trec_qrels->text_qrels[trec_qrels->num_text_qrels]; - for (i = 0; i < trec_top->num_text_tr; i++) { - if (trec_top->text_tr[i].rank > epi->max_num_docs_per_topic) - /* Skip if evaluation desired over fewer docs than this rank */ - continue; - while (qrels_ptr < end_qrels && - strcmp (qrels_ptr->docno, trec_top->text_tr[i].docno) < 0) - qrels_ptr++; - if (qrels_ptr >= end_qrels || - strcmp (qrels_ptr->docno, trec_top->text_tr[i].docno) > 0) { - /* Doc is non-judged */ - tr_tup->rel = -1; - /* Skip unjudged docs if desired */ - if (epi->judged_docs_only_flag) - continue; - } - else { - /* Doc is judged; assign relevance */ - tr_tup->rel = qrels_ptr->rel; - qrels_ptr++; - } - tr_tup->did = i; - tr_tup->rank = trec_top->text_tr[i].rank; - tr_tup->sim = trec_top->text_tr[i].sim; - tr_tup->action = 0; - tr_tup->iter = 0; - tr_tup++; - } - - /* Form the full TR_VEC object for this qid */ - tr_vec->qid = trec_top->qid; - tr_vec->num_tr = tr_tup - start_tr_tup; - tr_vec->tr = start_tr_tup; - - /* If judged_docs_only_flag, then must fix up ranks to reflect unjudged - docs being thrown out. Note: done this way to preserve original - tie-breaking based on text docno */ - if (epi->judged_docs_only_flag) { - /* Sort tuples by increasing rank */ - qsort ((char *) tr_vec->tr, - (int) tr_vec->num_tr, - sizeof (TR_TUP), - comp_tr_tup_rank); - for (i = 0; i < tr_vec->num_tr; i++) { - tr_vec->tr[i].rank = i+1; - } - qsort ((char *) tr_vec->tr, - (int) tr_vec->num_tr, - sizeof (TR_TUP), - comp_tr_tup_did); - } - - return (1); -} - -static int -comp_sim_docno (ptr1, ptr2) -TEXT_TR *ptr1; -TEXT_TR *ptr2; -{ - if (ptr1->sim > ptr2->sim) - return (-1); - if (ptr1->sim < ptr2->sim) - return (1); - return (strcmp (ptr2->docno, ptr1->docno)); -} - -static int -comp_negsim_docno (ptr1, ptr2) -TEXT_TR *ptr1; -TEXT_TR *ptr2; -{ - if (ptr1->sim < ptr2->sim) - return (-1); - if (ptr1->sim > ptr2->sim) - return (1); - return (strcmp (ptr2->docno, ptr1->docno)); -} - -static int -comp_tr_docno (ptr1, ptr2) -TEXT_TR *ptr1; -TEXT_TR *ptr2; -{ - return (strcmp (ptr1->docno, ptr2->docno)); -} - -static int -comp_qrels_docno (ptr1, ptr2) -TEXT_QRELS *ptr1; -TEXT_QRELS *ptr2; -{ - return (strcmp (ptr1->docno, ptr2->docno)); -} - -static int -comp_tr_tup_rank (ptr1, ptr2) -TR_TUP *ptr1; -TR_TUP *ptr2; -{ - return (ptr1->rank - ptr2->rank); -} - -static int -comp_tr_tup_did (ptr1, ptr2) -TR_TUP *ptr1; -TR_TUP *ptr2; -{ - return (ptr1->did - ptr2->did); -} diff --git a/sm_cnn/trec_eval-8.0/get_qrels.c b/sm_cnn/trec_eval-8.0/get_qrels.c deleted file mode 100755 index 84d51de..0000000 --- a/sm_cnn/trec_eval-8.0/get_qrels.c +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (c) 2003, 1991, 1990, 1984 Chris Buckley. */ - - -#include "common.h" -#include "sysfunc.h" -#include "smart_error.h" -#include "trec_eval.h" -#include - - -/* Read all relevance information from text_qrels_file. -Relevance for each docno to qid is determined from text_qrels_file, which -consists of text tuples of the form - qid iter docno rel -giving TREC document numbers (docno, a string) and their relevance (rel, -an integer) to query qid (a string). iter string field is ignored. -Fields are separated by whitespace, string fields can contain no whitespace. -File may contain no NULL characters. -*/ - -int -get_qrels (text_qrels_file, all_trec_qrels) -char *text_qrels_file; -ALL_TREC_QRELS *all_trec_qrels; -{ - int fd; - int size = 0; - char *trec_qrels_buf; - char *ptr; - char *current_qid; - char *qid_ptr, *docno_ptr, *rel_ptr; - long i; - long rel; - TREC_QRELS *current_qrels = NULL; - - /* Read entire file into memory */ - if (-1 == (fd = open (text_qrels_file, 0)) || - -1 == (size = lseek (fd, 0L, 2)) || - NULL == (trec_qrels_buf = malloc ((unsigned) size+2)) || - -1 == lseek (fd, 0L, 0) || - size != read (fd, trec_qrels_buf, size) || - -1 == close (fd)) { - - set_error (SM_ILLPA_ERR, "Cannot read qrels file", "trec_eval"); - return (UNDEF); - } - - current_qid = ""; - - /* Initialize all_trec_qrels */ - all_trec_qrels->num_q_qrels = 0; - all_trec_qrels->max_num_q_qrels = INIT_NUM_QUERIES; - if (NULL == (all_trec_qrels->trec_qrels = Malloc (INIT_NUM_QUERIES, - TREC_QRELS))) - return (UNDEF); - - if (size == 0) - return (0); - - /* Append ending newline if not present, Append NULL terminator */ - if (trec_qrels_buf[size-1] != '\n') { - trec_qrels_buf[size] = '\n'; - size++; - } - trec_qrels_buf[size] = '\0'; - - ptr = trec_qrels_buf; - - while (*ptr) { - /* Get current line */ - /* Get qid */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - qid_ptr = ptr; - while (! isspace (*ptr)) ptr++; - if (*ptr == '\n') { - set_error (SM_ILLPA_ERR, "Malformed qrels line", "trec_eval"); - return (UNDEF); - } - *ptr++ = '\0'; - /* Skip iter */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - while (! isspace (*ptr)) ptr++; - if (*ptr++ == '\n') { - set_error (SM_ILLPA_ERR, "Malformed qrels line", "trec_eval"); - return (UNDEF); - } - /* Get docno */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - docno_ptr = ptr; - while (! isspace (*ptr)) ptr++; - if (*ptr == '\n') { - set_error (SM_ILLPA_ERR, "Malformed qrels line", "trec_eval"); - return (UNDEF); - } - *ptr++ = '\0'; - /* Get relevance */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - if (*ptr == '\n') { - set_error (SM_ILLPA_ERR, "Malformed qrels line", "trec_eval"); - return (UNDEF); - } - rel_ptr = ptr; - while (! isspace (*ptr)) ptr++; - if (*ptr != '\n') { - *ptr++ = '\0'; - while (*ptr != '\n' && isspace (*ptr)) ptr++; - if (*ptr != '\n') { - set_error (SM_ILLPA_ERR, "malformed qrels line", - "trec_eval"); - return (UNDEF); - } - } - *ptr++ = '\0'; - - if (0 != strcmp (qid_ptr, current_qid)) { - /* Query has changed. Must check if new query or this is more - judgements for an old query */ - for (i = 0; i < all_trec_qrels->num_q_qrels; i++) { - if (0 == strcmp (qid_ptr, all_trec_qrels->trec_qrels[i].qid)) - break; - } - if (i >= all_trec_qrels->num_q_qrels) { - /* New unseen query, add and initialize it */ - if (all_trec_qrels->num_q_qrels >= - all_trec_qrels->max_num_q_qrels) { - all_trec_qrels->max_num_q_qrels *= 10; - if (NULL == (all_trec_qrels->trec_qrels = - Realloc (all_trec_qrels->trec_qrels, - all_trec_qrels->max_num_q_qrels, - TREC_QRELS))) - return (UNDEF); - } - current_qrels = &all_trec_qrels->trec_qrels[i]; - current_qrels->qid = qid_ptr; - current_qrels->num_text_qrels = 0; - current_qrels->max_num_text_qrels = INIT_NUM_RELS; - if (NULL == (current_qrels->text_qrels = - Malloc (INIT_NUM_RELS, TEXT_QRELS))) - return (UNDEF); - all_trec_qrels->num_q_qrels++; - } - else { - /* Old query, just switch current_q_index */ - current_qrels = &all_trec_qrels->trec_qrels[i]; - } - current_qid = current_qrels->qid; - } - - /* Add judgement to current query's list */ - if (current_qrels->num_text_qrels >= - current_qrels->max_num_text_qrels) { - /* Need more space */ - current_qrels->max_num_text_qrels *= 10; - if (NULL == (current_qrels->text_qrels = - Realloc (current_qrels->text_qrels, - current_qrels->max_num_text_qrels, - TEXT_QRELS))) - return (UNDEF); - } - current_qrels->text_qrels[current_qrels->num_text_qrels].docno = - docno_ptr; - rel = atol (rel_ptr); - current_qrels->text_qrels[current_qrels->num_text_qrels++].rel = - rel; - } - - return (1); -} - diff --git a/sm_cnn/trec_eval-8.0/get_top.c b/sm_cnn/trec_eval-8.0/get_top.c deleted file mode 100755 index efc6c76..0000000 --- a/sm_cnn/trec_eval-8.0/get_top.c +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (c) 2003, 1991, 1990, 1984 Chris Buckley. */ - - -#include "common.h" -#include "sysfunc.h" -#include "smart_error.h" -#include "trec_eval.h" -#include - -/* Read all retrieved results information from trec_top_file. -Read text tuples from trec_top_file of the form - 030 Q0 ZF08-175-870 0 4238 prise1 - qid iter docno rank sim run_id -giving TREC document numbers (a string) retrieved by query qid -(a string) with similarity sim (a float). The other fields are ignored, -with the exception that the run_id field of the last line is kept and -output. In particular, note that the rank field is ignored here; -internally ranks are assigned by sorting by the sim field with ties -broken determinstically (using docno). -Sim is assumed to be higher for the docs to be retrieved first. -File may contain no NULL characters. -Any field following run_id is ignored. -*/ - -int -get_top (trec_top_file, all_trec_top) -char *trec_top_file; -ALL_TREC_TOP *all_trec_top; -{ - int fd; - int size = 0; - char *trec_top_buf; - char *ptr; - char *current_qid; - char *qid_ptr, *docno_ptr, *sim_ptr; - char *run_id_ptr = ""; - long i; - TREC_TOP *current_top = NULL; - float sim; - - /* Read entire file into memory */ - if (-1 == (fd = open (trec_top_file, 0)) || - -1 == (size = lseek (fd, 0L, 2)) || - NULL == (trec_top_buf = malloc ((unsigned) size+2)) || - -1 == lseek (fd, 0L, 0) || - size != read (fd, trec_top_buf, size) || - -1 == close (fd)) { - - set_error (SM_ILLPA_ERR, "Cannot read qrels file", "trec_eval"); - return (UNDEF); - } - - current_qid = ""; - - /* Initialize all_trec_top */ - all_trec_top->num_q_tr = 0; - all_trec_top->max_num_q_tr = INIT_NUM_QUERIES; - if (NULL == (all_trec_top->trec_top = Malloc (INIT_NUM_QUERIES, - TREC_TOP))) - return (UNDEF); - - if (size == 0) - return (0); - - /* Append ending newline if not present, Append NULL terminator */ - if (trec_top_buf[size-1] != '\n') { - trec_top_buf[size] = '\n'; - size++; - } - trec_top_buf[size] = '\0'; - - ptr = trec_top_buf; - - while (*ptr) { - /* Get current line */ - /* Get qid */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - if (*ptr == '\n') { - /* Ignore blank lines (people seem to insist on them!) */ - ptr++; - continue; - } - qid_ptr = ptr; - while (! isspace (*ptr)) ptr++; - if (*ptr == '\n') { - set_error (SM_ILLPA_ERR,"malformed top results line", "trec_eval"); - return (UNDEF); - } - *ptr++ = '\0'; - /* Skip iter */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - while (! isspace (*ptr)) ptr++; - if (*ptr++ == '\n') { - set_error (SM_ILLPA_ERR,"malformed top results line", "trec_eval"); - return (UNDEF); - } - /* Get docno */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - docno_ptr = ptr; - while (! isspace (*ptr)) ptr++; - if (*ptr == '\n') { - set_error (SM_ILLPA_ERR,"malformed top results line", "trec_eval"); - return (UNDEF); - } - *ptr++ = '\0'; - /* Skip rank */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - while (! isspace (*ptr)) ptr++; - if (*ptr++ == '\n') { - set_error (SM_ILLPA_ERR,"malformed top results line", "trec_eval"); - return (UNDEF); - } - /* Get sim */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - sim_ptr = ptr; - while (! isspace (*ptr)) ptr++; - if (*ptr == '\n') { - set_error (SM_ILLPA_ERR,"malformed top results line", "trec_eval"); - return (UNDEF); - } - *ptr++ = '\0'; - /* Get run_id */ - while (*ptr != '\n' && isspace (*ptr)) ptr++; - if (*ptr == '\n') { - set_error (SM_ILLPA_ERR,"malformed top results line", "trec_eval"); - return (UNDEF); - } - run_id_ptr = ptr; - while (! isspace (*ptr)) ptr++; - if (*ptr != '\n') { - /* Skip over rest of line */ - *ptr++ = '\0'; - while (*ptr != '\n') ptr++; - } - *ptr++ = '\0'; - - if (0 != strcmp (qid_ptr, current_qid)) { - /* Query has changed. Must check if new query or this is more - judgements for an old query */ - for (i = 0; i < all_trec_top->num_q_tr; i++) { - if (0 == strcmp (qid_ptr, all_trec_top->trec_top[i].qid)) - break; - } - if (i >= all_trec_top->num_q_tr) { - /* New unseen query, add and initialize it */ - if (all_trec_top->num_q_tr >= - all_trec_top->max_num_q_tr) { - all_trec_top->max_num_q_tr *= 10; - if (NULL == (all_trec_top->trec_top = - Realloc (all_trec_top->trec_top, - all_trec_top->max_num_q_tr, - TREC_TOP))) - return (UNDEF); - } - current_top = &all_trec_top->trec_top[i]; - current_top->qid = qid_ptr; - current_top->num_text_tr = 0; - current_top->max_num_text_tr = INIT_NUM_RESULTS; - if (NULL == (current_top->text_tr = - Malloc (INIT_NUM_RESULTS, TEXT_TR))) - return (UNDEF); - all_trec_top->num_q_tr++; - } - else { - /* Old query, just switch current_q_index */ - current_top = &all_trec_top->trec_top[i]; - } - current_qid = current_top->qid; - } - - /* Add retrieval docno/sim to current query's list */ - if (current_top->num_text_tr >= - current_top->max_num_text_tr) { - /* Need more space */ - current_top->max_num_text_tr *= 10; - if (NULL == (current_top->text_tr = - Realloc (current_top->text_tr, - current_top->max_num_text_tr, - TEXT_TR))) - return (UNDEF); - } - current_top->text_tr[current_top->num_text_tr].docno = docno_ptr; - sim = atof (sim_ptr); - current_top->text_tr[current_top->num_text_tr].sim = sim; - current_top->text_tr[current_top->num_text_tr++].rank = 0; - } - - all_trec_top->run_id = run_id_ptr; - - return (1); -} - diff --git a/sm_cnn/trec_eval-8.0/help.info b/sm_cnn/trec_eval-8.0/help.info deleted file mode 100755 index eb243c7..0000000 --- a/sm_cnn/trec_eval-8.0/help.info +++ /dev/null @@ -1,264 +0,0 @@ -trec_eval [-h] [-q] [-a] [-o] [-c] [-l [-N] [-M] [-Ua] [-Ub] [-Uc] [-Ud] [-T] trec_rel_file trec_top_file - -Calculate and print various evaluation measures, evaluating the results -in trec_top_file against the relevance judgements in trec_rel_file. - -There are a fair number of options, of which only the lower case options are -normally ever used. - -h: Print full help message and exit - -q: In addition to summary evaluation, give evaluation for each query - -a: Print all evaluation measures calculated, instead of just the - main official measures for TREC. - -o: Print everything out in old, nonrelational format (default is relational) - -c: Average over the complete set of queries in the relevance judgements - instead of the queries in the intersection of relevance judgements - and results. Missing queries will contribute a value of 0 to all - evaluation measures (which may or may not be reasonable for a - particular evaluation measure, but is reasonable for standard TREC - measures.) - -l: Num indicates the minimum relevance judgement value needed for - a document to be called relevant. (All measures used by TREC eval are - based on binary relevance). Used if trec_rel_file contains relevance - judged on a multi-relevance scale. Default is 1. - -N: Number of docs in collection - -M: Max number of docs per topic to use in evaluation (discard rest). - -Ua: Value to use for 'a' coefficient of utility computation. - relevant nonrelevant - retrieved a b - nonretrieved c d - -Ub: Value to use for 'b' coefficient of utility computation. - -Uc: Value to use for 'c' coefficient of utility computation. - -Ud: Value to use for 'd' coefficient of utility computation. - -J: Calculate all values only over the judged (either relevant or - nonrelevant) documents. All unjudged documents are removed from the - retrieved set before any calculations (possibly leaving an empty set). - DO NOT USE, unless you really know what you're doing - very easy to get - reasonable looking, but invalid, numbers. - -T: Treat similarity as time that document retrieved. Compute - several time-based measures after ranking docs by time retrieved - (first doc (lowest sim) retrieved ranked highest). - Only done if -a selected. - - -Read text tuples from trec_top_file of the form - 030 Q0 ZF08-175-870 0 4238 prise1 - qid iter docno rank sim run_id -giving TREC document numbers (a string) retrieved by query qid -(a string) with similarity sim (a float). The other fields are ignored, -with the exception that the run_id field of the last line is kept and -output. In particular, note that the rank field is ignored here; -internally ranks are assigned by sorting by the sim field with ties -broken deterministicly (using docno). -Sim is assumed to be higher for the docs to be retrieved first. -File may contain no NULL characters. -Lines may contain fields after the run_id; they are ignored. - -Relevance for each docno to qid is determined from text_qrels_file, which -consists of text tuples of the form - qid iter docno rel -giving TREC document numbers (docno, a string) and their relevance (rel, -an integer) to query qid (a string). iter string field is ignored. -Fields are separated by whitespace, string fields can contain no whitespace. -File may contain no NULL characters. - -The text tuples with relevance judgements are converted to TR_VEC form -and then submitted to the SMART evaluation routines. -The qid,did,rank,sim,rel fields of TR_VEC are filled in; -action,iter fields are set to 0. -The rel field is set to -1 if the document was not judged (not in -text_qrels_file). Most measures, but not all, will treat -1 the same as 0, -namely nonrelevant. Note that relevance_level is used to determine if the -document is relevant during score calculations. -Queries for which there are no relevant docs are ignored. -Warning: queries for which there are relevant docs but no retrieved docs -are also ignored by default. This allows systems to evaluate over subsets -of the relevant docs, but means if a system improperly retrieves no docs, -it will not be detected. Use the -c flag to avoid this behavior. - -EXPLANATION OF OFFICIAL VALUES PRINTED OF OLD NON-RELATIONAL FORMAT. -Relational Format prints the same values, but all lines are of the form - measure_name query value - -1. Total number of documents over all queries - Retrieved: - Relevant: - Rel_ret: (relevant and retrieved) - These should be self-explanatory. All values are totals over all - queries being evaluated. -2. Interpolated Recall - Precision Averages: - at 0.00 - at 0.10 - ... - at 1.00 - See any standard IR text (especially by Salton) for more details of - recall-precision evaluation. Measures precision (percent of retrieved - docs that are relevant) at various recall levels (after a certain - percentage of all the relevant docs for that query have been retrieved). - 'Interpolated' means that, for example, precision at recall - 0.10 (ie, after 10% of rel docs for a query have been retrieved) is - taken to be MAXIMUM of precision at all recall points >= 0.10. - Values are averaged over all queries (for each of the 11 recall levels). - These values are used for Recall-Precision graphs. -3. Average precision (non-interpolated) over all rel docs - The precision is calculated after each relevant doc is retrieved. - If a relevant doc is not retrieved, its precision is 0.0. - All precision values are then averaged together to get a single number - for the performance of a query. Conceptually this is the area - underneath the recall-precision graph for the query. - The values are then averaged over all queries. -4. Precision: - at 5 docs - at 10 docs - ... - at 1000 docs - The precision (percent of retrieved docs that are relevant) after X - documents (whether relevant or nonrelevant) have been retrieved. - Values averaged over all queries. If X docs were not retrieved - for a query, then all missing docs are assumed to be non-relevant. -5. R-Precision (precision after R (= num_rel for a query) docs retrieved): - Measures precision (or recall, they're the same) after R docs - have been retrieved, where R is the total number of relevant docs - for a query. Thus if a query has 40 relevant docs, then precision - is measured after 40 docs, while if it has 600 relevant docs, precision - is measured after 600 docs. This avoids some of the averaging - problems of the 'precision at X docs' values in (4) above. - If R is greater than the number of docs retrieved for a query, then - the nonretrieved docs are all assumed to be nonrelevant. - -Major measures (again) with their relational names: -num_ret Total number of documents retrieved over all queries -num_rel Total number of relevant documents over all queries -num_rel_ret Total number of relevant documents retrieved over all queries -map Mean Average Precision (MAP) -gm_ap Average Precision. Geometric Mean, q_score=log(MAX(map,.00001)) -R-prec R-Precision (Precision after R (= num-rel for topic) documents retrieved) -bpref Binary Preference, top R judged nonrel -recip_rank Reciprical rank of top relevant document -ircl_prn.0.00 Interpolated Recall - Precision Averages at 0.00 recall -ircl_prn.0.10 Interpolated Recall - Precision Averages at 0.10 recall -ircl_prn.0.20 Interpolated Recall - Precision Averages at 0.20 recall -ircl_prn.0.30 Interpolated Recall - Precision Averages at 0.30 recall -ircl_prn.0.40 Interpolated Recall - Precision Averages at 0.40 recall -ircl_prn.0.50 Interpolated Recall - Precision Averages at 0.50 recall -ircl_prn.0.60 Interpolated Recall - Precision Averages at 0.60 recall -ircl_prn.0.70 Interpolated Recall - Precision Averages at 0.70 recall -ircl_prn.0.80 Interpolated Recall - Precision Averages at 0.80 recall -ircl_prn.0.90 Interpolated Recall - Precision Averages at 0.90 recall -ircl_prn.1.00 Interpolated Recall - Precision Averages at 1.00 recall -P5 Precision after 5 docs retrieved -P10 Precision after 10 docs retrieved -P15 Precision after 15 docs retrieved -P20 Precision after 20 docs retrieved -P30 Precision after 30 docs retrieved -P100 Precision after 100 docs retrieved -P200 Precision after 200 docs retrieved -P500 Precision after 500 docs retrieved -P1000 Precision after 1000 docs retrieved - - -Minor measures with their relational names: -exact_prec Exact Precision over retrieved set -exact_recall Exact Recall over retrieved set -11-pt_avg Average over all 11 points of recall-precision graph -3-pt_avg Average over 3 points of recall-precision graph -avg_doc_prec Rel doc precision averaged over all relevant docs (NOT over topics) -exact_relative_prec Exact relative precision -avg_relative_prec Average relative precision -exact_unranked_avg_prec Exact Unranked Average Precision -exact_relative_unranked_avg_prec Exact Relative Unranked Average Precision -map_at_R Average Precision over first R docs retrieved -int_map Interpolated Mean Average Precision -exact_int_R_rcl_prec Exact R-based-interpolated-Precision -int_map_at_R Average Interpolated Precision for first R docs retrieved -bpref_allnonrel Binary Preference, all judged nonrel -bpref_retnonrel Binary Preference, all retrieved judged nonrel -bpref_topnonrel Binary Preference, top 100 judged nonrel -bpref_top5Rnonrel Binary Preference, top 5R judged nonrel -bpref_top10Rnonrel Binary Preference, top 10R judged nonrel -bpref_top10pRnonrel Binary Preference, top 10 + R judged nonrel -bpref_top25pRnonrel Binary Preference, top 25 + R judged nonrel -bpref_top50pRnonrel Binary Preference, top 50 + R judged nonrel -bpref_top25p2Rnonrel Binary Preference, top 25 + 2*R judged nonrel -bpref_retall Binary Preference, Only retrieved judged rel and nonrel -bpref_5 Binary Preference, top 5 rel, top 5 nonrel -bpref_10 Binary Preference, top 10 rel, top 10 nonrel -bpref_num_all Binary Preference, Number not retrieved before (all judged) -bpref_num_ret Binary Preference, Number retrieved after -bpref_num_correct Binary Preference, Number correct preferences -bpref_num_possible Binary Preference, Number possible correct_preferences -old_bpref Buggy Version 7.3. Binary Preference, top R judged nonrel -old_bpref_top10pRnonrel Buggy Version 7.3. Binary Preference,top 10+R judged nonrel -gm_bpref Binary Preference, top R judged nonrel, Geometric Mean, q_score=log(MAX(bpref,.00001)) -rank_first_rel Rank of top relevant document (0 if none) -recall5 Recall after 5 docs retrieved -recall10 Recall after 10 docs retrieved -recall15 Recall after 15 docs retrieved -recall20 Recall after 20 docs retrieved -recall30 Recall after 30 docs retrieved -recall100 Recall after 100 docs retrieved -recall200 Recall after 200 docs retrieved -recall500 Recall after 500 docs retrieved -recall1000 Recall after 1000 docs retrieved -0.20R-prec R-based precision- precision after 0.20 * R docs retrieved -0.40R-prec R-based precision- precision after 0.40 * R docs retrieved -0.60R-prec R-based precision- precision after 0.60 * R docs retrieved -0.80R-prec R-based precision- precision after 0.80 * R docs retrieved -1.00R-prec R-based precision- precision after 1.00 * R docs retrieved -1.20R-prec R-based precision- precision after 1.20 * R docs retrieved -1.40R-prec R-based precision- precision after 1.40 * R docs retrieved -1.60R-prec R-based precision- precision after 1.60 * R docs retrieved -1.80R-prec R-based precision- precision after 1.80 * R docs retrieved -2.00R-prec R-based precision- precision after 2.00 * R docs retrieved -relative_prec5 Relative precision after 5 docs retrieved -relative_prec10 Relative precision after 10 docs retrieved -relative_prec15 Relative precision after 15 docs retrieved -relative_prec20 Relative precision after 20 docs retrieved -relative_prec30 Relative precision after 30 docs retrieved -relative_prec100 Relative precision after 100 docs retrieved -relative_prec200 Relative precision after 200 docs retrieved -relative_prec500 Relative precision after 500 docs retrieved -relative_prec1000 Relative precision after 1000 docs retrieved -unranked_avg_prec5 Unranked Average Precision after 5 docs retrieved -unranked_avg_prec10 Unranked Average Precision after 10 docs retrieved -unranked_avg_prec15 Unranked Average Precision after 15 docs retrieved -unranked_avg_prec20 Unranked Average Precision after 20 docs retrieved -unranked_avg_prec30 Unranked Average Precision after 30 docs retrieved -unranked_avg_prec100 Unranked Average Precision after 100 docs retrieved -unranked_avg_prec200 Unranked Average Precision after 200 docs retrieved -unranked_avg_prec500 Unranked Average Precision after 500 docs retrieved -unranked_avg_prec1000 Unranked Average Precision after 1000 docs retrieved -relative_unranked_avg_prec5 Relative Unranked Average Precision after 5 docs retrieved -relative_unranked_avg_prec10 Relative Unranked Average Precision after 10 docs retrieved -relative_unranked_avg_prec15 Relative Unranked Average Precision after 15 docs retrieved -relative_unranked_avg_prec20 Relative Unranked Average Precision after 20 docs retrieved -relative_unranked_avg_prec30 Relative Unranked Average Precision after 30 docs retrieved -relative_unranked_avg_prec100 Relative Unranked Average Precision after 100 docs retrieved -relative_unranked_avg_prec200 Relative Unranked Average Precision after 200 docs retrieved -relative_unranked_avg_prec500 Relative Unranked Average Precision after 500 docs retrieved -relative_unranked_avg_prec1000 Relative Unranked Average Precision after 1000 docs retrieved -utility_1.0_-1.0_0.0_0.0 Utility (a,b,c,d) Coefficients 1.0_-1.0_0.0_0.0 -rcl_at_142_nonrel Recall averaged at X nonrel docs X= 142 -fallout_recall_0 Fallout - Recall Averages- recall after 0 nonrel docs retrieved -fallout_recall_14 Fallout - Recall Averages- recall after 14 nonrel docs retrieved -fallout_recall_28 Fallout - Recall Averages- recall after 28 nonrel docs retrieved -fallout_recall_42 Fallout - Recall Averages- recall after 42 nonrel docs retrieved -fallout_recall_56 Fallout - Recall Averages- recall after 56 nonrel docs retrieved -fallout_recall_71 Fallout - Recall Averages- recall after 71 nonrel docs retrieved -fallout_recall_85 Fallout - Recall Averages- recall after 85 nonrel docs retrieved -fallout_recall_99 Fallout - Recall Averages- recall after 99 nonrel docs retrieved -fallout_recall_113 Fallout - Recall Averages- recall after 113 nonrel docs retrieved -fallout_recall_127 Fallout - Recall Averages- recall after 127 nonrel docs retrieved -fallout_recall_142 Fallout - Recall Averages- recall after 142 nonrel docs retrieved -int_0.20R-prec Interpolated R-based precision, after 0.20 * R docs retrieved -int_0.40R-prec Interpolated R-based precision, after 0.40 * R docs retrieved -int_0.60R-prec Interpolated R-based precision, after 0.60 * R docs retrieved -int_0.80R-prec Interpolated R-based precision, after 0.80 * R docs retrieved -int_1.00R-prec Interpolated R-based precision, after 1.00 * R docs retrieved -int_1.20R-prec Interpolated R-based precision, after 1.20 * R docs retrieved -int_1.40R-prec Interpolated R-based precision, after 1.40 * R docs retrieved -int_1.60R-prec Interpolated R-based precision, after 1.60 * R docs retrieved -int_1.80R-prec Interpolated R-based precision, after 1.80 * R docs retrieved -int_2.00R-prec Interpolated R-based precision, after 2.00 * R docs retrieved -micro_prec Total relevant retrieved documents / Total retrieved documents -micro_recall Total relevant retrieved documents / Total relevant documents -micro_bpref Total correct preferences / Total possible preferences diff --git a/sm_cnn/trec_eval-8.0/measures.c b/sm_cnn/trec_eval-8.0/measures.c deleted file mode 100755 index 8bf6263..0000000 --- a/sm_cnn/trec_eval-8.0/measures.c +++ /dev/null @@ -1,282 +0,0 @@ -#ifdef RCSID -static char rcsid[] = "$Header: /home/smart/release/src/libevaluate/tr_eval.c,v 11.0 1992/07/21 18:20:33 chrisb Exp chrisb $"; -#endif - -/* Copyright (c) 1991, 1990, 1984 - Gerard Salton, Chris Buckley. - - Permission is granted for use of this file in unmodified form for - research purposes. Please contact the SMART project to obtain - permission for other uses. -*/ - -#include "common.h" -#include "sysfunc.h" -#include "buf.h" -#include "trec_eval.h" - -static long cutoff[] = CUTOFF_VALUES; -static char param_val[20]; -char *get_param_str_ircl_prn(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%4.2f", (float) index / (NUM_RP_PTS -1)); - return (param_val); -} -char *get_param_str_cutoff(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%ld", cutoff[index]); - return (param_val); -} -char *get_param_str_Rcutoff(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%4.2f", - (float) MAX_RPREC * (index+1) /(float) (NUM_PREC_PTS - 1)); - return (param_val); -} -char *get_param_str_utility(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%3.1f_%3.1f_%3.1f_%3.1f", - epi->utility_a, epi->utility_b, epi->utility_c, epi->utility_d); - return (param_val); -} -char *get_param_str_maxfallout(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%ld", (long) MAX_FALL_RET); - return (param_val); -} -char *get_param_str_fall_recall(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%ld", - (long) (MAX_FALL_RET * index) / (NUM_FR_PTS - 1)); - return (param_val); -} -char *get_param_str_time_cutoff(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%ld", - (long) (index * MAX_TIME / NUM_TIME_PTS)); - return (param_val); -} -char *get_param_str_time_utility_cutoff(epi, index) -EVAL_PARAM_INFO *epi; -long index; -{ - sprintf (param_val, "%3.1f_%3.1f_%3.1f_%3.1f-%ld", - epi->utility_a, epi->utility_b, epi->utility_c, epi->utility_d, - (long) (index * MAX_TIME / NUM_TIME_PTS)); - return (param_val); -} - -SINGLE_MEASURE sing_meas[] = { - {"num_ret", "Total number of documents retrieved over all queries", - 1, 1, 0, 0, 0, 0, 0, 0, offsetof(TREC_EVAL, num_ret)}, - {"num_rel", "Total number of relevant documents over all queries", - 1, 1, 0, 0, 0, 0, 0, 0, offsetof(TREC_EVAL, num_rel)}, - {"num_rel_ret", "Total number of relevant documents retrieved over all queries", - 1, 1, 0, 0, 0, 0, 0, 0, offsetof(TREC_EVAL, num_rel_ret)}, - {"map", "Mean Average Precision (MAP)", - 0, 1, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_recall_precis)}, - {"gm_ap","Average Precision. Geometric Mean, q_score=log(MAX(map,.00001))", - 0, 1, 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, gm_ap)}, - {"R-prec", "R-Precision (Precision after R (= num-rel for topic) documents retrieved)", - 0, 1, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, R_recall_precis)}, - {"bpref", "Binary Preference, top R judged nonrel", - 0, 1, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref)}, - {"recip_rank", "Reciprical rank of top relevant document", - 0, 1, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, recip_rank)}, - /* end of short output measures (the major ones) */ - - {"exact_prec", "Exact Precision over retrieved set", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, exact_precis)}, - {"exact_recall", "Exact Recall over retrieved set", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, exact_recall)}, - {"11-pt_avg", "Average over all 11 points of recall-precision graph", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, int_av11_recall_precis)}, - {"3-pt_avg", "Average over 3 points of recall-precision graph", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, int_av3_recall_precis)}, - {"avg_doc_prec", "Rel doc precision averaged over all relevant docs (NOT over topics)", - 0, 0, 0, 0, 0, 0, 1, 0, offsetof(TREC_EVAL, avg_doc_prec)}, - {"exact_relative_prec", "Exact relative precision", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, exact_rel_precis)}, - {"avg_relative_prec", "Average relative precision", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_rel_precis)}, - {"exact_unranked_avg_prec", "Exact Unranked Average Precision", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, exact_uap)}, - {"exact_relative_unranked_avg_prec", "Exact Relative Unranked Average Precision", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, exact_rel_uap)}, - {"map_at_R", "Average Precision over first R docs retrieved", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_R_precis)}, - {"int_map", "Interpolated Mean Average Precision", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, int_av_recall_precis)}, - {"exact_int_R_rcl_prec", "Exact R-based-interpolated-Precision", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, int_R_recall_precis)}, - {"int_map_at_R", "Average Interpolated Precision for first R docs retrieved", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, int_av_R_precis)}, - {"time_integral_prec", "Time: Average Integral Precision", - 0, 0, 1, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_time_precis)}, - {"time_integral_relative_prec", "Time: Average Integral Relative Precision", - 0, 0, 1, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_time_relprecis)}, - {"time_integral_uap", "Time: Average Integral Unranked Precision", - 0, 0, 1, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_time_uap)}, - {"time_integral_relative_uap", "Time: Average Integral Unranked Relative Precision", - 0, 0, 1, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_time_reluap)}, - {"time_integral_cum_rel", "Time: Average (Integral) cumulative number relevant", - 0, 0, 1, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, av_time_cum_rel)}, - {"bpref_allnonrel", "Binary Preference, all judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_allnonrel)}, - {"bpref_retnonrel", "Binary Preference, all retrieved judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_retnonrel)}, - {"bpref_topnonrel", "Binary Preference, top 100 judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_topnonrel)}, - {"bpref_top5Rnonrel", "Binary Preference, top 5R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_top5Rnonrel)}, - {"bpref_top10Rnonrel", "Binary Preference, top 10R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_top10Rnonrel)}, - {"bpref_top10pRnonrel", "Binary Preference, top 10 + R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_top10pRnonrel)}, - {"bpref_top25pRnonrel", "Binary Preference, top 25 + R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_top25pRnonrel)}, - {"bpref_top50pRnonrel", "Binary Preference, top 50 + R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_top50pRnonrel)}, - {"bpref_top25p2Rnonrel", "Binary Preference, top 25 + 2*R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_top25p2Rnonrel)}, - {"bpref_retall", "Binary Preference, Only retrieved judged rel and nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_retall)}, - {"bpref_5", "Binary Preference, top 5 rel, top 5 nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_5)}, - {"bpref_10", "Binary Preference, top 10 rel, top 10 nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_10)}, - {"bpref_num_all", "Binary Preference, Number not retrieved before (all judged)", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_num_all)}, - {"bpref_num_ret", "Binary Preference, Number retrieved after", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, bpref_num_ret)}, - {"bpref_num_correct", "Binary Preference, Number correct preferences", - 1, 0, 0, 0, 0, 0, 0, 0, offsetof(TREC_EVAL, bpref_num_correct)}, - {"bpref_num_possible", "Binary Preference, Number possible correct_preferences", - 1, 0, 0, 0, 0, 0, 0, 0, offsetof(TREC_EVAL, bpref_num_possible)}, - {"old_bpref", "Buggy Version 7.3. Binary Preference, top R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, old_bpref)}, - {"old_bpref_top10pRnonrel", "Buggy Version 7.3. Binary Preference,top 10+R judged nonrel", - 0, 0, 0, 0, 0, 1, 0, 0, offsetof(TREC_EVAL, old_bpref_top10pRnonrel)}, - {"gm_bpref", "Binary Preference, top R judged nonrel, Geometric Mean, q_score=log(MAX(bpref,.00001))", - 0, 0, 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, gm_bpref)}, - {"rank_first_rel", "Rank of top relevant document (0 if none)", - 1, 0, 0, 1, 0, 0, 0, 0, offsetof(TREC_EVAL, rank_first_rel)}, -}; - -int num_sing_meas = sizeof (sing_meas) / sizeof (sing_meas[0]); - -PARAMETERIZED_MEASURE param_meas[] = { - {"Interpolated Recall - Precision Averages", - 0, 1, 0, 0, 0, 1, offsetof(TREC_EVAL, int_recall_precis[0]), NUM_RP_PTS, - "ircl_prn.%s", " at %s recall", - get_param_str_ircl_prn}, - {"Precision", - 0, 1, 0, 0, 0, 1, offsetof(TREC_EVAL, precis_cut[0]), NUM_CUTOFF, - "P%s", " after %s docs retrieved", - get_param_str_cutoff}, - /* end of short output measures (the major ones) */ - - {"Recall", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, recall_cut[0]), NUM_CUTOFF, - "recall%s", " after %s docs retrieved", - get_param_str_cutoff}, - {"R-based precision", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, R_prec_cut[0]), NUM_PREC_PTS-1, - "%sR-prec", "- precision after %s * R docs retrieved", - get_param_str_Rcutoff}, - {"Relative precision", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, rel_precis_cut[0]), NUM_CUTOFF, - "relative_prec%s", " after %s docs retrieved", - get_param_str_cutoff}, - {"Unranked Average Precision", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, uap_cut[0]), NUM_CUTOFF, - "unranked_avg_prec%s", " after %s docs retrieved", - get_param_str_cutoff}, - {"Relative Unranked Average Precision", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, rel_uap_cut[0]), NUM_CUTOFF, - "relative_unranked_avg_prec%s", " after %s docs retrieved", - get_param_str_cutoff}, - {"Utility (a,b,c,d)", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, exact_utility), 1, - "utility_%s", " Coefficients %s ", - get_param_str_utility}, - {"Recall averaged at X nonrel docs", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, av_fall_recall), 1, - "rcl_at_%s_nonrel", " X= %s ", - get_param_str_maxfallout}, - {"Fallout - Recall Averages", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, fall_recall[0]), NUM_FR_PTS, - "fallout_recall_%s", "- recall after %s nonrel docs retrieved", - get_param_str_fall_recall}, - {"Interpolated R-based precision,", - 0, 0, 0, 0, 0, 1, offsetof(TREC_EVAL, int_R_prec_cut[0]), NUM_PREC_PTS-1, - "int_%sR-prec", " after %s * R docs retrieved", - get_param_str_Rcutoff}, - {"Time: Utility (a,b,c,d):", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, av_time_utility), 1, - "time_integral_utility_%s", " Coefficients %s ", - get_param_str_utility}, - {"Time: num_rel at cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_num_rel[0]), NUM_TIME_PTS, - "time_num_rel_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: num_nonrel at cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_num_nrel[0]), NUM_TIME_PTS, - "time_num_nonrel_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: cumulative rel at cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_cum_rel[0]), NUM_TIME_PTS, - "time_cum_rel_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: precision at time cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_precis[0]), NUM_TIME_PTS, - "time_precis_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: precision at time cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_precis[0]), NUM_TIME_PTS, - "time_precis_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: relative precision at time cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_relprecis[0]), NUM_TIME_PTS, - "time_relative_precis_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: unranked precision at time cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_uap[0]), NUM_TIME_PTS, - "time_uap_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: relative unranked precision at time cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_reluap[0]), NUM_TIME_PTS, - "time_relative_uap_%s", " after %s seconds", - get_param_str_time_cutoff}, - {"Time: utility at time cutoff:", - 0, 0, 1, 0, 0, 1, offsetof(TREC_EVAL, time_utility[0]), NUM_TIME_PTS, - "time_utility_%s", " after %s seconds", - get_param_str_time_utility_cutoff}, -}; - -int num_param_meas = sizeof (param_meas) / sizeof (param_meas[0]); - -MICRO_MEASURE micro_meas[] = { - {"micro_prec", "Total relevant retrieved documents / Total retrieved documents", - 0, offsetof(TREC_EVAL, num_rel_ret), offsetof(TREC_EVAL, num_ret)}, - {"micro_recall", "Total relevant retrieved documents / Total relevant documents", - 0, offsetof(TREC_EVAL, num_rel_ret), offsetof(TREC_EVAL, num_rel)}, - {"micro_bpref", "Total correct preferences / Total possible preferences", - 0, offsetof(TREC_EVAL, bpref_num_correct), offsetof(TREC_EVAL, bpref_num_possible)}, -}; - -int num_micro_meas = sizeof (micro_meas) / sizeof (micro_meas[0]); - diff --git a/sm_cnn/trec_eval-8.0/print_meas.c b/sm_cnn/trec_eval-8.0/print_meas.c deleted file mode 100755 index e478e3c..0000000 --- a/sm_cnn/trec_eval-8.0/print_meas.c +++ /dev/null @@ -1,336 +0,0 @@ -#ifdef RCSID -static char rcsid[] = "$Header: /home/smart/release/src/libevaluate/tr_eval.c,v 11.0 1992/07/21 18:20:33 chrisb Exp chrisb $"; -#endif - -/* Copyright (c) 1991, 1990, 1984 - Gerard Salton, Chris Buckley. - - Permission is granted for use of this file in unmodified form for - research purposes. Please contact the SMART project to obtain - permission for other uses. -*/ - -#include "common.h" -#include "sysfunc.h" -#include "buf.h" -#include "trec_eval.h" - -static SM_BUF internal_output = {0, 0, (char *) 0}; -int add_buf_string(); - -extern SINGLE_MEASURE sing_meas[]; -extern PARAMETERIZED_MEASURE param_meas[]; -extern MICRO_MEASURE micro_meas[]; -extern int num_param_meas, num_sing_meas, num_micro_meas; - -int -accumulate_results (query_eval, accum_eval) -TREC_EVAL *query_eval; -TREC_EVAL *accum_eval; -{ - long i,j; - float *float_query, *float_accum; - long *long_query, *long_accum; - - if (query_eval->num_ret <= 0) - return (0); - - accum_eval->num_queries++; - - for (i = 0; i < num_sing_meas; i++) { - if (sing_meas[i].is_long_flag) { - long_query = (long *) (((char *) query_eval) + - sing_meas[i].byte_offset); - long_accum = (long *) (((char *) accum_eval) + - sing_meas[i].byte_offset); - *long_accum += *long_query; - } - else { - float_query = (float *) (((char *) query_eval) + - sing_meas[i].byte_offset); - float_accum = (float *) (((char *) accum_eval) + - sing_meas[i].byte_offset); - *float_accum += *float_query; - } - } - - for (i = 0; i < num_param_meas; i++) { - for (j = 0; j < param_meas[i].num_values; j++) { - if (param_meas[i].is_long_flag) { - long_query = (long *) (((char *) query_eval) + - param_meas[i].byte_offset); - long_accum = (long *) (((char *) accum_eval) + - param_meas[i].byte_offset); - long_accum[j] += long_query[j]; - } - else { - float_query = (float *) (((char *) query_eval) + - param_meas[i].byte_offset); - float_accum = (float *) (((char *) accum_eval) + - param_meas[i].byte_offset); - float_accum[j] += float_query[j]; - } - } - } - - return (0); -} - -void -print_rel_trec_eval_list (is_single_query_flag, epi, eval, output) -long is_single_query_flag; -EVAL_PARAM_INFO *epi; -TREC_EVAL *eval; -SM_BUF *output; -{ - long i,j; - char temp_buf[1024]; - char q_buf[20]; - char name_buf[80]; - SM_BUF *out_p; - long long_eval; - float float_eval; - - if (output == NULL) { - out_p = &internal_output; - out_p->end = 0; - } - else - out_p = output; - - if (is_single_query_flag) { - (void) sprintf (q_buf, "%.20s", eval[0].qid); - } - else { - (void) sprintf (q_buf, "%s", "all"); - (void) sprintf (temp_buf, "%-15s\t%s\t%ld\n", - "num_q", q_buf, eval->num_queries); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - - for (i = 0; i < num_sing_meas; i++) { - if ((! sing_meas[i].print_short_flag) && (! epi->all_flag)) - continue; - if (sing_meas[i].print_time_flag && (!epi->time_flag)) - continue; - if (sing_meas[i].print_only_query_flag && (!is_single_query_flag)) - continue; - if (sing_meas[i].print_only_average_flag && (is_single_query_flag)) - continue; - if (sing_meas[i].is_long_flag) { - long_eval = *((long *) (((char *) eval) + - sing_meas[i].byte_offset)); - if (sing_meas[i].avg_results_flag) - long_eval /= eval->num_queries; - (void) sprintf (temp_buf, "%-15s\t%s\t%ld\n", - sing_meas[i].name, q_buf, long_eval); - } - else { - float_eval = *((float *) (((char *) eval) + - sing_meas[i].byte_offset)); - if (sing_meas[i].avg_results_flag) - float_eval /= eval->num_queries; - else if (sing_meas[i].avg_rel_results_flag && eval->num_rel > 0) - /* average over number of rel docs instead of number queries */ - float_eval /= eval->num_rel; - else if (sing_meas[i].gm_results_flag) { - /* computing geometric mean instead of mean */ - if (!is_single_query_flag && epi->average_complete_flag) - /* Must patch up averages for any missing queries, since */ - /* value of 0 means perfection */ - float_eval += (eval->num_queries - eval->num_orig_queries)* - log (MIN_GEO_MEAN); - float_eval = (float) exp ((double) (float_eval / - eval->num_queries)); - } - (void) sprintf (temp_buf, "%-15s\t%s\t%6.4f\n", - sing_meas[i].name, q_buf, float_eval); - } - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - - for (i = 0; i < num_param_meas; i++) { - if ((! param_meas[i].print_short_flag) && (! epi->all_flag)) - continue; - if (param_meas[i].print_time_flag && (!epi->time_flag)) - continue; - if (param_meas[i].print_only_query_flag && (!is_single_query_flag)) - continue; - if (param_meas[i].print_only_average_flag && (is_single_query_flag)) - continue; - for (j = 0; j < param_meas[i].num_values; j++) { - sprintf (name_buf, param_meas[i].format_string, - param_meas[i].get_param_str (epi, j)); - if (param_meas[i].is_long_flag) { - long_eval = ((long *) (((char *) eval) + - param_meas[i].byte_offset))[j]; - if (param_meas[i].avg_results_flag) - long_eval /= eval->num_queries; - (void) sprintf (temp_buf, "%-15s\t%s\t%ld\n", - name_buf, q_buf, long_eval); - } - else { - float_eval = ((float *) (((char *) eval) + - param_meas[i].byte_offset))[j]; - if (param_meas[i].avg_results_flag) - float_eval /= eval->num_queries; - (void) sprintf (temp_buf, "%-15s\t%s\t%6.4f\n", - name_buf, q_buf, float_eval); - } - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - } - - if (! is_single_query_flag) { - long denom_long_eval; - for (i = 0; i < num_micro_meas; i++) { - if ((! micro_meas[i].print_short_flag) && (! epi->all_flag)) - continue; - long_eval = *((long *) (((char *) eval) + - micro_meas[i].numerator_byte_offset)); - denom_long_eval = *((long *) (((char *) eval) + - micro_meas[i].denominator_byte_offset)); - float_eval = (float) long_eval / (float) denom_long_eval; - (void) sprintf (temp_buf, "%-15s\t%s\t%6.4f\n", - micro_meas[i].name, q_buf, float_eval); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - } - - if (output == NULL) { - (void) fwrite (out_p->buf, 1, out_p->end, stdout); - out_p->end = 0; - } -} - -static long cutoff[] = CUTOFF_VALUES; - -void -old_print_trec_eval_list (epi, eval, num_runs, output) -EVAL_PARAM_INFO *epi; -TREC_EVAL *eval; -int num_runs; -SM_BUF *output; -{ - long i,j; - char temp_buf[1024]; - SM_BUF *out_p; - - if (output == NULL) { - out_p = &internal_output; - out_p->end = 0; - } - else - out_p = output; - - /* Print total numbers retrieved/rel for all runs */ - if (UNDEF == add_buf_string("\nQueryid (Num):\t", out_p)) - return; - for (i = 0; i < num_runs; i++) { - if (UNDEF == add_buf_string (eval->qid, out_p)) - return; - } - if (UNDEF == add_buf_string("\nTotal number of documents over all queries", - out_p)) - return; - if (UNDEF == add_buf_string("\n Retrieved:", out_p)) - return; - for (i = 0; i < num_runs; i++) { - (void) sprintf (temp_buf, " %5ld", eval[i].num_ret); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - if (UNDEF == add_buf_string("\n Relevant: ", out_p)) - return; - for (i = 0; i < num_runs; i++) { - (void) sprintf (temp_buf, " %5ld", eval[i].num_rel); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - if (UNDEF == add_buf_string("\n Rel_ret: ", out_p)) - return; - for (i = 0; i < num_runs; i++) { - (void) sprintf (temp_buf, " %5ld", eval[i].num_rel_ret); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - - /* Print recall precision figures at NUM_RP_PTS recall levels */ - if (UNDEF == add_buf_string - ("\nInterpolated Recall - Precision Averages:", out_p)) - return; - for (j = 0; j < NUM_RP_PTS; j++) { - (void) sprintf (temp_buf, "\n at %4.2f ", - (float) j / (NUM_RP_PTS - 1)); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - for (i = 0; i < num_runs; i++) { - (void) sprintf (temp_buf, " %6.4f ", - eval[i].int_recall_precis[j] /eval[i].num_queries); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - } - - /* Print average recall precision and percentage improvement */ - (void) sprintf (temp_buf, - "\nAverage precision (non-interpolated) for all rel docs(averaged over queries)\n "); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - for (i = 0; i < num_runs; i++) { - (void) sprintf (temp_buf, " %6.4f ", - eval[i].av_recall_precis / eval[i].num_queries); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - if (num_runs > 1) { - (void) sprintf (temp_buf, "\n %% Change: "); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - for (i = 1; i < num_runs; i++) { - (void) sprintf (temp_buf, " %6.1f ", - (((eval[i].av_recall_precis / eval[i].num_queries)/ - (eval[0].av_recall_precis / eval[i].num_queries)) - - 1.0) * 100.0); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - } - (void) sprintf (temp_buf, "\nPrecision:"); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - for (j = 0; j < NUM_CUTOFF; j++) { - (void) sprintf (temp_buf, "\n At %4ld docs:", cutoff[j]); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - for (i = 0; i < num_runs; i++) { - (void) sprintf (temp_buf, " %6.4f", - eval[i].precis_cut[j] / eval[i].num_queries); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - } - - (void) sprintf (temp_buf, "\nR-Precision (precision after R (= num_rel for a query) docs retrieved):\n Exact: "); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - for (i = 0; i < num_runs; i++) { - (void) sprintf (temp_buf, " %6.4f", - eval[i].R_recall_precis / eval[i].num_queries); - if (UNDEF == add_buf_string (temp_buf, out_p)) - return; - } - - if (UNDEF == add_buf_string ("\n", out_p)) - return; - - if (output == NULL) { - (void) fwrite (out_p->buf, 1, out_p->end, stdout); - out_p->end = 0; - } - return; -} - diff --git a/sm_cnn/trec_eval-8.0/smart_error.h b/sm_cnn/trec_eval-8.0/smart_error.h deleted file mode 100755 index 78d7523..0000000 --- a/sm_cnn/trec_eval-8.0/smart_error.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef SMART_ERRORH -#define SMART_ERRORH -#include -#define SMART_MINERR 1000 -#define SM_INCON_ERR 1000 -#define SM_ILLSK_ERR 1001 -#define SM_ILLMD_ERR 1002 -#define SM_ILLPA_ERR 1003 -#define SMART_NUMERR 4 - - -extern int errno; -extern int smart_errno; /* If > 0 and <= sys_nerr then refers to */ - /* sys_errlist, else if >= smart_errmin */ - /* and <= smart_errmax, then smart_errlist */ -extern char *smart_message; /* Message to be printed (often filename) */ -extern char *smart_routine; /* Major routine issuing error message */ - - -#define set_error(n,m,r) { if (n > 0) smart_errno = n;\ - smart_message = m;\ - smart_routine = r; } -#define clr_err() smart_errno = errno = 0 -#endif /* SMART_ERRORH */ diff --git a/sm_cnn/trec_eval-8.0/sysfunc.h b/sm_cnn/trec_eval-8.0/sysfunc.h deleted file mode 100755 index 64021da..0000000 --- a/sm_cnn/trec_eval-8.0/sysfunc.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef SYSFUNCH -#define SYSFUNCH -/* Declarations of major functions within standard C libraries */ -/* Once all of the major systems get their act together (and I follow - suit!), this file should just include system header files from - /usr/include. Until then... */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* For time being, define Berkeley constructs in terms of SVR4 constructs*/ -#define bzero(dest,len) memset(dest,'\0',len) -#define bcopy(source,dest,len) memcpy(dest,source,len) -#define srandom(seed) srand(seed) -#define random() rand() - -/* ANSI should give us an offsetof suitable for the implementation; - * otherwise, try a non-portable but commonly supported definition - */ -#ifdef __STDC__ -#include -#endif -#ifndef offsetof -#define offsetof(type, member) ((size_t) \ - ((char *)&((type*)0)->member - (char *)(type *)0)) -#endif - -#endif /* SYSFUNCH */ diff --git a/sm_cnn/trec_eval-8.0/tr_vec.h b/sm_cnn/trec_eval-8.0/tr_vec.h deleted file mode 100755 index 4b5b868..0000000 --- a/sm_cnn/trec_eval-8.0/tr_vec.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef TR_VECH -#define TR_VECH -/* $Header: /home/smart/release/./src/h/tr_vec.h,v 10.1 91/11/05 23:47:35 smart Exp Locker: smart $*/ - -typedef struct { - long did; /* document id */ - long rank; /* Rank of this document */ - char action; /* what action a user has taken with doc */ - char rel; /* whether doc judged relevant(1) or not(0) */ - char iter; /* Number of feedback runs for this query */ - char trtup_unused; /* Presently unused field */ - float sim; /* similarity of did to qid */ -} TR_TUP; - -typedef struct { - char *qid; /* query id */ - long num_tr; /* Number of tuples for tr_vec */ - TR_TUP *tr; /* tuples. Invariant: tr sorted increasing did */ -} TR_VEC; - -#endif /* TR_VECH */ diff --git a/sm_cnn/trec_eval-8.0/trec_eval.c b/sm_cnn/trec_eval-8.0/trec_eval.c deleted file mode 100755 index b85b8a7..0000000 --- a/sm_cnn/trec_eval-8.0/trec_eval.c +++ /dev/null @@ -1,256 +0,0 @@ -static char *VersionID = VERSIONID; -/* "Version 7.3 trec_eval Dec 15, 2004"; */ - -/* Copyright (c) 2004, 2003, 1991, 1990, 1984 - Chris Buckley. */ - -/******************** PROCEDURE DESCRIPTION ************************ - *0 Take TREC results text file, TREC qrels file, and evaluate - *1 local.convert.obj.trec_eval - *2 trec_eval [-q] [-a] [-t] [-o] [-v] [-n num] trec_rel_file trec_top_file - - *7 Read text tuples from trec_top_file of the form - *7 030 Q0 ZF08-175-870 0 4238 prise1 - *7 qid iter docno rank sim run_id - *7 giving TREC document numbers (a string) retrieved by query qid - *7 (an integer) with similarity sim (a float). The other fields are ignored. - *7 Input is asssumed to be sorted numerically by qid. - *7 Sim is assumed to be higher for the docs to be retrieved first. - *7 Relevance for each docno to qid is determined from text_qrels_file, which - *7 consists of text tuples of the form - *7 qid iter docno rel - *7 giving TREC document numbers (a string) and their relevance to query qid - *7 (an integer). Tuples are asssumed to be sorted numerically by qid. - *7 The text tuples with relevence judgements are converted to TR_VEC form - *7 and then submitted to the evaluation routines. - *7 - *7 -q: In addition to summary evaluation, give evaluation for each query - *7 -a: Print all evaluation measures calculated, instead of just the - *7 official measures for TREC 2. - *7 -o: Print everything out in old, non-relational format - *7 -v: Print version number and exit - *7 -h: Print full help message and exit - *7 -t: Treat similarity as time that document retrieved. Compute - *7 several time-based measures after ranking docs by time retrieved - *7 (first doc (lowest sim) retrieved ranked highest). - *7 Only done if -a selected. - *7 -J: Calculate all measures only over judged documents that appear - *7 in qrels. (DO NOT USE) - *7 -n: following integer is the number of queries to average over. - *7 -ua: Value to use for 'a' coefficient of utility computation. - *7 -ub: Value to use for 'b' coefficient of utility computation. - *7 -uc: Value to use for 'c' coefficient of utility computation. - *7 -ud: Value to use for 'd' coefficient of utility computation. - *7 -N: Number of docs in collection - *7 -M:Max number of results to evaluate per topic - - *8 Procedure is to read all the docs retrieved for a query, and all the - *8 relevant docs for that query, - *8 sort and rank the retrieved docs by sim/docno, - *8 and look up docno in the relevant docs to determine relevance. - *8 The qid,did,rank,sim,rel fields of of TR_VEC are filled in; - *8 action,iter fields are set to 0. - *8 Queries for which there are no relevant docs are ignored completely. - -***********************************************************************/ - -#include "common.h" -#include "sysfunc.h" -#include "smart_error.h" -#include "tr_vec.h" -#include "trec_eval.h" -#include "buf.h" - -void print_error(); -void old_print_trec_eval_list(); -void print_rel_trec_eval_list(); - -int trec_eval_help(EVAL_PARAM_INFO *epi); -int accumulate_results (TREC_EVAL *query_eval, TREC_EVAL *accum_eval); -int get_top (char *trec_top_file, ALL_TREC_TOP *all_trec_top); -int get_qrels (char *text_qrels_file, ALL_TREC_QRELS *all_trec_qrels); -int form_trvec (EVAL_PARAM_INFO *ep, TREC_TOP *trec_top, - TREC_QRELS *trec_qrels, TR_VEC *tr_vec, long *num_rel); -int trvec_trec_eval (EVAL_PARAM_INFO *epi, TR_VEC *tr_vec, - TREC_EVAL *eval, long num_rel, long num_nonrel); - -static char *usage = "Usage: trec_eval [-h] [-q] [-a] [-o] [-v] trec_rel_file trec_top_file\n\ - -h: Give full help information, including other options\n\ - -q: In addition to summary evaluation, give evaluation for each query\n\ - -a: Print all evaluation measures, instead of just official measures\n\ - -o: Print requested measures in old non-relational format\n"; - - -int -main (argc, argv) -int argc; -char *argv[]; -{ - char *trec_rel_file, *trec_top_file; - ALL_TREC_TOP all_trec_top; - ALL_TREC_QRELS all_trec_qrels; - TREC_EVAL accum_eval, query_eval; - TR_VEC tr_vec; - long num_rel; - long num_eval_q; - long i,j; - EVAL_PARAM_INFO epi; - - /* Initialize static info before getting program optional args */ - epi.query_flag = epi.all_flag = epi.time_flag = epi.average_complete_flag = 0; - epi.judged_docs_only_flag = 0; - epi.relation_flag = 1; - epi.utility_a = UTILITY_A; epi.utility_b = UTILITY_B; - epi.utility_c = UTILITY_C; epi.utility_d = UTILITY_D; - epi.num_docs_in_coll = 0; - epi.relevance_level = 1; - epi.max_num_docs_per_topic = MAXLONG; - - /* Should use getopts, but some people may not have it. */ - /* This keeps growing over the years. Should redo */ - while (argc > 1 && argv[1][0] == '-') { - if (argv[1][1] == 'q') - epi.query_flag++; - else if (argv[1][1] == 'v') { - fprintf (stderr, "trec_eval version %s\n", VersionID); - exit (0); - } - else if (argv[1][1] == 'h') { - (void) trec_eval_help(&epi); - exit (0); - } - else if (argv[1][1] == 'a') - epi.all_flag++; - else if (argv[1][1] == 'o') - epi.relation_flag = 0; - else if (argv[1][1] == 'c') { - epi.average_complete_flag++; - } - else if (argv[1][1] == 'l') { - epi.relevance_level = atol (&argv[1][2]); - } - else if (argv[1][1] == 'J') { - epi.judged_docs_only_flag++; - } - else if (argv[1][1] == 'N') - epi.num_docs_in_coll = atol (&argv[1][2]); - else if (argv[1][1] == 'M') - epi.max_num_docs_per_topic = atol (&argv[1][2]); - else if (argv[1][1] == 'U') { - if (argv[1][2] == 'a') - epi.utility_a = atof (&argv[1][3]); - else if (argv[1][2] == 'b') - epi.utility_b = atof (&argv[1][3]); - else if (argv[1][2] == 'c') - epi.utility_c = atof (&argv[1][3]); - else if (argv[1][2] == 'd') - epi.utility_d = atof (&argv[1][3]); - else { - (void) fputs (usage,stderr); - exit (1); - } - } - else if (argv[1][1] == 'T') - epi.time_flag++; - else { - (void) fputs (usage,stderr); - exit (1); - } - argc--; argv++; - } - - if (argc != 3) { - (void) fputs (usage,stderr); - exit (1); - } - - trec_rel_file = argv[1]; - trec_top_file = argv[2]; - - /* Get qrels and top results information for all queries from the - input text files */ - if (UNDEF == get_qrels (trec_rel_file, &all_trec_qrels) || - UNDEF == get_top (trec_top_file, &all_trec_top)) { - print_error ("trec_eval: input error", "Quit"); - exit (2); - } - - /* For each topic which has both qrels and top results information, - calculate, possibly print (if query_flag), and accumulate - evaluation measures. */ - num_eval_q = 0; - (void) memset ((void *) &accum_eval, 0, sizeof (TREC_EVAL)); - accum_eval.qid = "All"; - - for (i = 0; i < all_trec_top.num_q_tr; i++) { - /* Find rel info for this query (skip if no rel info) */ - for (j = 0; j < all_trec_qrels.num_q_qrels; j++) { - if (0 == strcmp (all_trec_top.trec_top[i].qid, - all_trec_qrels.trec_qrels[j].qid)) - break; - } - if (j >= all_trec_qrels.num_q_qrels) - continue; - - /* Form results/rel into SMART TR_VEC form */ - if (UNDEF == form_trvec (&epi, - &all_trec_top.trec_top[i], - &all_trec_qrels.trec_qrels[j], - &tr_vec, - &num_rel)) { - print_error ("trec_eval: form_tr_vec error", "Quit"); - exit (3); - } - - /* Evaluate results/rel for this query */ - if (UNDEF == trvec_trec_eval (&epi, - &tr_vec, - &query_eval, - num_rel, - all_trec_qrels.trec_qrels[j].num_text_qrels - num_rel)) { - print_error ("trec_eval: evaluation error", "Quit"); - exit (4); - } - - /* Print results for this query, if desired */ - if (epi.query_flag) { - if (epi.relation_flag) - print_rel_trec_eval_list (1, &epi, &query_eval, (SM_BUF *) NULL); - else - old_print_trec_eval_list (&epi, &query_eval, 1, (SM_BUF *) NULL); - } - - /* Accumulate results for later averaging */ - if (UNDEF == accumulate_results (&query_eval, &accum_eval)) { - print_error ("trec_eval: accumulation error", "Quit"); - exit (5); - } - - num_eval_q++; - } - - /******** REMOVE THIS ONCE WARNING FLAG ADDED */ - /* Warn if numq_flag_num < num_eval_q */ - if (num_eval_q == 0) { - set_error (SM_INCON_ERR, - "No queries with both results and relevance info", - "trec_eval"); - return (UNDEF); - print_error ("trec_eval", "Quit"); - exit (6); - } - - if (epi.average_complete_flag) { - /* Want to average over possibly missing queries. Pass in actual - * number of queries in num_orig_queries */ - accum_eval.num_orig_queries = accum_eval.num_queries; - accum_eval.num_queries = all_trec_qrels.num_q_qrels; - } - - /* Print final evaluation results */ - if (epi.relation_flag) - print_rel_trec_eval_list (0, &epi, &accum_eval, (SM_BUF *) NULL); - else - old_print_trec_eval_list (&epi, &accum_eval, 1, (SM_BUF *) NULL); - - exit (0); -} diff --git a/sm_cnn/trec_eval-8.0/trec_eval.h b/sm_cnn/trec_eval-8.0/trec_eval.h deleted file mode 100755 index 54859af..0000000 --- a/sm_cnn/trec_eval-8.0/trec_eval.h +++ /dev/null @@ -1,353 +0,0 @@ -#ifndef TRECEVALH -#define TRECEVALH - -/* Static state info; set at beginning, possibly from program options, */ -/* but then remains constant throughout. */ -typedef struct { - long query_flag; /* 0. If set, evaluation output will be - printed for each query, in addition - to summary at end. */ - long all_flag; /* 0. If set, all evaluation measures will - be printed instead of just the - final TREC 2 measures. */ - long time_flag; /* 0. If set, calculate time-based measures*/ - long relation_flag; /* 1. If set, print in relational form */ - long average_complete_flag; /* 0. If set, average over the complete set - of relevance judgements (qrels), instead - of the number of queries - in the intersection of qrels and result */ - long judged_docs_only_flag; /* 0. If set, throw out all unjudged docs - for the retrieved set before calculating - any measures. */ - double utility_a; /* UTILITY_A. Default utility values */ - double utility_b; /* UTILITY_B. Default utility values */ - double utility_c; /* UTILITY_C. Default utility values */ - double utility_d; /* UTILITY_D. Default utility values */ - long num_docs_in_coll; /* 0. number of docs in collection */ - long relevance_level; /* 1. In relevance judgements, the level at - which a doc is considered relevant for - this evaluation */ - long max_num_docs_per_topic; /* MAXLONG. evaluate only this many docs */ -} EVAL_PARAM_INFO; - -/* Measure characteristics (how to print them, average them). */ -/* List of measures is in measures.c */ -/* Three types of measures: - single measures - single measure and name - parameterized measures - arrays of a measure, whose measure name - depends on parameter (eg P5, P10) - micro measures - measures defined as the micro average over all - docs retrieved independent of topic. Only calculated - and printed for the "all" pseudo-query. - Eg micro_prec = num_rel_ret / num_ret -*/ -typedef struct { - char *name; - char *long_name; - unsigned char is_long_flag; /* otherwise float */ - unsigned char print_short_flag; /* if set, measure is always printed - (not just if all_flag set) */ - unsigned char print_time_flag; /* if set, measure is printed only - if time_flag is set */ - unsigned char print_only_query_flag; /* if set, measure is printed only - when printing individual query output*/ - unsigned char print_only_average_flag; /* if set, measure is printed only - when printing overall average output*/ - unsigned char avg_results_flag; /* if set, average results over queries */ - unsigned char avg_rel_results_flag;/* if set,average results over num_rel*/ - unsigned char gm_results_flag; /* if set, measure uses geometric mean. ie - exponentiate the average before - printing */ - long byte_offset; -} SINGLE_MEASURE; - -typedef struct { - char *long_name; - unsigned char is_long_flag; /* otherwise float */ - unsigned char print_short_flag; /* if set, print in short output */ - unsigned char print_time_flag; /* if set, measure is printed only - if time_flag is set */ - unsigned char print_only_query_flag; /* if set, measure is printed only - when printing individual query output*/ - unsigned char print_only_average_flag; /* if set, measure is printed only - when printing overall average output*/ - unsigned char avg_results_flag; /* if set, average results over queries */ - long byte_offset; - long num_values; - char *format_string; - char *long_format_string; - char *(*get_param_str) (EVAL_PARAM_INFO *ip, long index); -} PARAMETERIZED_MEASURE; - -typedef struct { - char *name; - char *long_name; - unsigned char print_short_flag; /* if set, measure is always printed - (not just if all_flag set) */ - long numerator_byte_offset; - long denominator_byte_offset; -} MICRO_MEASURE; - - -typedef struct { /* For each retrieved document result */ - char *docno; /* document id */ - float sim; /* score */ - long rank; /* rank assigned after breaking ties */ -} TEXT_TR; - -typedef struct { /* For each query in retrieved results */ - char *qid; /* query id */ - long num_text_tr; /* number of TEXT_TR results for query*/ - long max_num_text_tr; /* number results space reserved for */ - TEXT_TR *text_tr; /* Array of TEXT_TR results */ -} TREC_TOP; - -typedef struct { /* Overall retrieved results */ - char *run_id; /* run id */ - long num_q_tr; /* Number of TREC_TOP queries */ - long max_num_q_tr; /* Num queries space reserved for*/ - TREC_TOP *trec_top; /* Array of TREC_TOP query results */ -} ALL_TREC_TOP; - -typedef struct { /* For each relevance judgement */ - char *docno; /* document id */ - long rel; /* document judgement */ -} TEXT_QRELS; - -typedef struct { /* For each query in rel judgements */ - char *qid; /* query id */ - long num_text_qrels; /* number of judged documents */ - long max_num_text_qrels; /* Num docs space reserved for */ - TEXT_QRELS *text_qrels; /* Array of judged TEXT_QRELS */ -} TREC_QRELS; - -typedef struct { /* Overall relevance judgements */ - long num_q_qrels; /* Number of TREC_QRELS queries */ - long max_num_q_qrels; /* Num queries space reserved for */ - TREC_QRELS *trec_qrels; /* Array of TREC_QRELS queries */ -} ALL_TREC_QRELS; - - - -#define INIT_NUM_QUERIES 50 -#define INIT_NUM_RESULTS 1000 -#define INIT_NUM_RELS 2000 - -/* Set retrieval is based on contingency table: - relevant nonrelevant - retrieved a b - nonretrieved c d - - Often you see r == num_rel_ret == a - R == num_rel == a+c - n == num_ret == a+b - N == num_docs == a+b+c+d - Some of these definitions are used in comments below -*/ - - -/* ----------------------------------------------- */ -/* Defined constants that are collection/purpose dependent */ - -/* Number of cutoffs for recall,precision, and rel_precis measures. */ -/* CUTOFF_VALUES gives the number of retrieved docs that these */ -/* evaluation mesures are applied at. */ -#define NUM_CUTOFF 9 -#define CUTOFF_VALUES {5, 10, 15, 20, 30, 100, 200, 500, 1000} - -/* Maximum fallout value, expressed in number of non-rel docs retrieved. */ -/* (Make the approximation that number of non-rel docs in collection */ -/* is equal to the number of number of docs in collection) */ -#define MAX_FALL_RET 142 - -/* Maximum multiple of R (number of rel docs for this query) to calculate */ -/* R-based precision at */ -#define MAX_RPREC 2.0 - -#define MAX_TIME 300.0 -#define NUM_TIME_PTS 60 - -/* Set a maximum number of nonrel docs to be used for preference measures */ -#define PREF_TOP_NONREL_NUM 100 - -/* ----------------------------------------------- */ -/* Defined constants that are collection/purpose independent. If you - change these, you probably need to change comments and documentation, - and some variable names may not be appropriate any more! */ -#define NUM_RP_PTS 11 -#define THREE_PTS {2, 5, 8} -#define NUM_FR_PTS 11 -#define NUM_PREC_PTS 11 -#define UTILITY_A 1.0 -#define UTILITY_B -1.0 -#define UTILITY_C 0.0 -#define UTILITY_D 0.0 -#define MIN_GEO_MEAN .00001 - -typedef struct { - char *qid; /* query id */ - long num_queries; /* Number of queries for this eval */ - long num_orig_queries; /* Number of queries for this eval without - missing values, if using trec_eval -c */ - /* Summary Numbers over all queries */ - long num_rel; /* Number of relevant docs */ - long num_ret; /* Number of retrieved docs */ - long num_rel_ret; /* Number of relevant retrieved docs */ - float avg_doc_prec; /* Average of precision over all - relevant documents (query independent)*/ - - /* Measures after num_ret docs */ - float exact_recall; /* Recall after num_ret docs */ - float exact_precis; /* Precision after num_ret docs */ - float exact_rel_precis; /* Relative Precision (or recall) */ - /* Defined to be precision / max possible - precision */ - float exact_uap; /* Unranked Average Precision */ - /* Every rel doc in retrieved set gets - precision, every nonret rel doc gets 0. - Average over all rel docs */ - /* Note this = exact_recall * - exact_precision for a query */ - /* Preferred measure for evaluation of - unranked sets of arbitrary size. */ - float exact_rel_uap; /* Relative Unranked Average Precision */ - /* Above, but relativized given size of - retrieved set */ - /* If (nR) set num_ret to R - Then use uap formula */ - /* exact_rel_precis ** 2 */ - float exact_utility; /* From contingency table, by default: - UTILITY_A * a + UTILITY_B * b + - UTILITY_C * c + UTILITY_D * d. - By default, a-b (or r - (n-r)) */ - float recip_rank; /* reciprical rank of top retrieved - relevant document */ - long rank_first_rel; /* Rank of top retrieved rel doc. Set to - 0 if none. Unaveraged */ - - /* Measures after each document */ - float recall_cut[NUM_CUTOFF]; /* Recall after cutoff[i] docs */ - - float precis_cut[NUM_CUTOFF]; /* precision after cutoff[i] docs. If - less than cutoff[i] docs retrieved, - then assume an additional - cutoff[i]-num_ret non-relevant docs - are retrieved. */ - float rel_precis_cut[NUM_CUTOFF];/* Relative precision after cutoff[i] - docs. (Note relative precision is - identical to relative recall) */ - float uap_cut[NUM_CUTOFF]; /* uap (is recall * precision) after - cutoff[i] docs. Not recommended */ - float rel_uap_cut[NUM_CUTOFF]; /* rel_uap at cutoff[i] docs */ - float av_rel_precis; /* average (integral) of rel_precis - after each doc. Do not use if - number of docs retrieved varies */ - float av_rel_uap; /* average (integral) of rel_uap - after each doc. Do not use if - number of docs retrieved varies */ - - - /* Measures after each rel doc */ - float av_recall_precis; /* MAP! average(integral) of precision at - all rel doc ranks. THE MAJOR - EVALUATION MEASURE FOR RANKED DOCS */ - float int_av_recall_precis; /* Same as above, but the precision values - have been interpolated, so that prec(X) - is actually MAX prec(Y) for all - Y >= X */ - float int_recall_precis[NUM_RP_PTS];/* interpolated precision at - 0.1 increments of recall */ - float int_av3_recall_precis; /* interpolated average at 3 intermediate - points */ - float int_av11_recall_precis; /* interpolated average at NUM_RP_PTS - intermediate points (recall_level) */ - - /* Measures after each non-rel doc */ - float fall_recall[NUM_FR_PTS]; /* max recall after each non-rel doc, - at 11 points starting at 0.0 and - ending at MAX_FALL_RET /num_docs */ - float av_fall_recall; /* Average of fallout-recall, after each - non-rel doc until fallout of - MAX_FALL_RET / num_docs achieved */ - - /* Measures after R-related cutoffs. R is the number of relevant - docs for a particular query, but note that these cutoffs are after - R docs, whether relevant or non-relevant, have been retrieved. - R-related cutoffs are really only applicable to a situtation where - there are many relevant docs per query (or lots of queries). */ - float R_recall_precis; /* Recall or precision after R docs - (note they are equal at this point) */ - float av_R_precis; /* Average (or integral) of precision at - each doc until R docs have been - retrieved */ - float R_prec_cut[NUM_PREC_PTS]; /* Precision measured after multiples of - R docs have been retrieved. 10 - equal points, with max multiple - having value MAX_RPREC */ - float int_R_recall_precis; /* Interpolated precision after R docs - Prec(X) = MAX(prec(Y)) for all Y>=X */ - float int_av_R_precis; /* Interpolated */ - float int_R_prec_cut[NUM_PREC_PTS]; /* Interpolated */ - - /* Measures after particular time relative to size of eventual retrieved - set. Eg, precision is num_rel_so_far/num_ret - relprecision is num_rel_so_far/MIN(num_ret,num_rel) - uap is num_rel_so_far**2/(num_ret*MIN(num_ret,num_rel)) - reluap is relprecision * relprecision */ - float time_num_rel[NUM_TIME_PTS]; /* Number of rel docs in time bucket*/ - float time_num_nrel[NUM_TIME_PTS];/* Number of nrel docs in each bucket*/ - float time_cum_rel[NUM_TIME_PTS]; /* Cumulative time_num_rel */ - float time_precis[NUM_TIME_PTS]; /* First Precision in each bucket */ - float time_relprecis[NUM_TIME_PTS];/* First rel-Precision in each bucket */ - float time_uap[NUM_TIME_PTS]; /* First uap in bucket*/ - float time_reluap[NUM_TIME_PTS]; /* First relative uap in bucket*/ - float time_utility[NUM_TIME_PTS]; /* First Utility (default 1,-1,0,0) - in bucket */ - float av_time_precis; /* Sum (integral) of time_precis */ - float av_time_relprecis; /* Sum (integral) of time_relprecis */ - float av_time_uap; /* Sum (integral) of time_uap */ - float av_time_reluap; /* Sum (integral) of time_reluap */ - float av_time_utility; /* Sum (integral) of time_utility */ - float av_time_cum_rel; /* Sum (integral) of time_cum_rel */ - - /* Measures dependent on only judged documents */ - /* Binary Pref relations: fraction of nonrel documents retrieved after - each rel doc */ - float bpref; /* real BPREF. Top num_rel nonrel docs */ - float bpref_top5Rnonrel; /* Top 5 * num_rel nonrel docs */ - float bpref_top10Rnonrel; /* Top 10 * num_rel nonrel docs */ -/* float bpref_topRnonrel; * renamed as bpref */ - float bpref_allnonrel; /* all judged nonrel docs */ - float bpref_retnonrel; /* Only retrieved nonrel docs */ - float bpref_topnonrel; /* Top PREF_TOPNREL_NUM nonrel docs */ - float bpref_top50pRnonrel; /* Top 50 + num_rel nonrel docs */ - float bpref_top25pRnonrel; /* Top 25 + num_rel nonrel docs */ - float bpref_top10pRnonrel; /* Top 10 + num_rel nonrel docs. - Bad version used in SIGIR 2004 paper */ - float old_bpref_top10pRnonrel; /* bad old version. Top 10 + num_rel - nonrel docs. Used in SIGIR 2004 paper*/ - float bpref_top25p2Rnonrel; /* Top 25 + 2 * num_rel nonrel docs */ - float bpref_retall; /* Only retrieved rel,nonrel docs */ - float bpref_5; /* Only top 5 rel, top 5 nonrel */ - float bpref_10; /* Only top 10 rel, top 10 nonrel */ - float old_bpref; /* Bad old bpref. Top num_rel nonrel docs. - Only used retrieved nonrel docs. - Used in TREC 12,13, mention in - SIGIR 2004 paper */ - float bpref_num_all; /* num not retrieved before (all judged)*/ - float bpref_num_ret; /* num retrieved after */ - long bpref_num_correct; /* num correct preferences */ - long bpref_num_possible; /* num possible correct preferences */ - - /* Measures that use Geometric Mean - avg_Score = exp (SUM (log (MAX (query_score, .00001))) / N) - WARNING: Geometric Mean measures special cased for "trec_eval -c". - Works, but be careful when implementing new measure */ - float gm_ap; /* Geometric Mean version of MAP */ - float gm_bpref; /* Geometric Mean version of bpref. Note - bpref has lots of 0.0 values */ - -} TREC_EVAL; - -#endif /* TRECEVALH */ diff --git a/sm_cnn/trec_eval-8.0/trec_eval_help.c b/sm_cnn/trec_eval-8.0/trec_eval_help.c deleted file mode 100755 index eb7bf60..0000000 --- a/sm_cnn/trec_eval-8.0/trec_eval_help.c +++ /dev/null @@ -1,203 +0,0 @@ -/* Copyright (c) 2003, 1991, 1990, 1984 - Chris Buckley. */ - -#include "common.h" -#include "trec_eval.h" - -static char *help_message = -"trec_eval [-h] [-q] [-a] [-o] [-c] [-l [-N] [-M] [-Ua] [-Ub] [-Uc] [-Ud] [-T] trec_rel_file trec_top_file \n\ - \n\ -Calculate and print various evaluation measures, evaluating the results \n\ -in trec_top_file against the relevance judgements in trec_rel_file. \n\ - \n\ -There are a fair number of options, of which only the lower case options are \n\ -normally ever used. \n\ - -h: Print full help message and exit \n\ - -q: In addition to summary evaluation, give evaluation for each query \n\ - -a: Print all evaluation measures calculated, instead of just the \n\ - main official measures for TREC. \n\ - -o: Print everything out in old, nonrelational format (default is relational) \n\ - -c: Average over the complete set of queries in the relevance judgements \n\ - instead of the queries in the intersection of relevance judgements \n\ - and results. Missing queries will contribute a value of 0 to all \n\ - evaluation measures (which may or may not be reasonable for a \n\ - particular evaluation measure, but is reasonable for standard TREC \n\ - measures.) \n\ - -l: Num indicates the minimum relevance judgement value needed for \n\ - a document to be called relevant. (All measures used by TREC eval are \n\ - based on binary relevance). Used if trec_rel_file contains relevance \n\ - judged on a multi-relevance scale. Default is 1. \n\ - -N: Number of docs in collection \n\ - -M: Max number of docs per topic to use in evaluation (discard rest). \n\ - -Ua: Value to use for 'a' coefficient of utility computation. \n\ - relevant nonrelevant \n\ - retrieved a b \n\ - nonretrieved c d \n\ - -Ub: Value to use for 'b' coefficient of utility computation. \n\ - -Uc: Value to use for 'c' coefficient of utility computation. \n\ - -Ud: Value to use for 'd' coefficient of utility computation. \n\ - -J: Calculate all values only over the judged (either relevant or \n\ - nonrelevant) documents. All unjudged documents are removed from the \n\ - retrieved set before any calculations (possibly leaving an empty set). \n\ - DO NOT USE, unless you really know what you're doing - very easy to get \n\ - reasonable looking, but invalid, numbers. \n\ - -T: Treat similarity as time that document retrieved. Compute \n\ - several time-based measures after ranking docs by time retrieved \n\ - (first doc (lowest sim) retrieved ranked highest). \n\ - Only done if -a selected. \n\ - \n\ - \n\ -Read text tuples from trec_top_file of the form \n\ - 030 Q0 ZF08-175-870 0 4238 prise1 \n\ - qid iter docno rank sim run_id \n\ -giving TREC document numbers (a string) retrieved by query qid \n\ -(a string) with similarity sim (a float). The other fields are ignored, \n\ -with the exception that the run_id field of the last line is kept and \n\ -output. In particular, note that the rank field is ignored here; \n\ -internally ranks are assigned by sorting by the sim field with ties \n\ -broken deterministicly (using docno). \n\ -Sim is assumed to be higher for the docs to be retrieved first. \n\ -File may contain no NULL characters. \n\ -Lines may contain fields after the run_id; they are ignored. \n\ - \n\ -Relevance for each docno to qid is determined from text_qrels_file, which \n\ -consists of text tuples of the form \n\ - qid iter docno rel \n\ -giving TREC document numbers (docno, a string) and their relevance (rel, \n\ -an integer) to query qid (a string). iter string field is ignored. \n\ -Fields are separated by whitespace, string fields can contain no whitespace. \n\ -File may contain no NULL characters. \n\ - \n\ -The text tuples with relevance judgements are converted to TR_VEC form \n\ -and then submitted to the SMART evaluation routines. \n\ -The qid,did,rank,sim,rel fields of TR_VEC are filled in; \n\ -action,iter fields are set to 0. \n\ -The rel field is set to -1 if the document was not judged (not in \n\ -text_qrels_file). Most measures, but not all, will treat -1 the same as 0, \n\ -namely nonrelevant. Note that relevance_level is used to determine if the \n\ -document is relevant during score calculations. \n\ -Queries for which there are no relevant docs are ignored. \n\ -Warning: queries for which there are relevant docs but no retrieved docs \n\ -are also ignored by default. This allows systems to evaluate over subsets \n\ -of the relevant docs, but means if a system improperly retrieves no docs, \n\ -it will not be detected. Use the -c flag to avoid this behavior. \n\ - \n\ -EXPLANATION OF OFFICIAL VALUES PRINTED OF OLD NON-RELATIONAL FORMAT. \n\ -Relational Format prints the same values, but all lines are of the form \n\ - measure_name query value \n\ - \n\ -1. Total number of documents over all queries \n\ - Retrieved: \n\ - Relevant: \n\ - Rel_ret: (relevant and retrieved) \n\ - These should be self-explanatory. All values are totals over all \n\ - queries being evaluated. \n\ -2. Interpolated Recall - Precision Averages: \n\ - at 0.00 \n\ - at 0.10 \n\ - ... \n\ - at 1.00 \n\ - See any standard IR text (especially by Salton) for more details of \n\ - recall-precision evaluation. Measures precision (percent of retrieved \n\ - docs that are relevant) at various recall levels (after a certain \n\ - percentage of all the relevant docs for that query have been retrieved). \n\ - 'Interpolated' means that, for example, precision at recall \n\ - 0.10 (ie, after 10% of rel docs for a query have been retrieved) is \n\ - taken to be MAXIMUM of precision at all recall points >= 0.10. \n\ - Values are averaged over all queries (for each of the 11 recall levels). \n\ - These values are used for Recall-Precision graphs. \n\ -3. Average precision (non-interpolated) over all rel docs \n\ - The precision is calculated after each relevant doc is retrieved. \n\ - If a relevant doc is not retrieved, its precision is 0.0. \n\ - All precision values are then averaged together to get a single number \n\ - for the performance of a query. Conceptually this is the area \n\ - underneath the recall-precision graph for the query. \n\ - The values are then averaged over all queries. \n\ -4. Precision: \n\ - at 5 docs \n\ - at 10 docs \n\ - ... \n\ - at 1000 docs \n\ - The precision (percent of retrieved docs that are relevant) after X \n\ - documents (whether relevant or nonrelevant) have been retrieved. \n\ - Values averaged over all queries. If X docs were not retrieved \n\ - for a query, then all missing docs are assumed to be non-relevant. \n\ -5. R-Precision (precision after R (= num_rel for a query) docs retrieved): \n\ - Measures precision (or recall, they're the same) after R docs \n\ - have been retrieved, where R is the total number of relevant docs \n\ - for a query. Thus if a query has 40 relevant docs, then precision \n\ - is measured after 40 docs, while if it has 600 relevant docs, precision \n\ - is measured after 600 docs. This avoids some of the averaging \n\ - problems of the 'precision at X docs' values in (4) above. \n\ - If R is greater than the number of docs retrieved for a query, then \n\ - the nonretrieved docs are all assumed to be nonrelevant. \n\ -"; - - -extern SINGLE_MEASURE sing_meas[]; -extern PARAMETERIZED_MEASURE param_meas[]; -extern MICRO_MEASURE micro_meas[]; -extern int num_param_meas, num_sing_meas, num_micro_meas; - -int -trec_eval_help(epi) -EVAL_PARAM_INFO *epi; -{ - long i, j; - char temp_buf1[30]; - char temp_buf2[80]; - - printf ("%s\n", help_message); - - printf ("Major measures (again) with their relational names:\n"); - for (i = 0; i < num_sing_meas; i++) { - if (sing_meas[i].print_short_flag) - printf ("%-15s\t%s\n", sing_meas[i].name, sing_meas[i].long_name); - } - for (i = 0; i < num_param_meas; i++) { - if (param_meas[i].print_short_flag) { - for (j = 0; j < param_meas[i].num_values; j++) { - sprintf (temp_buf1, param_meas[i].format_string, - param_meas[i].get_param_str (epi, j)); - sprintf (temp_buf2, param_meas[i].long_format_string, - param_meas[i].get_param_str (epi, j)); - printf ("%-15s\t%s%s\n", temp_buf1, - param_meas[i].long_name, temp_buf2); - } - } - } - for (i = 0; i < num_micro_meas; i++) { - if (micro_meas[i].print_short_flag) - printf ("%-15s\t%s\n", micro_meas[i].name, micro_meas[i].long_name); - } - - printf ("\n\nMinor measures with their relational names:\n"); - for (i = 0; i < num_sing_meas; i++) { - if (sing_meas[i].print_short_flag) - continue; - if (sing_meas[i].print_time_flag && (! epi->time_flag)) - continue; - if (! sing_meas[i].print_short_flag) - printf ("%-15s\t%s\n", sing_meas[i].name, sing_meas[i].long_name); - } - for (i = 0; i < num_param_meas; i++) { - if (param_meas[i].print_short_flag) - continue; - if (param_meas[i].print_time_flag && (! epi->time_flag)) - continue; - for (j = 0; j < param_meas[i].num_values; j++) { - sprintf (temp_buf1, param_meas[i].format_string, - param_meas[i].get_param_str (epi, j)); - sprintf (temp_buf2, param_meas[i].long_format_string, - param_meas[i].get_param_str (epi, j)); - printf ("%-15s\t%s%s\n", temp_buf1, - param_meas[i].long_name, temp_buf2); - } - } - for (i = 0; i < num_micro_meas; i++) { - if (! micro_meas[i].print_short_flag) - printf ("%-15s\t%s\n", micro_meas[i].name, micro_meas[i].long_name); - } - - return (1); -} - diff --git a/sm_cnn/trec_eval-8.0/trvec_teval.c b/sm_cnn/trec_eval-8.0/trvec_teval.c deleted file mode 100755 index e2d2891..0000000 --- a/sm_cnn/trec_eval-8.0/trvec_teval.c +++ /dev/null @@ -1,673 +0,0 @@ -#ifdef RCSID -static char rcsid[] = "$Header: /home/smart/release/src/libevaluate/trvec_trec_eval.c,v 11.0 1992/07/21 18:20:35 chrisb Exp chrisb $"; -#endif - -/* Copyright (c) 2005 -*/ - -#include "common.h" -#include "sysfunc.h" -#include "smart_error.h" -#include "tr_vec.h" -#include "trec_eval.h" - -static int compare_iter_rank(); -static void calc_cutoff_measures(EVAL_PARAM_INFO *epi, TR_VEC *tr_vec, - TREC_EVAL *eval, long num_rel, - long num_nonrel); -static void calc_bpref_measures(EVAL_PARAM_INFO *epi, TR_VEC *tr_vec, - TREC_EVAL *eval, long num_rel, - long num_nonrel); -static void calc_average_measures(EVAL_PARAM_INFO *epi, TR_VEC *tr_vec, - TREC_EVAL *eval, long num_rel, - long num_nonrel); -static void calc_exact_measures(EVAL_PARAM_INFO *epi, TR_VEC *tr_vec, - TREC_EVAL *eval, long num_rel, - long num_nonrel); -static void calc_time_measures(EVAL_PARAM_INFO *epi, TR_VEC *tr_vec, - TREC_EVAL *eval, long num_rel, - long num_nonrel); - -int -trvec_trec_eval (epi, tr_vec, eval, num_rel, num_nonrel) -EVAL_PARAM_INFO *epi; -TR_VEC *tr_vec; -TREC_EVAL *eval; -long num_rel; /* Number relevant judged */ -long num_nonrel; /* Number nonrelevant judged */ -{ - long j; - long max_iter; - - if (tr_vec == (TR_VEC *) NULL) - return (UNDEF); - - /* Initialize everything to 0 */ - bzero ((char *) eval, sizeof (TREC_EVAL)); - - eval->qid = tr_vec->qid; - eval->num_queries = 1; - - /* If no retrieved docs, then just return */ - if (tr_vec->num_tr == 0) { - return (0); - } - - eval->num_rel = num_rel; - - /* Evaluate only the docs on the last iteration of new_tr_vec */ - /* Sort the tr tuples for this query by decreasing iter and - increasing rank */ - qsort ((char *) tr_vec->tr, - (int) tr_vec->num_tr, - sizeof (TR_TUP), - compare_iter_rank); - - max_iter = tr_vec->tr[0].iter; - for (j = 0; j < tr_vec->num_tr; j++) { - if (tr_vec->tr[j].iter == max_iter) { - eval->num_ret++; - if (tr_vec->tr[j].rel >= epi->relevance_level) - eval->num_rel_ret++; - } - else { - if (tr_vec->tr[j].rel >= epi->relevance_level) - eval->num_rel--; - } - } - - /* Calculate cutoff measures, and those measures dependant on them */ - /* Also includes recip_rank and rank_first_rel */ - calc_cutoff_measures (epi, tr_vec, eval, num_rel, num_nonrel); - - /* Calculate bpref measures */ - calc_bpref_measures (epi, tr_vec, eval, num_rel, num_nonrel); - - /* Calculate measures that average over ret or rel docs */ - calc_average_measures (epi, tr_vec, eval, num_rel, num_nonrel); - - /* Calculate exact measures over entire retrieved sets */ - calc_exact_measures (epi, tr_vec, eval, num_rel, num_nonrel); - - /* Calculate time measures, if wanted */ - if (epi->time_flag) - calc_time_measures (epi, tr_vec, eval, num_rel, num_nonrel); - - - return (1); -} - -static int -compare_iter_rank (tr1, tr2) -TR_TUP *tr1; -TR_TUP *tr2; -{ - if (tr1->iter > tr2->iter) - return (-1); - if (tr1->iter < tr2->iter) - return (1); - if (tr1->rank < tr2->rank) - return (-1); - if (tr1->rank > tr2->rank) - return (1); - return (0); -} - - -/* ********************************************************************* */ -/* calculate cutoff measures */ - /* cutoff values for recall precision output */ -static int cutoff[NUM_CUTOFF] = CUTOFF_VALUES; -static int three_pts[3] = THREE_PTS; - - -static void -calc_cutoff_measures(epi, tr_vec, eval, num_rel, num_nonrel) -EVAL_PARAM_INFO *epi; -TR_VEC *tr_vec; -TREC_EVAL *eval; -long num_rel; /* Number relevant judged */ -long num_nonrel; /* Number nonrelevant judged */ -{ - double recall, precis; /* current recall, precision values */ - double rel_precis, rel_uap;/* relative precision, uap values */ - double int_precis; /* current interpolated precision values */ - - long i,j; - - long cut_rp[NUM_RP_PTS]; /* number of rel docs needed to be retrieved - for each recall-prec cutoff */ - long cut_fr[NUM_FR_PTS]; /* number of non-rel docs needed to be - retrieved for each fall-recall cutoff */ - long cut_rprec[NUM_PREC_PTS]; /* Number of docs needed to be retrieved - for each R-based prec cutoff */ - long current_cutoff, current_cut_rp, current_cut_fr, current_cut_rprec; - - long rel_so_far = eval->num_rel_ret; - - /* Note for interpolated precision values (Prec(X) = MAX (PREC(Y)) for all - Y >= X) */ - int_precis = (float) rel_so_far / (float) eval->num_ret; - - /* Discover cutoff values for this query */ - current_cutoff = NUM_CUTOFF - 1; - while (current_cutoff > 0 && cutoff[current_cutoff] > eval->num_ret) - current_cutoff--; - for (i = 0; i < NUM_RP_PTS; i++) - cut_rp[i] = ((eval->num_rel * i) + NUM_RP_PTS - 2) / (NUM_RP_PTS - 1); - current_cut_rp = NUM_RP_PTS - 1; - while (current_cut_rp > 0 && cut_rp[current_cut_rp] > eval->num_rel_ret) - current_cut_rp--; - for (i = 0; i < NUM_FR_PTS; i++) - cut_fr[i] = ((MAX_FALL_RET * i) + NUM_FR_PTS - 2) / (NUM_FR_PTS - 1); - current_cut_fr = NUM_FR_PTS - 1; - while (current_cut_fr > 0 && cut_fr[current_cut_fr] > eval->num_ret - eval->num_rel_ret) - current_cut_fr--; - for (i = 1; i < NUM_PREC_PTS+1; i++) - cut_rprec[i-1] = ((MAX_RPREC * eval->num_rel * i) + NUM_PREC_PTS - 2) - / (NUM_PREC_PTS - 1); - current_cut_rprec = NUM_PREC_PTS - 1; - while (current_cut_rprec > 0 && cut_rprec[current_cut_rprec]>eval->num_ret) - current_cut_rprec--; - - /* Loop over all retrieved docs in reverse order */ - for (j = eval->num_ret; j > 0; j--) { - if (rel_so_far > 0) { - recall = (float) rel_so_far / (float) eval->num_rel; - precis = (float) rel_so_far / (float) j; - if (j > eval->num_rel) { - rel_precis = (float) rel_so_far / (float) eval->num_rel; - } - else { - rel_precis = (float) rel_so_far / (float) j; - } - } - else { - recall = 0.0; - precis = 0.0; - rel_precis = 0.0; - } - rel_uap = rel_precis * rel_precis; - if (int_precis < precis) - int_precis = precis; - while (j == cutoff[current_cutoff]) { - eval->recall_cut[current_cutoff] = recall; - eval->precis_cut[current_cutoff] = precis; - eval->rel_precis_cut[current_cutoff] = rel_precis; - eval->uap_cut[current_cutoff] = precis * recall; - eval->rel_uap_cut[current_cutoff] = rel_uap; - current_cutoff--; - } - - while (j == cut_rprec[current_cut_rprec]) { - eval->R_prec_cut[current_cut_rprec] = precis; - eval->int_R_prec_cut[current_cut_rprec] = int_precis; - current_cut_rprec--; - } - - if (j == eval->num_rel) { - eval->R_recall_precis = precis; - eval->int_R_recall_precis = int_precis; - } - - if (tr_vec->tr[j-1].rel >= epi->relevance_level) { - while (rel_so_far == cut_rp[current_cut_rp]) { - eval->int_recall_precis[current_cut_rp] = int_precis; - current_cut_rp--; - } - eval->recip_rank = 1.0 / (float) j; - eval->rank_first_rel = j; - rel_so_far--; - } - else { - /* Note: for fallout-recall, the recall at X non-rel docs - is used for the recall 'after' (X-1) non-rel docs. - Ie. recall_used(X-1 non-rel docs) = MAX (recall(Y)) for - Y retrieved docs where X-1 non-rel retrieved */ - while (current_cut_fr >= 0 && - j - rel_so_far == cut_fr[current_cut_fr] + 1) { - eval->fall_recall[current_cut_fr] = recall; - current_cut_fr--; - } - } - } - - /* Fill in the 0.0 value for recall-precision (== max precision - at any point in the retrieval ranking) */ - eval->int_recall_precis[0] = int_precis; - - /* Fill in those cutoff values and averages that were not achieved - because insufficient docs were retrieved. */ - for (i = 0; i < NUM_CUTOFF; i++) { - if (eval->num_ret < cutoff[i]) { - if (eval->num_rel_ret > 0) { - eval->recall_cut[i] = ((float) eval->num_rel_ret / - (float) eval->num_rel); - eval->precis_cut[i] = ((float) eval->num_rel_ret / - (float) cutoff[i]); - } - eval->rel_precis_cut[i] = (cutoff[i] < eval->num_rel) ? - eval->precis_cut[i] : - eval->recall_cut[i]; - eval->uap_cut[i] = eval->precis_cut[i] * - eval->recall_cut[i]; - eval->rel_uap_cut[i] = eval->precis_cut[i] * - eval->precis_cut[i]; - } - } - for (i = 0; i < NUM_FR_PTS; i++) { - if (eval->num_ret - eval->num_rel_ret < cut_fr[i]) { - if (eval->num_rel_ret > 0) - eval->fall_recall[i] = (float) eval->num_rel_ret / - (float) eval->num_rel; - } - } - for (i = 0; i < NUM_PREC_PTS; i++) { - if (eval->num_ret < cut_rprec[i]) { - eval->R_prec_cut[i] = (float) eval->num_rel_ret / - (float) cut_rprec[i]; - eval->int_R_prec_cut[i] = (float) eval->num_rel_ret / - (float) cut_rprec[i]; - } - } - - if (eval->num_rel > eval->num_ret) { - eval->R_recall_precis = (float) eval->num_rel_ret / - (float)eval->num_rel; - eval->int_R_recall_precis = (float) eval->num_rel_ret / - (float)eval->num_rel; - } - - /* Calculate other indirect evaluation measure averages. */ - /* average recall-precis of 3 and 11 intermediate points */ - eval->int_av3_recall_precis = - (eval->int_recall_precis[three_pts[0]] + - eval->int_recall_precis[three_pts[1]] + - eval->int_recall_precis[three_pts[2]]) / 3.0; - for (i = 0; i < NUM_RP_PTS; i++) { - eval->int_av11_recall_precis += eval->int_recall_precis[i]; - } - eval->int_av11_recall_precis /= NUM_RP_PTS; - -} - -static void -calc_bpref_measures (epi, tr_vec, eval, num_rel, num_nonrel) -EVAL_PARAM_INFO *epi; -TR_VEC *tr_vec; -TREC_EVAL *eval; -long num_rel; /* Number relevant judged */ -long num_nonrel; /* Number nonrelevant judged */ -{ - long j; - long nonrel_ret, nonrel_so_far, rel_so_far; - long pref_top_nonrel_num = PREF_TOP_NONREL_NUM; - long pref_top_50pRnonrel_num; - long pref_top_25pRnonrel_num; - long pref_top_25p2Rnonrel_num; - long pref_top_10pRnonrel_num; - long pref_top_Rnonrel_num; - long bounded_5R_nonrel_so_far, bounded_10R_nonrel_so_far; - - /* Calculate judgement based measures (dependent on only - judged docs; no assumption of non-relevance if not judged) */ - /* Binary Preference measures; here expressed as all docs with a higher - value of rel are to be preferred. Optimize by keeping track of nonrel - seen so far */ - pref_top_nonrel_num = PREF_TOP_NONREL_NUM; - pref_top_50pRnonrel_num = 50 + eval->num_rel; - pref_top_25pRnonrel_num = 25 + eval->num_rel; - pref_top_10pRnonrel_num = 10 + eval->num_rel; - pref_top_Rnonrel_num = eval->num_rel; - pref_top_25p2Rnonrel_num = 25 + (2 * eval->num_rel); - nonrel_ret = 0; - for (j = 0; j < tr_vec->num_tr; j++) { - if (tr_vec->tr[j].rel == 0) - nonrel_ret++; - } - nonrel_so_far = 0; - rel_so_far = 0; - bounded_5R_nonrel_so_far = 0; - bounded_10R_nonrel_so_far = 0; - for (j = 0; j < tr_vec->num_tr; j++) { - if (tr_vec->tr[j].rel == 0) { - if (nonrel_so_far < 5 * eval->num_rel) { - bounded_5R_nonrel_so_far++; - if (nonrel_so_far < 10 * eval->num_rel) { - bounded_10R_nonrel_so_far++; - } - } - nonrel_so_far++; - } - else if (tr_vec->tr[j].rel >= epi->relevance_level) { - rel_so_far++; - /* Add fraction of correct preferences. */ - /* Special case nonrel_so_far == 0 to avoid division by 0 */ - if (nonrel_so_far > 0) { - eval->bpref_allnonrel += 1.0 - (((float) nonrel_so_far) / - (float) num_nonrel); - eval->bpref_retnonrel += 1.0 - (((float) nonrel_so_far) / - (float) nonrel_ret); - eval->bpref_retall += 1.0 - (((float) nonrel_so_far) / - (float) nonrel_ret); - eval->bpref_num_correct += - MIN (num_nonrel, pref_top_Rnonrel_num) - - MIN (nonrel_so_far, pref_top_Rnonrel_num); - eval->bpref += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_Rnonrel_num)) / - (float) MIN (num_nonrel, pref_top_Rnonrel_num)); - eval->old_bpref += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_Rnonrel_num)) / - (float) MIN (nonrel_ret, pref_top_Rnonrel_num)); - eval->bpref_topnonrel += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_nonrel_num)) / - (float) MIN (num_nonrel, pref_top_nonrel_num)); - eval->bpref_top50pRnonrel += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_50pRnonrel_num)) / - (float) MIN (num_nonrel, pref_top_50pRnonrel_num)); - eval->bpref_top25pRnonrel += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_25pRnonrel_num)) / - (float) MIN (num_nonrel, pref_top_25pRnonrel_num)); - eval->bpref_top10pRnonrel += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_10pRnonrel_num)) / - (float) MIN (num_nonrel, pref_top_10pRnonrel_num)); - eval->old_bpref_top10pRnonrel += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_10pRnonrel_num)) / - (float) MIN (nonrel_ret, pref_top_10pRnonrel_num)); - eval->bpref_top25p2Rnonrel += 1.0 - - (((float) MIN (nonrel_so_far, pref_top_25p2Rnonrel_num)) / - (float) MIN (num_nonrel, pref_top_25p2Rnonrel_num)); - if (rel_so_far <= 5 && nonrel_so_far < 5) - eval->bpref_5 += 1.0 - (float) nonrel_so_far / - (float) MIN (num_nonrel, 5); - if (rel_so_far <= 10 && nonrel_so_far < 10) - eval->bpref_10 += 1.0 - (float) nonrel_so_far / - (float) MIN (num_nonrel, 10); - } - else { - eval->bpref += 1.0; - eval->old_bpref += 1.0; - eval->bpref_allnonrel += 1.0; - eval->bpref_retnonrel += 1.0; - eval->bpref_retall += 1.0; - eval->bpref_topnonrel += 1.0; - eval->bpref_top50pRnonrel += 1.0; - eval->bpref_top25pRnonrel += 1.0; - eval->bpref_top10pRnonrel += 1.0; - eval->old_bpref_top10pRnonrel += 1.0; - eval->bpref_top25p2Rnonrel += 1.0; - if (rel_so_far <= 5) - eval->bpref_5 += 1.0; - if (rel_so_far <= 10) - eval->bpref_10 += 1.0; - - } - eval->bpref_top5Rnonrel += 1.0 - - (((float) bounded_5R_nonrel_so_far) / - (float) MIN (num_nonrel, eval->num_rel * 5)); - eval->bpref_top10Rnonrel += 1.0 - - (((float) bounded_10R_nonrel_so_far) / - (float) MIN (num_nonrel, eval->num_rel * 10)); - eval->bpref_num_all += num_nonrel - nonrel_so_far; - eval->bpref_num_ret += nonrel_ret - nonrel_so_far; - } - } - if (eval->num_rel) { - eval->bpref /= eval->num_rel; - eval->old_bpref /= eval->num_rel; - eval->bpref_allnonrel /= eval->num_rel; - eval->bpref_retnonrel /= eval->num_rel; - eval->bpref_topnonrel /= eval->num_rel; - eval->bpref_top5Rnonrel /= eval->num_rel; - eval->bpref_top10Rnonrel /= eval->num_rel; - eval->bpref_top50pRnonrel /= eval->num_rel; - eval->bpref_top25pRnonrel /= eval->num_rel; - eval->bpref_top10pRnonrel /= eval->num_rel; - eval->old_bpref_top10pRnonrel /= eval->num_rel; - eval->bpref_top25p2Rnonrel /= eval->num_rel; - if (eval->num_rel_ret) { - eval->bpref_retall /= eval->num_rel_ret; - eval->bpref_5 /= MIN (rel_so_far, 5); - eval->bpref_10 /= MIN (rel_so_far, 10); - } - eval->bpref_num_possible = eval->num_rel * - MIN (num_nonrel, pref_top_Rnonrel_num); - } - /* For those bpref measure variants which use the geometric mean instead - of straight averages, compute them here. Original measure value - is constrained to be greater than MIN_GEO_MEAN (for time being .00001, - since trec_eval prints to four significant digits) */ - eval->gm_bpref = (float) log ((double)(MAX (eval->bpref, - MIN_GEO_MEAN))); -} - -static void -calc_average_measures (epi, tr_vec, eval, num_rel, num_nonrel) -EVAL_PARAM_INFO *epi; -TR_VEC *tr_vec; -TREC_EVAL *eval; -long num_rel; /* Number relevant judged */ -long num_nonrel; /* Number nonrelevant judged */ -{ - double recall, precis; /* current recall, precision values */ - double rel_precis, rel_uap;/* relative precision, uap values */ - double int_precis; /* current interpolated precision values */ - - long i,j; - long rel_so_far; - - /* Note for interpolated precision values (Prec(X) = MAX (PREC(Y)) for all - Y >= X) */ - rel_so_far = eval->num_rel_ret; - int_precis = (float) rel_so_far / (float) eval->num_ret; - - /* Loop over all retrieved docs in reverse order */ - for (j = eval->num_ret; j > 0; j--) { - if (rel_so_far > 0) { - recall = (float) rel_so_far / (float) eval->num_rel; - precis = (float) rel_so_far / (float) j; - if (j > eval->num_rel) { - rel_precis = (float) rel_so_far / (float) eval->num_rel; - } - else { - rel_precis = (float) rel_so_far / (float) j; - } - } - else { - recall = 0.0; - precis = 0.0; - rel_precis = 0.0; - } - rel_uap = rel_precis * rel_precis; - if (int_precis < precis) - int_precis = precis; - eval->av_rel_precis += rel_precis; - eval->av_rel_uap += rel_uap; - - if (j < eval->num_rel) { - eval->av_R_precis += precis; - eval->int_av_R_precis += int_precis; - } - - if (tr_vec->tr[j-1].rel >= epi->relevance_level) { - eval->int_av_recall_precis += int_precis; - eval->av_recall_precis += precis; - eval->avg_doc_prec += precis; - rel_so_far--; - } - else { - /* Note: for fallout-recall, the recall at X non-rel docs - is used for the recall 'after' (X-1) non-rel docs. - Ie. recall_used(X-1 non-rel docs) = MAX (recall(Y)) for - Y retrieved docs where X-1 non-rel retrieved */ - if (j - rel_so_far < MAX_FALL_RET) { - eval->av_fall_recall += recall; - } - } - } - - if (eval->num_ret - eval->num_rel_ret < MAX_FALL_RET) { - if (eval->num_rel_ret > 0) - eval->av_fall_recall += ((MAX_FALL_RET - - (eval->num_ret - eval->num_rel_ret)) - * ((float)eval->num_rel_ret / - (float)eval->num_rel)); - } - if (eval->num_rel > eval->num_ret) { - for (i = eval->num_ret; i < eval->num_rel; i++) { - eval->av_R_precis += (float) eval->num_rel_ret / - (float) i; - eval->int_av_R_precis += (float) eval->num_rel_ret / - (float) i; - } - } - - /* Calculate all the other averages */ - if (eval->num_rel_ret > 0) { - eval->av_recall_precis /= eval->num_rel; - eval->int_av_recall_precis /= eval->num_rel; - } - - eval->av_fall_recall /= MAX_FALL_RET; - - eval->av_rel_precis /= eval->num_ret; - eval->av_rel_uap /= eval->num_ret; - - if (eval->num_rel) { - eval->av_R_precis /= eval->num_rel; - eval->int_av_R_precis /= eval->num_rel; - } - - /* For those measure variants which use the geometric mean instead - of straight averages, compute them here. Original measure value - is constrained to be greater than MIN_GEO_MEAN (for time being .00001, - since trec_eval prints to four significant digits) */ - eval->gm_ap = (float) log ((double)(MAX (eval->av_recall_precis, - MIN_GEO_MEAN))); -} - -static void -calc_exact_measures (epi, tr_vec, eval, num_rel, num_nonrel) -EVAL_PARAM_INFO *epi; -TR_VEC *tr_vec; -TREC_EVAL *eval; -long num_rel; /* Number relevant judged */ -long num_nonrel; /* Number nonrelevant judged */ -{ - - if (eval->num_rel) { - eval->exact_recall = (double) eval->num_rel_ret / eval->num_rel; - eval->exact_precis = (double) eval->num_rel_ret / eval->num_ret; - eval->exact_uap = eval->exact_recall * eval->exact_precis; - if (eval->num_rel > eval->num_ret) { - eval->exact_rel_precis = eval->exact_precis; - } - else { - eval->exact_rel_precis = eval->exact_recall; - } - eval->exact_rel_uap = eval->exact_precis * eval->exact_precis; - eval->exact_utility = - epi->utility_a * eval->num_rel_ret + - epi->utility_b * (eval->num_ret - eval->num_rel_ret) + - epi->utility_c * (eval->num_rel - eval->num_rel_ret) + - epi->utility_d * (epi->num_docs_in_coll + eval->num_rel_ret - - eval->num_ret - eval->num_rel); - } -} - -static void -calc_time_measures (epi, tr_vec, eval, num_rel, num_nonrel) -EVAL_PARAM_INFO *epi; -TR_VEC *tr_vec; -TREC_EVAL *eval; -long num_rel; /* Number relevant judged */ -long num_nonrel; /* Number nonrelevant judged */ -{ - double recall, precis; /* current recall, precision values */ - double rel_precis, rel_uap;/* relative precision, uap values */ - double int_precis; /* current interpolated precision values */ - - long i,j; - - long bucket; - long last_time_bucket = NUM_TIME_PTS; /* Last time bucket filled in */ - - long rel_so_far = eval->num_rel_ret; - long min_ret_rel = MIN(eval->num_rel, eval->num_ret); - - /* Loop over all retrieved docs in reverse order */ - for (j = eval->num_ret; j > 0; j--) { - if (rel_so_far > 0) { - recall = (float) rel_so_far / (float) eval->num_rel; - precis = (float) rel_so_far / (float) j; - if (j > eval->num_rel) { - rel_precis = (float) rel_so_far / (float) eval->num_rel; - } - else { - rel_precis = (float) rel_so_far / (float) j; - } - } - else { - recall = 0.0; - precis = 0.0; - rel_precis = 0.0; - } - rel_uap = rel_precis * rel_precis; - if (int_precis < precis) - int_precis = precis; - - bucket = tr_vec->tr[j-1].sim * - ((double) NUM_TIME_PTS / (double) MAX_TIME); - if (bucket < 0) bucket = 0; - if (bucket >= NUM_TIME_PTS) bucket = NUM_TIME_PTS-1; - if (tr_vec->tr[j-1].rel >= epi->relevance_level) - eval->time_num_rel[bucket]++; - else - eval->time_num_nrel[bucket]++; - eval->time_precis[bucket] = (float)rel_so_far / - (float) eval->num_ret; - eval->time_relprecis[bucket] = ((float)rel_so_far) / - (float) min_ret_rel; - eval->time_uap[bucket] = (float) rel_so_far * rel_so_far / - ((float) eval->num_ret * (float) min_ret_rel); - eval->time_reluap[bucket] = (float) rel_so_far * rel_so_far / - ((float) min_ret_rel * (float) min_ret_rel); - eval->time_utility[bucket] = - epi->utility_a * rel_so_far + - epi->utility_b * (j - rel_so_far) + - epi->utility_c * (eval->num_rel - rel_so_far) + - epi->utility_d * (epi->num_docs_in_coll + - rel_so_far - j - eval->num_rel); - - /* Need to fill in buckets up to last bucket */ - /* note assumes buckets are decreasing */ - /* Must do here since utility can be negative and zero - cannot be used as flag later */ - for (i = bucket+1; i < last_time_bucket; i++) { - eval->time_precis[i] = eval->time_precis[bucket]; - eval->time_relprecis[i] = eval->time_relprecis[bucket]; - eval->time_uap[i] = eval->time_uap[bucket]; - eval->time_reluap[i] = eval->time_reluap[bucket]; - eval->time_utility[i] = eval->time_utility[bucket]; - } - last_time_bucket = bucket; - } - - eval->time_cum_rel[0] = eval->time_num_rel[0]; - eval->av_time_cum_rel = eval->time_num_rel[0]; - for (i=1; i< NUM_TIME_PTS; i++) { - eval->time_cum_rel[i] = eval->time_cum_rel[i-1] + eval->time_num_rel[i]; - eval->av_time_cum_rel += eval->time_cum_rel[i]; - eval->av_time_precis += eval->time_precis[i]; - eval->av_time_relprecis += eval->time_relprecis[i]; - eval->av_time_uap += eval->time_uap[i]; - eval->av_time_reluap += eval->time_reluap[i]; - eval->av_time_utility += eval->time_utility[i]; - } - eval->av_time_cum_rel /= NUM_TIME_PTS; - eval->av_time_precis /= NUM_TIME_PTS; - eval->av_time_relprecis /= NUM_TIME_PTS; - eval->av_time_uap /= NUM_TIME_PTS; - eval->av_time_reluap /= NUM_TIME_PTS; - eval->av_time_utility /= NUM_TIME_PTS; -} diff --git a/sm_cnn/tutorial.ipynb b/sm_cnn/tutorial.ipynb deleted file mode 100644 index 488cfc4..0000000 --- a/sm_cnn/tutorial.ipynb +++ /dev/null @@ -1,714 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SM CNN Model PyTorch Walkthrough" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This purpose of this notebook is to explain how to use PyTorch to implement the SM CNN Model for new PyTorch users. Here are the recommended prerequisites before reading this walkthrough:\n", - "\n", - "* Have knowledge of Convolutional Neural Networks. If not these are helpful slides: https://cs.uwaterloo.ca/~mli/Deep-Learning-2017-Lecture5CNN.ppt.\n", - "* Read the SM Model paper: http://dl.acm.org/citation.cfm?id=2767738\n", - "\n", - "The following is a slightly modified version of the SM CNN architecture that will be implemented in this tutorial. It does not have the bilinear similarity modeling component present in the original model by Severyn and MoschiŠtti. The following paper found removing this component actually improved answer selection effectiveness:\n", - "\n", - "Jinfeng Rao, Hua He, and Jimmy Lin. Experiments with Convolutional Neural Network Models for Answer Selection. *Proceedings of the 40th Annual International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR 2017)*, August 2017, Tokyo, Japan." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "![caption](files/nn-architecture.png)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "import torch.nn.functional as F" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the block below we define the model, with detailed explanations in comments. This model is slightly different from the model in model.py to keep the tutorial straightforward (e.g. ignore GPU code)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class QAModel(nn.Module):\n", - " \"\"\"\n", - " All PyTorch models should subclass nn.Module, the base class for neural network modules.\n", - " \"\"\"\n", - "\n", - " def __init__(self, input_n_dim, filter_width, conv_filters=100,\n", - " no_ext_feats=False, ext_feats_size=4, n_classes=2):\n", - " \"\"\"\n", - " :param input_n_dim: the dimension of each word vector\n", - " :param filter_width: the width of each convolution filter\n", - " :param conv_filters: the number of convolution filters\n", - " :param no_ext_feats: no additional external features\n", - " :param ext_feats_size: number of external features to use\n", - " :param n_classes: number of label classes\n", - " \"\"\"\n", - " super(QAModel, self).__init__()\n", - "\n", - " self.no_ext_feats = no_ext_feats\n", - "\n", - " # self.conv_channels specify the dimension of the output of the convolution,\n", - " # i.e. the number of convolution feature maps\n", - " self.conv_channels = conv_filters\n", - " # the elements in the hidden layer consist of equal number of inputs from the query and document (hence the 2*)\n", - " # and optionally the additional features (ext_feats_size)\n", - " n_hidden = 2*self.conv_channels + (0 if no_ext_feats else ext_feats_size)\n", - "\n", - " # define the convolution for the question/query - 1D convolution followed by tanh nonlinear activation\n", - " # modules (nn.Conv1d and nn.Tanh) will be added in the order presented to the nn.Sequential container\n", - " self.conv_q = nn.Sequential(\n", - " # the first parameter specifies the input dimension, the second parameter specifies the output dimension\n", - " nn.Conv1d(input_n_dim, self.conv_channels, filter_width, padding=filter_width-1),\n", - " # tanh activation is used to allow the network to learn non-linear decision boundaries\n", - " nn.Tanh()\n", - " )\n", - "\n", - " # define the convolution for the answer/document\n", - " self.conv_a = nn.Sequential(\n", - " nn.Conv1d(input_n_dim, self.conv_channels, filter_width, padding=filter_width-1),\n", - " nn.Tanh()\n", - " )\n", - "\n", - " # combining the features from the question, answer, and external features if any into a single vector\n", - " # note PyTorch nn classes follow a similar signature - the first parameter specifies the input dimension,\n", - " # the second parameter specifies the output dimension\n", - " # nn.Linear applies a linear transformation: Ax + b, where A and b are learned parameters.\n", - " self.combined_feature_vector = nn.Linear(2*self.conv_channels + \\\n", - " (0 if no_ext_feats else ext_feats_size), n_hidden)\n", - "\n", - " # defining other layers used in the network, note they are not yet linked with each other yet\n", - " # tanh is a non-linear activation function\n", - " self.combined_features_activation = nn.Tanh()\n", - " # dropout is used to prevent overfitting and only used during training\n", - " # elements are randomly zeroed with probability 0.5 and all elements are scaled by a factor of 1/0.5 = 2\n", - " self.dropout = nn.Dropout(0.5)\n", - " # hidden layer is used to capture additional interactions between the components of the intermediate representation\n", - " self.hidden = nn.Linear(n_hidden, n_classes)\n", - " # softmax computes probability distributions\n", - " self.logsoftmax = nn.LogSoftmax()\n", - "\n", - "\n", - " def forward(self, question, answer, ext_feats):\n", - " \"\"\"\n", - " Defines the forward pass of the network. When the model is called, e.g. model(*args) the args\n", - " are actually passed to the forward method.\n", - " The question and answer tensors are 3-dimensional. The first dimension specifies the sentence - it\n", - " can be larger than 1 since multiple sentences can be batched together in one forward pass.\n", - " The second and third dimensions specify the dimension of the word vector and the number of tokens respectively.\n", - " \n", - " :param question: the sentence matrices of questions (queries). Note the plural form - this is explained above.\n", - " :param answer: the sentence matrices of answers (documents). Note the plural form - this is explained above.\n", - " :param ext_feats: the external features for the question-answer pairs.\n", - " :returns: the log-likelihood of the question-answer pairs belonging in each class.\n", - " \"\"\"\n", - " # feed the question sentence matrices through the conv_q layers.\n", - " # IMPORTANT: the second dimension of the question MUST match the the first argument\n", - " # the Conv1d instance created (input_n_dim). The first dimension of the question specifies\n", - " # the batch size (number of questions).\n", - " q = self.conv_q.forward(question)\n", - " # max pool using q.size()[2] as the window size, which is the length of each convolution feature map\n", - " q = F.max_pool1d(q, q.size()[2])\n", - " # reshape max pooled elements into a vector of length equal to the number of feature maps\n", - " # the max pooling takes one value (the max) out of each convolution feature map\n", - " q = q.view(-1, self.conv_channels)\n", - "\n", - " # feed the answer sentence matrices through the conv_a layers, similar to the previous part for the question.\n", - " a = self.conv_a.forward(answer)\n", - " a = F.max_pool1d(a, a.size()[2])\n", - " a = a.view(-1, self.conv_channels)\n", - "\n", - " # concatenate the outputs of the conv_q, conv_a layers together\n", - " # with optionally the ext_feats along the first dimension\n", - " x = None\n", - " if self.no_ext_feats:\n", - " x = torch.cat([q, a], 1)\n", - " else:\n", - " x = torch.cat([q, a, ext_feats], 1)\n", - "\n", - " # feed the concatenated feature vector through the rest of the network (starting with join layer in figure)\n", - " x = self.combined_feature_vector.forward(x)\n", - " x = self.combined_features_activation.forward(x)\n", - " x = self.dropout(x)\n", - " x = self.hidden(x)\n", - " x = self.logsoftmax(x)\n", - "\n", - " return x\n", - " \n", - " @staticmethod\n", - " def load(model_fname):\n", - " return torch.load(model_fname)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now load a pre-trained model with one input and see what the model actually does. For this, you'll need to clone the `data` and `models` projects in https://github.com/castorini." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The cell below contains some bootstrapping code to prepare the data, load the model, etc.. It is not important to understand it just to see how the SM CNN model itself works." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING - WARNING: expecting a .gz file. Is the ../../data/word2vec/aquaint+wiki.txt.gz.ndim=50.bin in the correct format?\n", - "/Users/michael/anaconda/lib/python3.6/site-packages/torch/serialization.py:284: SourceChangeWarning: source code of class 'model.QAModel' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.\n", - " warnings.warn(msg, SourceChangeWarning)\n" - ] - } - ], - "source": [ - "import os\n", - "import sys\n", - "\n", - "import numpy as np\n", - "\n", - "from train import Trainer\n", - "import utils\n", - "\n", - "torch.manual_seed(1234)\n", - "np.random.seed(1234)\n", - "\n", - "# cache word embeddings\n", - "word_vectors_file = '../../data/word2vec/aquaint+wiki.txt.gz.ndim=50.bin'\n", - "cache_file = os.path.splitext(word_vectors_file)[0] + '.cache'\n", - "utils.cache_word_embeddings(word_vectors_file, cache_file)\n", - "\n", - "vocab_size, vec_dim = utils.load_embedding_dimensions(cache_file)\n", - "\n", - "# loading a pre-trained model\n", - "trained_model = QAModel.load('../../models/sm_model/sm_model.TrecQA.TRAIN-ALL.2017-04-02.castor')\n", - "evaluator = Trainer(trained_model, 0.001, 0.0, False, vec_dim)\n", - "\n", - "evaluator.load_input_data('../../data/TrecQA', cache_file, None, None, 'raw-dev')\n", - "\n", - "questions, sentences, labels, maxlen_q, maxlen_s, ext_feats = evaluator.data_splits['raw-dev']\n", - "word_vectors = evaluator.embeddings\n", - "pair_idx = 100 # particular question/answer pair we are interested in\n", - "batch_inputs, batch_labels = evaluator.get_tensorized_inputs(\n", - " questions[pair_idx:pair_idx + 1],\n", - " sentences[pair_idx:pair_idx + 1],\n", - " labels[pair_idx:pair_idx + 1],\n", - " ext_feats[pair_idx:pair_idx + 1],\n", - " word_vectors, vec_dim\n", - ")\n", - "\n", - "xq, xa, x_ext_feats = batch_inputs[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "The question we want to compute similarity for and its sentence matrix dimension is shown below. The first dimension is the batch size, which is one in this case. Hence, the first index can be thought of as an index into the particular single sentence matrix. For each sentence matrix, each column represents the word vector for the corresponding word/token in the sentence (5 in total)." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "where was durst born ?\n", - "torch.Size([1, 50, 5])\n" - ] - } - ], - "source": [ - "print(questions[pair_idx])\n", - "print(xq.size())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The answer we want to compute similarity for and its sentence matrix is:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "born in jacksonville , fla . , durst grew up in gastonia , n.c . , where his love of hip-hop music and break dancing made him an outcast .\n", - "torch.Size([1, 50, 30])\n" - ] - } - ], - "source": [ - "print(sentences[pair_idx])\n", - "print(xa.size())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll not use any external features for this example, so `x_ext_feats` is a vector of zeros." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Variable containing:\n", - " 0 0 0 0\n", - "[torch.FloatTensor of size 1x4]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_ext_feats" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let us step through the `forward` method of the model. Normally we'll just call `trained_model(xq, xa, x_ext_feats)` but to illustrate the steps we'll copy the lines here again and see what happens underneath the hood." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, we want to compute convolutional feature maps for the question. We just call `forward` to make a forward pass. We get 100 convolutional feature maps of length 9 each. We have 5 tokens with a padding of 4 on each side, for a total width of 5+2*4 = 13. Our convolution filter width is 5. Hence, we have 13 - 5 + 1 = 9 total positions for the \"sliding window\"." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([1, 100, 9])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q = trained_model.conv_q.forward(xq)\n", - "q.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then, we want to max-pool the convolutional feature maps. We take max element out of every convolutional feature map of length 9, getting back 100 elements." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "q.size()[2]: 9\n" - ] - }, - { - "data": { - "text/plain": [ - "torch.Size([1, 100, 1])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print('q.size()[2]:', q.size()[2])\n", - "# max pool using q.size()[2] as the window size, which is the length of each convolution feature map\n", - "q = F.max_pool1d(q, q.size()[2])\n", - "q.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we reshape `q` into a 1 x 100 vector. Using -1 automatically determines the dimension for that index." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([1, 100])" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "q = q.view(-1, trained_model.conv_channels)\n", - "q.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Similarly, we want to compute the max-pooled convolutional feature maps for the answer. This is a vector of length 100." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([1, 100])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = trained_model.conv_a.forward(xa)\n", - "a = F.max_pool1d(a, a.size()[2])\n", - "a = a.view(-1, trained_model.conv_channels)\n", - "a.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we join the max-pooled results together with the external features. Note the pre-trained model was trained with external features so we must run the code path with external features, but we can use 0 as the inputs since this is only for demonstration purposes." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([1, 204])" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = torch.cat([q, a, x_ext_feats], 1)\n", - "x.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we forward pass the features through the join layer, getting 201 inputs into the hidden layer." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([1, 201])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = trained_model.combined_feature_vector.forward(x)\n", - "x.size()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([1, 201])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = trained_model.combined_features_activation.forward(x)\n", - "x.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note the activation doesn't change the dimensions. After activation we pass it through the Dropout layer, although this doesn't do anything since are not training the model." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "First 10 elements before Dropout [-0.12813647 0.01474741 -0.12794048 -0.13291343 -0.24393715 -0.00718142\n", - " -0.08802623 -0.08587593 0.23123664 0.02877411]\n", - "First 10 elements after Dropout [-0.12813647 0.01474741 -0.12794048 -0.13291343 -0.24393715 -0.00718142\n", - " -0.08802623 -0.08587593 0.23123664 0.02877411]\n" - ] - }, - { - "data": { - "text/plain": [ - "torch.Size([1, 201])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print('First 10 elements before Dropout', x[0, :10].data.numpy())\n", - "x = trained_model.dropout(x)\n", - "print('First 10 elements after Dropout', x[0, :10].data.numpy())\n", - "x.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we pass the elements through the hidden layer, outputing just 2 elements." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([1, 2])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = trained_model.hidden(x)\n", - "x.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we find the log-probabilities." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Variable containing:\n", - "-0.0051 -5.2729\n", - "[torch.FloatTensor of size 1x2]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = trained_model.logsoftmax(x)\n", - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Get the actual probabilities by using `exp`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Variable containing:\n", - " 0.9949 0.0051\n", - "[torch.FloatTensor of size 1x2]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "torch.exp(x)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Hence, the probability of label 0 is 0.9949 while the probability of label 1 is 0.0051." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/sm_cnn/utils.py b/sm_cnn/utils.py deleted file mode 100644 index 926028c..0000000 --- a/sm_cnn/utils.py +++ /dev/null @@ -1,179 +0,0 @@ -# file input output -import os -import re -import string - -from gensim.models.keyedvectors import KeyedVectors -from nltk.corpus import stopwords -from nltk.stem import PorterStemmer -import numpy as np - -# logging setup -import logging -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - -ch = logging.StreamHandler() -ch.setLevel(logging.DEBUG) -formatter = logging.Formatter('%(levelname)s - %(message)s') -ch.setFormatter(formatter) -logger.addHandler(ch) - -def logargs(func): - def inner(*args, **kwargs): - logger.info('%s : %s %s' % (func.__name__, args, kwargs)) - return func(*args, **kwargs) - return inner - - -def cache_word_embeddings(word_embeddings_file, cache_file): - if not word_embeddings_file.endswith('.gz'): - logger.warning('WARNING: expecting a .gz file. Is the {} in the correct \ - format?'.format(word_embeddings_file)) - - vocab_size, vec_dim = 0, 0 - - if not os.path.exists(cache_file): - # cache does not exist - if not os.path.exists(os.path.dirname(cache_file)): - # make cache folder if needed - os.mkdir(os.path.dirname(cache_file)) - logger.info('caching the word embeddings in np.memmap format') - wv = KeyedVectors.load_word2vec_format(word_embeddings_file, binary=True) - # print len(wv.syn0), wv.syn0.shape - # print len(wv.syn0norm) if wv.syn0norm else None - fp = np.memmap(cache_file, dtype=np.double, mode='w+', shape=wv.syn0.shape) - fp[:] = wv.syn0[:] - with open(cache_file + '.vocab', 'w', encoding='utf-8') as f: - logger.info('writing out vocab for {}'.format(word_embeddings_file)) - for _, w in sorted((voc.index, word) for word, voc in wv.vocab.items()): - print(w, file=f) - with open(cache_file + '.dimensions', 'w', encoding='utf-8') as f: - logger.info('writing out dimensions for {}'.format(word_embeddings_file)) - print(wv.syn0.shape[0], wv.syn0.shape[1], file=f) - vocab_size, vec_dim = wv.syn0.shape - del fp, wv - print('cached {} into {}'.format(word_embeddings_file, cache_file)) - - return vocab_size, vec_dim - - -def load_embedding_dimensions(cache_file): - vocab_size, vec_dim = 0, 0 - with open(cache_file + '.dimensions', encoding='utf-8') as d: - vocab_size, vec_dim = [int(e) for e in d.read().strip().split()] - return vocab_size, vec_dim - - -def load_cached_embeddings(cache_file, vocab_list, w2v_dict, oov_vec=[]): - """ - w2v_dict is filled up as reference - """ - logger.debug('loading cached embeddings ') - - with open(cache_file + '.dimensions', encoding='utf-8') as d: - vocab_size, vec_dim = [int(e) for e in d.read().strip().split()] - - W = np.memmap(cache_file, dtype=np.double, shape=(vocab_size, vec_dim)) - - with open(cache_file + '.vocab', encoding='utf-8') as f: - logger.debug('loading vocab') - w2v_vocab_list = map(str.strip, f.readlines()) - - vocab_dict = {w:k for k, w in enumerate(w2v_vocab_list)} - - # Read w2v for vocab appears in Q and A - for word in vocab_list: - if word in w2v_dict: - continue - if word in vocab_dict: - w2v_dict[word] = W[vocab_dict[word]] - else: - w2v_dict[word] = np.random.uniform(-0.25, 0.25, vec_dim) \ - if len(oov_vec) == 0 else oov_vec - #w2v_dict[word] = W[vocab_dict["unk"]] - -def read_in_data(datapath, set_name, file, stop_and_stem=False, stop_punct=False, dash_split=False): - data = [] - with open(os.path.join(datapath, set_name, file), encoding='utf-8') as inf: - data = [line.strip() for line in inf.readlines()] - - if dash_split: - def split_hyphenated_words(sentence): - rtokens = [] - for term in sentence.split(): - for t in term.split('-'): - if t: - rtokens.append(t) - return ' '.join(rtokens) - data = [split_hyphenated_words(sentence) for sentence in data] - - if stop_punct: - regex = re.compile('[{}]'.format(re.escape(string.punctuation))) - def remove_punctuation(sentence): - rtokens = [] - for term in sentence.split(): - for t in regex.sub(' ', term).strip().split(): - if t: - rtokens.append(t) - return ' '.join(rtokens) - data = [remove_punctuation(sentence) for sentence in data] - - if stop_and_stem: - stemmer = PorterStemmer() - stoplist = set(stopwords.words('english')) - def stop_stem(sentence): - return ' '.join([stemmer.stem(word) for word in sentence.split() \ - if word not in stoplist]) - data = [stop_stem(sentence) for sentence in data] - return data - -def read_in_dataset(dataset_folder, set_folder, stop_punct=False, dash_split=False): - """ - read in the data to return (question, sentence, label) - set_folder = {train|dev|test} - """ - max_q = 0 - max_s = 0 - set_path = os.path.join(dataset_folder, set_folder) - - #questions = [line.strip() for line in open(os.path.join(set_path, 'a.toks')).readlines()] - questions = read_in_data(dataset_folder, set_folder, "a.toks", False, stop_punct, dash_split) - len_q_list = [len(q.split()) for q in questions] - - #sentences = [line.strip() for line in open(os.path.join(set_path, 'b.toks')).readlines()] - sentences = read_in_data(dataset_folder, set_folder, "b.toks", False, stop_punct, dash_split) - len_s_list = [len(s.split()) for s in sentences] - - #labels = [int(line.strip()) for line in open(os.path.join(set_path, 'sim.txt')).readlines()] - labels = [int(lbl) for lbl in read_in_data(dataset_folder, set_folder, "sim.txt")] - - #vocab = [line.strip() for line in open(os.path.join(dataset_folder, 'vocab.txt')).readlines()] - #all_data = list(set(questions)) + list(set(sentences)) - all_data = questions + sentences - vocab_set = set() - for sentence in all_data: - for term in sentence.split(): - vocab_set.add(term) - vocab = sorted(list(vocab_set)) - - return [questions, sentences, labels, max(len_q_list), max(len_s_list), vocab] - - -def get_test_qids_labels(dataset_folder, set_folder): - set_path = os.path.join(dataset_folder, set_folder) - qids = [line.strip() for line in open(os.path.join(set_path, 'id.txt'), encoding='utf-8').readlines()] - labels = np.array([int(line.strip()) for line in open(os.path.join(set_path, 'sim.txt'), encoding='utf-8').readlines()]) - return qids, labels - - -if __name__ == "__main__": - - vocab = ["unk", "idontreallythinkthiswordexists", "hello"] - - w2v_dict = {} - load_cached_embeddings("../../data/word2vec/aquaint+wiki.txt.gz.ndim=50.cache", vocab, w2v_dict) - - for w, v in w2v_dict.iteritems(): - print(w) - print(v) diff --git a/sm_modified_cnn/wiki_dataset.py b/sm_cnn/wiki_dataset.py similarity index 67% rename from sm_modified_cnn/wiki_dataset.py rename to sm_cnn/wiki_dataset.py index 67cbbf9..8c23110 100644 --- a/sm_modified_cnn/wiki_dataset.py +++ b/sm_cnn/wiki_dataset.py @@ -1,16 +1,14 @@ from torchtext import data -import os class WikiDataset(data.TabularDataset): dirname = 'data' @classmethod - def splits(cls, question_id, question_field, answer_field, external_field, label_field, - train='train.tsv', validation='dev.tsv', test='test.tsv'): + def splits(cls, question_id, question_field, answer_field, external_field, label_field, root='.data', + train='wikiqa.train.tsv', validation='wikiqa.dev.tsv', test='wikiqa.test.tsv'): path = './data' - prefix_name = 'wikiqa.' return super(WikiDataset, cls).splits( - os.path.join(path, prefix_name), train, validation, test, + path, root, train, validation, test, format='TSV', fields=[('qid', question_id), ('label', label_field), ('question', question_field), ('answer', answer_field), ('ext_feat', external_field)] ) diff --git a/sm_modified_cnn/.gitignore b/sm_modified_cnn/.gitignore deleted file mode 100644 index 7483f8e..0000000 --- a/sm_modified_cnn/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -*pyc -*.pt -text/ -trained_models/ -trec_eval-8.0/trec_eval.dSYM -data/ diff --git a/sm_modified_cnn/README.md b/sm_modified_cnn/README.md deleted file mode 100644 index f9bfc3d..0000000 --- a/sm_modified_cnn/README.md +++ /dev/null @@ -1,149 +0,0 @@ -## SM model - -#### References: -1. Aliaksei _S_everyn and Alessandro _M_oschitti. 2015. Learning to Rank Short Text Pairs with Convolutional Deep Neural -Networks. In Proceedings of the 38th International ACM SIGIR Conference on Research and Development in Information -Retrieval (SIGIR '15). ACM, New York, NY, USA, 373-382. DOI: http://dx.doi.org/10.1145/2766462.2767738 - - -### Requirements -``` -nltk==3.2.2 -numpy==1.11.3 -pytorch==0.1.12 -gensim==1.0.1 -``` - -The code uses torchtext for text processing. Set torchtext: -```bash -git clone https://github.com/pytorch/text.git -cd text - -#use this commit number -git reset --hard 2980f1bc39ba6af332c5c2783da8bee109796d4c -python setup.py install -``` - -We use `trec_eval` for evaluation: - -```bash -cd eval -tar -xvf trec_eval.9.0.tar.gz -cd trec_eval.9.0 -make -cd ../.. -``` - - -### Setup -Clone and create the dataset: -```bash -git clone https://github.com/castorini/data.git -git clone https://github.com/castorini/Castor.git -``` - -You should you see the following tree: -``` -. -├── Castor -│   ├── README.md -│   ├── baseline_results.tsv -│   ├── idf_baseline -│   ├── kim_cnn -│   ├── mp_cnn -│   ├── setup.py -│   ├── sm_cnn -│   └── sm_modified_cnn -└── data - ├── GloVe - ├── ParagramEmbeddings - ├── README.md - ├── SimpleQuestions_v2 - ├── TrecQA - ├── WikiQA - ├── msrvid - ├── requirements.txt - ├── sick - ├── twitterPPDB - ├── utils - └── word2vec -``` - -To create the dataset: -```bash -cd Castor/sm_modified_cnn/ -./create_dataset.sh -``` - -### Training -Download the word2vec model from [here] (https://drive.google.com/file/d/0B2u_nClt6NbzUmhOZU55eEo4QWM/view?usp=sharing) -and copy it to the `data/` folder. - -You can train the SM model for the 4 following configurations: -1. __random__ - the word embedddings are initialized randomly and are tuned during training -2. __static__ - the word embeddings are static (Severyn and Moschitti, SIGIR'15) -3. __non-static__ - the word embeddings are tuned during training -4. __multichannel__ - contains static and non-static channels for question and answer conv layers - -To train on GPU 0 with static configuration: - -```bash -python train.py --mode static --gpu 0 -``` - -NB: pass `--no_cuda` to use CPU - -The trained model will be save to: -``` -saves/static_best_model.pt -``` - -### Testing the model - -``` -python main.py --trained_model saves/TREC/multichannel_best_model.pt -``` - -### Evaluation - -The performance on TrecQA dataset: - -### TrecQA: - -#### Best dev -Metric |rand |static|non-static|multichannel --------|------|------|----------|------------ -MAP |0.8096|0.8162|0.8387 | 0.8274 -MRR |0.8560|0.8918|0.9058 | 0.8818 - -#### Test -Metric |rand |static|non-static|multichannel --------|-------|------|----------|------------ -MAP |0.7441 |0.7524|0.7688 |0.7641 -MRR |0.8172 |0.8012|0.8144 |0.8174 - -### WikiQA: - -#### Best dev -Metric |rand |static|non-static|multichannel --------|------|------|----------|------------ -MAP |0.7109|0.7204|0.7049 | 0.7245 -MRR |0.7169|0.7234|0.7075 | 0.7259 - -#### Test -Metric |rand |static|non-static|multichannel --------|-------|------|----------|------------ -MAP |0.6313 |0.6378|0.6455 |0.6476 -MRR |0.6522 |0.6542|0.6689 |0.6646 - -NB: The results on WikiQA are based on the SM model hyperparameters. - - -### To create your own word2vec.pt file - -+ Download word2vec from [here](https://drive.google.com/drive/u/0/folders/0B-yipfgecoSBfkZlY2FFWEpDR3M4Qkw5U055MWJrenE5MTBFVXlpRnd0QjZaMDQxejh1cWs) -to the `data/` folder - -```bash -python utils.py --input data/aquaint+wiki.txt.gz.ndim=50.bin -``` \ No newline at end of file diff --git a/sm_modified_cnn/eval/gdeval.pl b/sm_modified_cnn/eval/gdeval.pl deleted file mode 100755 index 7ae7572..0000000 --- a/sm_modified_cnn/eval/gdeval.pl +++ /dev/null @@ -1,340 +0,0 @@ -#!/usr/bin/perl -w - -# Graded relevance assessment script for the TREC 2010 Web track -# Evalution measures are written to standard output in CSV format. -# -# Currently reports only NDCG and ERR -# (see http://learningtorankchallenge.yahoo.com/instructions.php) - -use constant LOGBASEDIV => log(2.0); - -# gloals -my $QRELS; -my $VERSION = "version 1.3 (Mon Apr 29 20:50:24 EDT 2013)"; -my $MAX_JUDGMENT = 4; # Maximum gain value allowed in qrels file. -my $K = 20; # Reporting depth for results. -my $USAGE = "usage: $0 [options] qrels run\n - options:\n - -c - Average over the complete set of topics in the relevance judgments - instead of the topics in the intersection of relevance judgments - and results.\n - -k value - Non-negative integer depth of ranking to evaluate in range [1,inf]. - Default value is k=@{[($K)]}.\n - -baseline BASELINE_RUN_FILE - Baseline run to use for risk-sensitive evaluation\n - -riskAlpha value - Non-negative Risk sensitivity value to use when doing risk-sensitive - evaluation. A baseline must still be specified. By default 0. - The final weight to downside changes in performance is (1+value).\n"; - - - -use strict 'vars'; - -{ # main block to scope variables - if ($#ARGV >= 0 && ($ARGV[0] eq "-v" || $ARGV[0] eq "-version")) { - print "$0: $VERSION\n"; - exit 0; - } - - my $baselineRun = undef; - my $riskAlpha = 0; - my $cflag = 0; - while ($#ARGV != 1) # should probably replace this with perl's argument parsing - { - if ($#ARGV >= 0 && $ARGV[0] eq "-help") { - print "$USAGE\n"; - exit 0; - } - elsif ($#ARGV >= 2 and ("-c" eq $ARGV[0])) - { - $cflag = 1; - shift @ARGV; - } - elsif ($#ARGV >= 3 and ("-k" eq $ARGV[0])) - { - $K = int($ARGV[1]); - die $USAGE if ($K < 1); -# print STDERR "k=$K\n"; - shift @ARGV; shift @ARGV; - } - elsif ($#ARGV >= 3 and ("-baseline" eq $ARGV[0])) - { - $baselineRun = $ARGV[1]; - shift @ARGV; shift @ARGV; - } - elsif ($#ARGV >= 3 and ("-riskAlpha" eq $ARGV[0])) - { - $riskAlpha = $ARGV[1]; - die $USAGE if ($riskAlpha < 0.0); - shift @ARGV; shift @ARGV; - } - else - { - die $USAGE; - } - } - - die $USAGE unless $#ARGV == 1; - $QRELS = $ARGV[0]; - my $run = $ARGV[1]; - - # Read qrels file, check format, and sort - my @qrels = (); - my %seen = (); - open (QRELS,"<$QRELS") || die "$0: cannot open \"$QRELS\": $!\n"; - while () { - s/[\r\n]//g; - my ($topic, $zero, $docno, $judgment) = split (' '); - $topic =~ s/^.*\-//; - die "$0: format error on line $. of \"$QRELS\"\n" - unless - $topic =~ /^[0-9]+$/ && $zero == 0 - && $judgment =~ /^-?[0-9]+$/ && $judgment <= $MAX_JUDGMENT; - if ($judgment > 0) { - $qrels[$#qrels + 1]= "$topic $docno $judgment"; - $seen{$topic} = 1; - } - } - close (QRELS); - @qrels = sort qrelsOrder (@qrels); - - # Process qrels: store judgments and compute ideal gains - my $topicCurrent = -1; - my %ideal = (); - my @gain = (); - my %judgment = (); - for (my $i = 0; $i <= $#qrels; $i++) { - my ($topic, $docno, $judgment) = split (' ', $qrels[$i]); - if ($topic != $topicCurrent) { - if ($topicCurrent >= 0) { - $ideal{$topicCurrent} = &dcg($K, @gain); - $#gain = -1; - } - $topicCurrent = $topic; - } - next if $judgment < 0; - $judgment{"$topic:$docno"} = $gain[$#gain + 1] = $judgment; - } - if ($topicCurrent >= 0) { - $ideal{$topicCurrent} = &dcg($K, @gain); - $#gain = -1; - } - - # process baseline if doing risk sensitive - my ($baseNDCGByTopic,$baseERRByTopic,$baserunname); - if (defined $baselineRun) - { - ($baseNDCGByTopic,$baseERRByTopic,$baserunname) = processRun($baselineRun,0,\%seen,\%ideal,\%judgment,$cflag,0); - } - - # process main run - processRun($run,1,\%seen,\%ideal,\%judgment,$cflag,defined($baselineRun),$riskAlpha,$baserunname,$baseNDCGByTopic,$baseERRByTopic); - - exit 0; - -} # end main block - -# comparison function for qrels: by topic then judgment -sub qrelsOrder { - my ($topicA, $docnoA, $judgmentA) = split (' ', $a); - my ($topicB, $docnoB, $judgmentB) = split (' ', $b); - - if ($topicA < $topicB) { - return -1; - } elsif ($topicA > $topicB) { - return 1; - } else { - return $judgmentB <=> $judgmentA; - } -} - -# comparison function for runs: by topic then score then docno -sub runOrder { - my ($topicA, $docnoA, $scoreA) = split (' ', $a); - my ($topicB, $docnoB, $scoreB) = split (' ', $b); - - if ($topicA < $topicB) { - return -1; - } elsif ($topicA > $topicB) { - return 1; - } elsif ($scoreA < $scoreB) { - return 1; - } elsif ($scoreA > $scoreB) { - return -1; - } elsif ($docnoA lt $docnoB) { - return 1; - } elsif ($docnoA gt $docnoB) { - return -1; - } else { - return 0; - } -} - -# compute DCG over a sorted array of gain values, reporting at depth $k -sub dcg { - my ($k, @gain) = @_; - my ($i, $score) = (0, 0); - - for ($i = 0; $i <= ($k <= $#gain ? $k - 1 : $#gain); $i++) { - $score += (2**$gain[$i] - 1)/(log ($i + 2)/ +LOGBASEDIV); - } - return $score; -} - -# compute ERR over a sorted array of gain values, reporting at depth $k -sub err { - my ($k, @gain) = @_; - my ($i, $score, $decay, $r); - - $score = 0.0; - $decay = 1.0; - for ($i = 0; $i <= ($k <= $#gain ? $k - 1 : $#gain); $i++) { - $r = (2**$gain[$i] - 1)/(2**$MAX_JUDGMENT); - $score += $r*$decay/($i + 1); - $decay *= (1 - $r); - } - return $score; -} - -sub riskWeighted -{ - my ($run,$base,$alpha) = @_; - if ($run < $base) - { - $run = (1+$alpha) * ($run - $base); - } - else - { - $run = $run - $base; - } - return $run; -} -# compute and report information for current topic -sub topicDone { - my ($printTopic, $runid, $topic, $pndcgTotal, $perrTotal, $ptopics, $pseen, $pideal, - $isRiskSensitive, $riskAlpha, $baseNDCG, $baseERR, @gain) = @_; - my($ndcg, $err) = (0, 0); - if (exists($$pseen{$topic}) and defined($$pseen{$topic}) and $$pseen{$topic}) { - $ndcg = &dcg($K, @gain)/$$pideal{$topic}; - $err = &err ($K, @gain); - $ndcg = riskWeighted($ndcg,$baseNDCG,$riskAlpha) if ($isRiskSensitive); - $err = riskWeighted($err,$baseERR,$riskAlpha) if ($isRiskSensitive); - $$pndcgTotal += $ndcg; - $$perrTotal += $err; - $$ptopics++; - printf("$runid,$topic,%.5f,%.5f\n",$ndcg,$err) if ($printTopic); - return ($ndcg,$err); - } -} - -sub processRun -{ - my ($run,$printTopics,$pseen,$pideal,$pjudgment,$avgOverAllTopics,$isRiskSensitive,$riskAlpha,$baserunname,$baseNDCGByTopic,$baseERRByTopic) = @_; - my $ndcgByTopic = {()}; - my $errByTopic = {()}; - my $runid = "?????"; - my @run = (); - # Read run rile, check format, and sort - open (RUN,"<$run") || die "$0: cannot open \"$run\": $!\n"; - while () { - s/[\r\n]//g; - my ($topic, $q0, $docno, $rank, $score); - ($topic, $q0, $docno, $rank, $score, $runid) = split (' '); - $topic =~ s/^.*\-//; - die "$0: format error on line $. of \"$run\"\n" - unless - $topic =~ /^[0-9]+$/ && $q0 eq "Q0" && $rank =~ /^[0-9]+$/ && $runid; - $run[$#run + 1] = "$topic $docno $score"; - } - - @run = sort runOrder (@run); - - my %processed = (); - foreach my $topic (%$pseen) - { - $processed{$topic} = 0; - } - - if ($isRiskSensitive) - { - $runid = sprintf("%s (rel to. %s, rs=1+a, a=%s)",$runid,$baserunname,$riskAlpha); - } - - # Process runs: compute measures for each topic and average - my $ndcgTotal = 0; - my $errTotal = 0; - my $topics = 0; - print "runid,topic,ndcg\@$K,err\@$K\n" if ($printTopics); - my $topicCurrent = -1; - my @gain = (); - for (my $i = 0; $i <= $#run; $i++) { - my ($topic, $docno, $score) = split (' ', $run[$i]); - if ($topic != $topicCurrent) { - if ($topicCurrent >= 0) { - my ($baseNDCG,$baseERR) = 0; - if ($isRiskSensitive) - { - $baseNDCG = $$baseNDCGByTopic{$topicCurrent} if (exists($$baseNDCGByTopic{$topicCurrent}) and defined($$baseNDCGByTopic{$topicCurrent})); - $baseERR = $$baseERRByTopic{$topicCurrent} if (exists($$baseERRByTopic{$topicCurrent}) and defined($$baseERRByTopic{$topicCurrent})); - } - my ($ndcg,$err) = &topicDone ($printTopics, $runid, $topicCurrent, \$ndcgTotal, \$errTotal, \$topics, - $pseen, $pideal, $isRiskSensitive, $riskAlpha, $baseNDCG, $baseERR, @gain); - $$ndcgByTopic{$topicCurrent} = $ndcg; - $$errByTopic{$topicCurrent} = $err; - $processed{$topicCurrent} = 1; - $#gain = -1; - } - $topicCurrent = $topic; - } - my $j = $$pjudgment{"$topic:$docno"}; - $j = 0 unless $j; - $gain[$#gain + 1] = $j; - } - if ($topicCurrent >= 0) { - my ($baseNDCG,$baseERR) = 0; - if ($isRiskSensitive) - { - $baseNDCG = $$baseNDCGByTopic{$topicCurrent} if (exists($$baseNDCGByTopic{$topicCurrent}) and defined($$baseNDCGByTopic{$topicCurrent})); - $baseERR = $$baseERRByTopic{$topicCurrent} if (exists($$baseERRByTopic{$topicCurrent}) and defined($$baseERRByTopic{$topicCurrent})); - } - my ($ndcg,$err) = &topicDone ($printTopics, $runid, $topicCurrent, \$ndcgTotal, \$errTotal, \$topics, - $pseen, $pideal, $isRiskSensitive, $riskAlpha, $baseNDCG, $baseERR, @gain); - $$ndcgByTopic{$topicCurrent} = $ndcg; - $$errByTopic{$topicCurrent} = $err; - $processed{$topicCurrent} = 1; - $#gain = -1; - } - my $numTopics = $topics; # $topics has the number in the run (at this point) - if ($avgOverAllTopics) - { - $numTopics = scalar(keys %$pseen); # we want denominator to change whenever flag is on but only need to compute differences for risk - if ($isRiskSensitive) - { # need to process any topics that were missing from run - my ($baseNDCG,$baseERR) = 0; - my @gain = (); - foreach my $topicCurrent (sort {$a <=> $b} keys %processed) - { - next if ($processed{$topicCurrent}); - $baseNDCG = $$baseNDCGByTopic{$topicCurrent} if (exists($$baseNDCGByTopic{$topicCurrent}) and defined($$baseNDCGByTopic{$topicCurrent})); - $baseERR = $$baseERRByTopic{$topicCurrent} if (exists($$baseERRByTopic{$topicCurrent}) and defined($$baseERRByTopic{$topicCurrent})); - my ($ndcg,$err) = &topicDone ($printTopics, $runid, $topicCurrent, \$ndcgTotal, \$errTotal, \$topics, - $pseen, $pideal, $isRiskSensitive, $riskAlpha, $baseNDCG, $baseERR, @gain); - } - } - } - - my $ndcgAvg = $ndcgTotal; - my $errAvg = $errTotal; - if ($numTopics > 0) - { - $ndcgAvg /= $numTopics; - $errAvg /= $numTopics; - } - printf "$runid,amean,%.5f,%.5f\n",$ndcgAvg,$errAvg if ($printTopics); - - return ($ndcgByTopic,$errByTopic,$runid); - close(RUN); -} diff --git a/sm_modified_cnn/eval/trec_eval.9.0.tar.gz b/sm_modified_cnn/eval/trec_eval.9.0.tar.gz deleted file mode 100644 index 660de1614ea5faef863a0db521b797950e12fd32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392737 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

vUNant7$92n#I_ijQw+9?Z6cP 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 z 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 with U(-0.25, 0.25) vectors - field.vocab.vectors[i] = torch.FloatTensor(dim).uniform_(-0.25, 0.25) - else: - print("Error: Need word embedding pt file") - exit(1) - return field - -# Set default configuration in : args.py -args = get_args() -config = args - -# Set random seed for reproducibility -torch.manual_seed(args.seed) -if not args.cuda: - args.gpu = -1 -if torch.cuda.is_available() and args.cuda: - print("Note: You are using GPU for training") - torch.cuda.set_device(args.gpu) - torch.cuda.manual_seed(args.seed) -if torch.cuda.is_available() and not args.cuda: - print("You have Cuda but you're using CPU for training.") -np.random.seed(args.seed) -random.seed(args.seed) - -QID = data.Field(sequential=False) -QUESTION = data.Field(batch_first=True) -ANSWER = data.Field(batch_first=True) -LABEL = data.Field(sequential=False) -EXTERNAL = data.Field(sequential=False, tensor_type=torch.FloatTensor, batch_first=True, use_vocab=False, - preprocessing=data.Pipeline(lambda x: x.split()), - postprocessing=data.Pipeline(lambda x, train: [float(y) for y in x])) -if config.dataset == 'TREC': - train, dev, test = TrecDataset.splits(QID, QUESTION, ANSWER, EXTERNAL, LABEL) -elif config.dataset == 'wiki': - train, dev, test = WikiDataset.splits(QID, QUESTION, ANSWER, EXTERNAL, LABEL) -else: - print("Unsupported dataset") - exit() - -QID.build_vocab(train, dev, test) -QUESTION.build_vocab(train, dev, test) -ANSWER.build_vocab(train, dev, test) -LABEL.build_vocab(train, dev, test) - - -QUESTION = set_vectors(QUESTION, args.vector_cache) -ANSWER = set_vectors(ANSWER, args.vector_cache) - -train_iter = data.Iterator(train, batch_size=args.batch_size, device=args.gpu, train=True, repeat=False, - sort=False, shuffle=True) -dev_iter = data.Iterator(dev, batch_size=args.batch_size, device=args.gpu, train=False, repeat=False, - sort=False, shuffle=False) -test_iter = data.Iterator(test, batch_size=args.batch_size, device=args.gpu, train=False, repeat=False, - sort=False, shuffle=False) - -config.target_class = len(LABEL.vocab) -config.questions_num = len(QUESTION.vocab) -config.answers_num = len(ANSWER.vocab) - -print("Dataset {} Mode {}".format(args.dataset, args.mode)) -print("VOCAB num", len(QUESTION.vocab)) -print("LABEL.target_class:", len(LABEL.vocab)) -print("LABELS:", LABEL.vocab.itos) -print("Train instance", len(train)) -print("Dev instance", len(dev)) -print("Test instance", len(test)) - -if args.resume_snapshot: - if args.cuda: - model = torch.load(args.resume_snapshot, map_location=lambda storage, location: storage.cuda(args.gpu)) - else: - model = torch.load(args.resume_snapshot, map_location=lambda storage, location: storage) -else: - model = SmPlusPlus(config) - model.static_question_embed.weight.data.copy_(QUESTION.vocab.vectors) - model.nonstatic_question_embed.weight.data.copy_(QUESTION.vocab.vectors) - model.static_answer_embed.weight.data.copy_(ANSWER.vocab.vectors) - model.nonstatic_answer_embed.weight.data.copy_(ANSWER.vocab.vectors) - - if args.cuda: - model.cuda() - print("Shift model to GPU") - - -parameter = filter(lambda p: p.requires_grad, model.parameters()) - -# the SM model originally follows SGD but Adadelta is used here -optimizer = torch.optim.Adadelta(parameter, lr=args.lr, weight_decay=args.weight_decay) -criterion = nn.CrossEntropyLoss() -early_stop = False -best_dev_map = 0 -iterations = 0 -iters_not_improved = 0 -epoch = 0 -start = time.time() -header = ' Time Epoch Iteration Progress (%Epoch) Loss Dev/Loss Accuracy Dev/Accuracy' -dev_log_template = ' '.join('{:>6.0f},{:>5.0f},{:>9.0f},{:>5.0f}/{:<5.0f} {:>7.0f}%,{:>8.6f},{:8.6f},{:12.4f},{:12.4f}'.split(',')) -log_template = ' '.join('{:>6.0f},{:>5.0f},{:>9.0f},{:>5.0f}/{:<5.0f} {:>7.0f}%,{:>8.6f},{},{:12.4f},{}'.split(',')) -os.makedirs(args.save_path, exist_ok=True) -os.makedirs(os.path.join(args.save_path, args.dataset), exist_ok=True) -print(header) - -index2label = np.array(LABEL.vocab.itos) -index2qid = np.array(QID.vocab.itos) -index2question = np.array(ANSWER.vocab.itos) - -while True: - if early_stop: - print("Early Stopping. Epoch: {}, Best Dev Acc: {}".format(epoch, best_dev_map)) - break - epoch += 1 - train_iter.init_epoch() - n_correct, n_total = 0, 0 - - for batch_idx, batch in enumerate(train_iter): - iterations += 1 - model.train(); optimizer.zero_grad() - scores = model(batch) - n_correct += (torch.max(scores, 1)[1].view(batch.label.size()).data == batch.label.data).sum() - n_total += batch.batch_size - train_acc = 100. * n_correct / n_total - - loss = criterion(scores, batch.label) - loss.backward() - optimizer.step() - - # Evaluate performance on validation set - if iterations % args.dev_every == 1: - # switch model into evaluation mode - model.eval() - dev_iter.init_epoch() - n_dev_correct = 0 - dev_losses = [] - instance = [] - for dev_batch_idx, dev_batch in enumerate(dev_iter): - qid_array = index2qid[np.transpose(dev_batch.qid.cpu().data.numpy())] - true_label_array = index2label[np.transpose(dev_batch.label.cpu().data.numpy())] - - scores = model(dev_batch) - n_dev_correct += (torch.max(scores, 1)[1].view(dev_batch.label.size()).data == dev_batch.label.data).sum() - dev_loss = criterion(scores, dev_batch.label) - dev_losses.append(dev_loss.data[0]) - index_label = np.transpose(torch.max(scores, 1)[1].view(dev_batch.label.size()).cpu().data.numpy()) - label_array = index2label[index_label] - # get the relevance scores - score_array = scores[:, 2].cpu().data.numpy() - for i in range(dev_batch.batch_size): - this_qid, predicted_label, score, gold_label = qid_array[i], label_array[i], score_array[i], true_label_array[i] - instance.append((this_qid, predicted_label, score, gold_label)) - - - dev_map, dev_mrr = evaluate(instance, config.dataset, 'valid', config.mode) - print(dev_log_template.format(time.time() - start, - epoch, iterations, 1 + batch_idx, len(train_iter), - 100. * (1 + batch_idx) / len(train_iter), loss.data[0], - sum(dev_losses) / len(dev_losses), train_acc, dev_map)) - - # Update validation results - if dev_map > best_dev_map: - iters_not_improved = 0 - best_dev_map = dev_map - snapshot_path = os.path.join(args.save_path, args.dataset, args.mode+'_best_model.pt') - torch.save(model, snapshot_path) - else: - iters_not_improved += 1 - if iters_not_improved >= args.patience: - early_stop = True - break - - if iterations % args.log_every == 1: - # print progress message - print(log_template.format(time.time() - start, - epoch, iterations, 1 + batch_idx, len(train_iter), - 100. * (1 + batch_idx) / len(train_iter), loss.data[0], ' ' * 8, - n_correct / n_total * 100, ' ' * 12)) diff --git a/sm_modified_cnn/utils.py b/sm_modified_cnn/utils.py deleted file mode 100644 index f83dd93..0000000 --- a/sm_modified_cnn/utils.py +++ /dev/null @@ -1,31 +0,0 @@ -from tqdm import tqdm -import torch - -from gensim.models.keyedvectors import KeyedVectors -from argparse import ArgumentParser - - -def convert(fname, save_file): - with open(fname, 'rb') as dim_file: - vocab_size, dim = (int(x) for x in dim_file.readline().split()) - - word_vectors = KeyedVectors.load_word2vec_format(fname, binary=True) - - print("Loading vectors from {}".format(fname)) - vectors = [] - for line in tqdm(word_vectors.syn0, total=len(word_vectors.syn0)): - vectors.extend(line.tolist()) - vectors = torch.Tensor(vectors).view(-1, dim) - - stoi = {word.strip():voc.index for word, voc in word_vectors.vocab.items()} - - print('saving vectors to', save_file) - torch.save((stoi, vectors, dim), save_file) - -if __name__ == '__main__': - parser = ArgumentParser(description='create word embedding') - parser.add_argument('--input', type=str, required=True) - parser.add_argument('--output', type=str, default='data/word2vec.trecqa.pt') - - args = parser.parse_args() - convert(args.input, args.output) \ No newline at end of file