Source code for xpmir.rankers.adapters

from typing import List, Tuple, Iterable
from experimaestro import Param
from xpmir.rankers import Scorer, ScoredDocument
from xpmir.letor.samplers.hydrators import SampleTransform
from xpmir.letor.records import TopicRecord
from xpmir.learning import ModuleInitOptions


[docs]class ScorerTransformAdapter(Scorer): """Transforms topic and/or documents output by a scorer when rescoring documents""" scorer: Param[Scorer] """The original scorer to be transform""" adapter: Param[SampleTransform] """The list of sample transforms to apply""" def __initialize__(self, options: ModuleInitOptions): super().__initialize__(options) self.scorer.__initialize__(options) def eval(self): self.scorer.train(False) def to(self, device): self.scorer.to(device) def transform_records( self, topic: TopicRecord, scored_documents: Iterable[ScoredDocument] ) -> Tuple[TopicRecord, List[ScoredDocument]]: topics = [topic.topic] docs = [sd.document for sd in scored_documents] topics = self.adapter.transform_topics(topics) or topics docs = self.adapter.transform_documents(docs) or docs sd_list = [ ScoredDocument(doc, sd.score) for (doc, sd) in zip(docs, scored_documents) ] return (topics[0].as_record(), sd_list) def compute( self, topic: TopicRecord, documents: Iterable[ScoredDocument] ) -> List[ScoredDocument]: topic, sd_list = self.transform_records(topic, documents) return self.scorer.compute(topic, sd_list)