from myspellchecker.providers import DictionaryProvider
from typing import List, Optional, Tuple
import redis
class RedisProvider(DictionaryProvider):
"""Dictionary provider backed by Redis cache."""
def __init__(self, redis_client, prefix: str = "spell:"):
self.redis = redis_client
self.prefix = prefix
def is_valid_word(self, word: str) -> bool:
return self.redis.exists(f"{self.prefix}word:{word}")
def is_valid_syllable(self, syllable: str) -> bool:
return self.redis.exists(f"{self.prefix}syl:{syllable}")
def get_word_frequency(self, word: str) -> int:
freq = self.redis.get(f"{self.prefix}freq:{word}")
return int(freq) if freq else 0
def get_bigram_probability(self, word1: str, word2: str) -> float:
prob = self.redis.get(f"{self.prefix}bigram:{word1}:{word2}")
return float(prob) if prob else 0.0
def get_trigram_probability(self, word1: str, word2: str, word3: str) -> float:
prob = self.redis.get(f"{self.prefix}trigram:{word1}:{word2}:{word3}")
return float(prob) if prob else 0.0
def get_top_continuations(self, prev_word: str, limit: int = 20) -> List[Tuple[str, float]]:
# Use Redis SCAN for prefix matching
cursor = 0
results = []
while len(results) < limit:
cursor, keys = self.redis.scan(
cursor, f"{self.prefix}word:{prefix}*", count=100
)
for key in keys:
word = key.decode().replace(f"{self.prefix}word:", "")
freq = self.get_word_frequency(word)
results.append((word, freq))
if cursor == 0:
break
return sorted(results, key=lambda x: -x[1])[:limit]
def close(self) -> None:
self.redis.close()
# Usage
redis_client = redis.Redis(host='localhost', port=6379, db=0)
provider = RedisProvider(redis_client)
checker = SpellChecker(provider=provider)