11import typing as t
22from difflib import SequenceMatcher
33
4- import litellm
5- import nltk # type: ignore[import-untyped]
6- from nltk .tokenize import word_tokenize # type: ignore[import-untyped]
7- from nltk .translate .bleu_score import sentence_bleu # type: ignore[import-untyped]
8- from rapidfuzz import distance , fuzz , utils
9- from sentence_transformers import SentenceTransformer , util
10- from sklearn .feature_extraction .text import TfidfVectorizer # type: ignore[import-untyped]
11- from sklearn .metrics .pairwise import ( # type: ignore # noqa: PGH003
12- cosine_similarity as sklearn_cosine_similarity ,
13- )
14-
154from dreadnode .meta import Config
165from dreadnode .metric import Metric
176from dreadnode .scorers .base import Scorer
187from dreadnode .scorers .util import cosine_similarity
198from dreadnode .util import warn_at_user_stacklevel
209
10+ if t .TYPE_CHECKING :
11+ from sentence_transformers import ( # type: ignore[import-not-found]
12+ SentenceTransformer ,
13+ )
14+
2115
2216def similarity (
2317 reference : str ,
@@ -94,12 +88,9 @@ def similarity_with_rapidfuzz(
9488 score_cutoff: Optional score cutoff below which to return 0.0.
9589 name: Name of the scorer.
9690 """
97- rapidfuzz_import_error_msg = (
98- "RapidFuzz dependency is not installed. Please install it with: pip install rapidfuzz"
99- )
100-
91+ rapidfuzz_import_error_msg = "RapidFuzz dependency is not installed. Please install it with: pip install rapidfuzz or dreadnode[text]"
10192 try :
102- fuzz . ratio ( "test" , "test" )
93+ from rapidfuzz import fuzz , utils # type: ignore[import-not-found]
10394 except ImportError :
10495 warn_at_user_stacklevel (rapidfuzz_import_error_msg , UserWarning )
10596
@@ -191,11 +182,11 @@ def string_distance(
191182 normalize: Normalize distances and convert to similarity scores.
192183 name: Name of the scorer.
193184 """
194- rapidfuzz_import_error_msg = (
195- "RapidFuzz dependency is not installed. Please install it with: pip install rapidfuzz"
196- )
185+ rapidfuzz_import_error_msg = "RapidFuzz dependency is not installed. Please install it with: pip install rapidfuzz or dreadnode[text]"
197186
198187 try :
188+ from rapidfuzz import distance # type: ignore[import-not-found]
189+
199190 distance .Levenshtein .distance ("test" , "test" )
200191 except ImportError :
201192 warn_at_user_stacklevel (rapidfuzz_import_error_msg , UserWarning )
@@ -260,12 +251,15 @@ def similarity_with_tf_idf(reference: str, *, name: str = "similarity") -> "Scor
260251 reference: The reference text (e.g., expected output).
261252 name: Name of the scorer.
262253 """
263- sklearn_import_error_msg = (
264- "scikit-learn dependency is not installed. Please install it with: pip install scikit-learn"
265- )
254+ sklearn_import_error_msg = "scikit-learn dependency is not installed. Please install it with: pip install scikit-learn or dreadnode[text]"
266255
267256 try :
268- TfidfVectorizer ()
257+ from sklearn .feature_extraction .text import ( # type: ignore[import-not-found]
258+ TfidfVectorizer ,
259+ )
260+ from sklearn .metrics .pairwise import ( # type: ignore[import-not-found]
261+ cosine_similarity as sklearn_cosine_similarity ,
262+ )
269263 except ImportError :
270264 warn_at_user_stacklevel (sklearn_import_error_msg , UserWarning )
271265
@@ -275,6 +269,7 @@ def disabled_evaluate(_: t.Any) -> Metric:
275269 return Scorer (disabled_evaluate , name = name )
276270
277271 vectorizer = TfidfVectorizer (stop_words = "english" )
272+ a = 1
278273
279274 def evaluate (data : t .Any , * , reference : str = reference ) -> Metric :
280275 candidate_text = str (data )
@@ -309,10 +304,13 @@ def similarity_with_sentence_transformers(
309304 model_name: The name of the sentence-transformer model to use.
310305 name: Name of the scorer.
311306 """
312- sentence_transformers_error_msg = "Sentence transformers dependency is not installed. Please install it with: pip install sentence-transformers"
307+ sentence_transformers_error_msg = "Sentence transformers dependency is not installed. Please install it with: pip install sentence-transformers or dreadnode[training] "
313308
314309 try :
315- SentenceTransformer (model_name )
310+ from sentence_transformers import ( # type: ignore[import-not-found]
311+ SentenceTransformer ,
312+ util ,
313+ )
316314 except ImportError :
317315 warn_at_user_stacklevel (sentence_transformers_error_msg , UserWarning )
318316
@@ -370,6 +368,16 @@ def similarity_with_litellm(
370368 or self-hosted models.
371369 name: Name of the scorer.
372370 """
371+ litellm_import_error_msg = "litellm dependency is not installed. Please install it with: pip install litellm or dreadnode[text]"
372+ try :
373+ import litellm
374+ except ImportError :
375+ warn_at_user_stacklevel (litellm_import_error_msg , UserWarning )
376+
377+ def disabled_evaluate (_ : t .Any ) -> Metric :
378+ return Metric (value = 0.0 , attributes = {"error" : litellm_import_error_msg })
379+
380+ return Scorer (disabled_evaluate , name = name )
373381
374382 async def evaluate (
375383 data : t .Any ,
@@ -426,11 +434,16 @@ def bleu(
426434 nltk_import_error_msg = "NLTK dependency is not installed. Install with: pip install nltk && python -m nltk.downloader punkt"
427435
428436 try :
429- # Check for the 'punkt' tokenizer data
437+ import nltk # type: ignore[import-not-found]
438+ from nltk .tokenize import ( # type: ignore[import-not-found]
439+ word_tokenize ,
440+ )
441+ from nltk .translate .bleu_score import ( # type: ignore[import-not-found]
442+ sentence_bleu ,
443+ )
444+
430445 try :
431446 nltk .data .find ("tokenizers/punkt" )
432- word_tokenize ("test" )
433- sentence_bleu ([["test" ]], ["test" ])
434447 except LookupError as e :
435448 nltk_import_error_msg = (
436449 "NLTK 'punkt' tokenizer not found. Please run: python -m nltk.downloader punkt"
0 commit comments