Open In App

NLP | Storing an ordered dictionary in Redis

An ordered dictionary is like a normal dict, but the keys are ordered by an ordering function. In the case of Redis, it supports ordered dictionaries whose keys are strings and whose values are floating point scores. This structure can come in handy in cases where information gain has to be calculated and all the words and scores have to be stored for later use.
The RedisOrderedDict class in rediscollections.py extends collections. MutableMapping to get a number of dict compatible methods for free. Then, it implements all the key methods that require Redis ordered set (also known as Zset) commands:
Code: Storing a frequency distribution in Redis.




class RedisOrderedDict(collections.MutableMapping):
      
    def __init__(self, r, name):
        self._r = r
        self._name = encode_key(name)
          
    def __iter__(self):
        return iter(self.items())
      
    def __len__(self):
        return self._r.zcard(self._name)
      
    def __getitem__(self, key):
        return self._r.zscore(self._name, encode_key(key))
     
    def __setitem__(self, key, score):
        self._r.zadd(self._name, encode_key(key), score)
      
    def __delitem__(self, key):
        self._r.zrem(self._name, encode_key(key))
     
    def keys(self, start = 0, end =-1):
        # we use zrevrange to get keys sorted
        # by high value instead of by
        lowest
        return self._r.zrevrange(self._name, start, end)
      
    def values(self, start = 0, end =-1):
        return [v for (k, v) in self.items(start = start, end = end)]
      
    def items(self, start = 0, end =-1):
        return self._r.zrevrange(self._name, start, end, withscores = True)
      
    def get(self, key, default = 0):
        return self[key] or default
      
    def iteritems(self):
        return iter(self)
      
    def clear(self):
        self._r.delete(self._name)

Code : Creating an instance of RedisOrderedDict by passing in a Redis connection and a unique name




from redis import Redis
from rediscollections import RedisOrderedDict
  
r = Redis()
rod = RedisOrderedDict(r, 'test')
rod.get('bar')
  
rod['bar'] = 5.2
print (rod['bar'])
  
print (len(rod))
  
print (rod.items()) 
  
rod.clear()

Output:

0
5.2000000000000002
1
[(b'bar', 5.2)]

Much of the code may look similar to the RedisHashMap, which is to be expected since they both extend collections.MutableMapping. The main difference here is that RedisOrderedSet orders keys by floating point values, and so it is not suited for arbitrary key-value storage like the RedisHashMap.
Outline explaining each key method and how they work with Redis:


Article Tags :