/ src / python / txtai / scoring / factory.py
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