PNL | Almacenamiento de distribución de frecuencia condicional en Redis

La clase nltk.probability.ConditionalFreqDist es un contenedor para instancias de FreqDist, con una FreqDist por condición. Se utiliza para contar frecuencias que dependen de otra condición, como otra palabra o una etiqueta de clase. Se está utilizando aquí para crear una clase compatible con API además de Redis mediante RedisHashFreqDist .
En el código que se proporciona a continuación, una clase RedisConditionalHashFreqDist que amplía nltk.probability.ConditionalFreqDist y anula el método __getitem__() . Anule __getitem__() para crear una instancia de RedisHashFreqDist en lugar de FreqDist.

Código:

from nltk.probability import ConditionalFreqDist
from rediscollections import encode_key
  
class RedisConditionalHashFreqDist(ConditionalFreqDist):
    def __init__(self, r, name, cond_samples = None):
        self._r = r
        self._name = name
        ConditionalFreqDist.__init__(self, cond_samples)
          
        for key in self._r.keys(encode_key('% s:*' % name)):
            condition = key.split(':')[1]
            # calls self.__getitem__(condition)
            self[condition] 
              
    def __getitem__(self, condition):
        if condition not in self._fdists:
            key = '% s:% s' % (self._name, condition)
            val = RedisHashFreqDist(self._r, key)
            super(RedisConditionalHashFreqDist, self).__setitem__(
                    condition, val)
        return super(
                RedisConditionalHashFreqDist, self).__getitem__(condition)
    def clear(self):
        for fdist in self.values():
            fdist.clear()

Se puede crear una instancia de esta clase pasando una conexión Redis y un nombre base. Después de eso, funciona como ConditionalFreqDist como se muestra en el siguiente código:
Código:

from redis import Redis
from redisprob import RedisConditionalHashFreqDist
  
r = Redis()
rchfd = RedisConditionalHashFreqDist(r, 'condhash')
  
print (rchfd.N())
  
print (rchfd.conditions())
  
rchfd['cond1']['foo'] += 1
  
print (rchfd.N())
  
print (rchfd['cond1']['foo'])
  
print (rchfd.conditions())
  
rchfd.clear()


Producción :

0
[]
1
1
['cond1']

Cómo funciona ?

  • RedisConditionalHashFreqDist usa prefijos de nombre para hacer referencia a las instancias de RedisHashFreqDist.
  • El nombre pasado a RedisConditionalHashFreqDist es un nombre base que se combina con cada condición para crear un nombre único para cada RedisHashFreqDist .
  • Por ejemplo, si el nombre base de RedisConditionalHashFreqDist es ‘condhash’ y la condición es ‘cond1’, entonces el nombre final de RedisHashFreqDist es ‘condhash:cond1’ .
  • Este patrón de nomenclatura se usa en la inicialización para encontrar todos los mapas hash existentes usando el comando de teclas.
  • Al buscar todas las claves que coincidan con ‘condhash:*’, el usuario puede identificar todas las condiciones existentes y crear una instancia de RedisHashFreqDist para cada una.
  • La combinación de strings con dos puntos es una convención de nomenclatura común para las claves de Redis como una forma de definir espacios de nombres.
  • Cada instancia de RedisConditionalHashFreqDist define un solo espacio de nombres de mapas hash.

RedisConditionalHashFreqDist también define un método clear() . Este es un método auxiliar que llama a clear() en todas las instancias internas de RedisHashFreqDist. El método clear() no está definido en ConditionalFreqDist .

Publicación traducida automáticamente

Artículo escrito por mathemagic y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *