La clase nltk.probability.FreqDist se usa en muchas clases en NLTK para almacenar y administrar distribuciones de frecuencia. Es bastante útil, pero todo está en la memoria y no proporciona una forma de conservar los datos. Un solo FreqDist tampoco es accesible para múltiples procesos. Todo eso se puede cambiar construyendo un FreqDist sobre Redis.
¿Qué es Redis?
- Redis es un servidor de estructura de datos que es una de las bases de datos NoSQL más populares .
- Entre otras cosas, proporciona una base de datos accesible en red para almacenar diccionarios (también conocidos como mapas hash).
- La creación de una interfaz FreqDist para un mapa hash de Redis nos permitirá crear un FreqDist persistente al que puedan acceder varios procesos locales y remotos al mismo tiempo.
Instalación :
- Instale Redis y redis-py. El sitio web de Redis está en http://redis.io/ e incluye muchos recursos de documentación.
- Para usar mapas hash, instale la última versión, que en el momento de escribir este artículo es la 2.8.9.
- El controlador Redis Python, redis-py, se puede instalar mediante pip install redis o easy_install redis . La última versión en este momento es 2.9.1 .
- La página de inicio de redis-py está en http://github.com/andymccurdy/redis-py/ .
- Una vez que ambos estén instalados y se esté ejecutando un proceso de redis-server, estará listo para comenzar. Supongamos que redis-server se ejecuta en localhost en el puerto 6379 (el host y el puerto predeterminados).
¿Cómo funciona?
- La clase FreqDist amplía la clase de biblioteca estándar collections.Counter , lo que convierte a FreqDist en un pequeño envoltorio con algunos métodos adicionales, como N().
- El método N() devuelve el número de resultados de muestra, que es la suma de todos los valores en
la distribución de frecuencia. - Se crea una clase compatible con API sobre Redis extendiendo un RedisHashMap y luego implementando el método N().
- El RedisHashFreqDist (definido en redisprob.py) suma todos los valores en el mapa hash para el método N()
Código: Explicando el funcionamiento
from rediscollections import RedisHashMap class RedisHashFreqDist(RedisHashMap): def N(self): return int(sum(self.values())) def __missing__(self, key): return 0 def __getitem__(self, key): return int(RedisHashMap.__getitem__(self, key) or 0) def values(self): return [int(v) for v in RedisHashMap.values(self)] def items(self): return [(k, int(v)) for (k, v) in RedisHashMap.items(self)]
Esta clase se puede usar como FreqDist. Para instanciarlo, pase una conexión Redis y el nombre de nuestro mapa hash. El nombre debe ser una referencia única a este FreqDist en particular para que no entre en conflicto con ninguna otra clave en Redis.
Código:
from redis import Redis from redisprob import RedisHashFreqDist r = Redis() rhfd = RedisHashFreqDist(r, 'test') print (len(rhfd)) rhfd['foo'] += 1 print (rhfd['foo']) rhfd.items() print (len(rhfd))
Producción :
0 1 1
La mayor parte del trabajo se realiza en la clase RedisHashMap , que amplía collections.MutableMapping y luego anula todos los métodos que requieren comandos específicos de Redis. Resumen de cada método que utiliza un comando específico de Redis:
- __len__() : Esto usa el comando hlen para obtener el número de elementos en el mapa hash
- __contains__(): Esto usa el comando hexists para verificar si existe un elemento en el mapa hash
- __getitem__(): Esto usa el comando hget para obtener un valor del mapa hash
- __setitem__(): Esto usa el comando hset para establecer un valor en el mapa hash
- __delitem__(): Esto usa el comando hdel para eliminar un valor del mapa hash
- keys(): Esto usa el comando hkeys para obtener todas las claves en el mapa hash
- valores(): esto usa el comando hvals para obtener todos los valores en el mapa hash
- items(): Esto usa el comando hgetall para obtener un diccionario que contiene todas las claves y valores en el mapa hash
- clear(): esto usa el comando de eliminación para eliminar todo el mapa hash de Redis
Publicación traducida automáticamente
Artículo escrito por mathemagic y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA