factory.py
1 """ 2 Factory module 3 """ 4 5 from ..util import Resolver 6 7 from .bm25 import BM25 8 from .pgtext import PGText 9 from .sif import SIF 10 from .sparse import Sparse 11 from .tfidf import TFIDF 12 13 14 class ScoringFactory: 15 """ 16 Methods to create Scoring indexes. 17 """ 18 19 @staticmethod 20 def create(config, models=None): 21 """ 22 Factory method to construct a Scoring instance. 23 24 Args: 25 config: scoring configuration parameters 26 models: models cache 27 28 Returns: 29 Scoring 30 """ 31 32 # Scoring instance 33 scoring = None 34 35 # Support string and dict configuration 36 if isinstance(config, str): 37 config = {"method": config} 38 39 # Get scoring method 40 method = config.get("method", "bm25") 41 42 if method == "bm25": 43 scoring = BM25(config) 44 elif method == "pgtext": 45 scoring = PGText(config) 46 elif method == "sif": 47 scoring = SIF(config) 48 elif method == "sparse": 49 scoring = Sparse(config, models) 50 elif method == "tfidf": 51 scoring = TFIDF(config) 52 else: 53 # Resolve custom method 54 scoring = ScoringFactory.resolve(method, config) 55 56 # Store config back 57 config["method"] = method 58 59 return scoring 60 61 @staticmethod 62 def issparse(config): 63 """ 64 Checks if this scoring configuration builds a sparse index. 65 66 Args: 67 config: scoring configuration 68 69 Returns: 70 True if this config is for a sparse index 71 """ 72 73 # Types that are always a sparse index 74 indexes = ["pgtext", "sparse"] 75 76 # True if this config is for a sparse index 77 return config and isinstance(config, dict) and (config.get("method") in indexes or config.get("terms")) 78 79 @staticmethod 80 def resolve(backend, config): 81 """ 82 Attempt to resolve a custom backend. 83 84 Args: 85 backend: backend class 86 config: index configuration parameters 87 88 Returns: 89 Scoring 90 """ 91 92 try: 93 return Resolver()(backend)(config) 94 except Exception as e: 95 raise ImportError(f"Unable to resolve scoring backend: '{backend}'") from e