自然语言处理 |在 Redis 中存储频率分布
nltk.probability.FreqDist类在整个 NLTK 中的许多类中用于存储和管理频率分布。它非常有用,但它都在内存中,并且不提供持久化数据的方法。多个进程也无法访问单个 FreqDist。所有这一切都可以通过在 Redis 之上构建 FreqDist 来改变。
什么是 Redis?
- Redis 是一种数据结构服务器,是比较流行的NoSQL 数据库之一。
- 除此之外,它还提供了一个可通过网络访问的数据库,用于存储字典(也称为哈希图)。
- 为 Redis 哈希映射构建 FreqDist 接口将允许我们创建一个持久的 FreqDist,多个本地和远程进程可以同时访问它。
安装 :
- 安装 Redis 和 redis-py。 Redis 网站位于 http://redis.io/ 并包含许多文档资源。
- 要使用哈希映射,请安装最新版本,在撰写本文时为 2.8.9。
- Redis Python驱动程序 redis-py 可以使用pip install redis或easy_install redis安装。此时的最新版本是2.9.1 。
- redis-py 主页位于 http://github.com/andymccurdy/redis-py/。
- 一旦两者都安装完毕并且一个 redis-server 进程正在运行,你就可以开始了。假设 redis-server 在 localhost 的 6379 端口(默认主机和端口)上运行。
这个怎么运作?
- FreqDist 类扩展了标准库collections.Counter类,它使 FreqDist 成为一个带有一些额外方法的小型包装器,例如 N()。
- N() 方法返回样本结果的数量,它是所有值的总和
频率分布。 - 通过扩展RedisHashMap然后实现 N() 方法,在 Redis 之上创建了一个 API 兼容的类。
- RedisHashFreqDist(在 redisprob.py 中定义)对 N() 方法的哈希映射中的所有值求和
代码:解释工作
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)]
这个类可以像 FreqDist 一样使用。要实例化它,请传递一个 Redis 连接和我们的哈希映射的名称。该名称应该是对该特定 FreqDist 的唯一引用,这样它就不会与 Redis 中的任何其他键发生冲突。
代码:
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))
输出 :
0
1
1
大部分工作都在RedisHashMap类中完成,该类扩展了collections.MutableMapping ,然后覆盖了所有需要 Redis 特定命令的方法。使用特定 Redis 命令的每种方法的概述:
- __len__() :这使用 hlen 命令获取哈希图中的元素数量
- __contains__():这使用 hexists 命令来检查一个元素是否存在于哈希图中
- __getitem__():这使用 hget 命令从哈希映射中获取值
- __setitem__():这使用 hset 命令在哈希图中设置一个值
- __delitem__():这使用hdel命令从哈希映射中删除一个值
- keys():这使用 hkeys 命令来获取哈希映射中的所有键
- values():这使用 hvals 命令来获取哈希图中的所有值
- items():这使用 hgetall 命令获取包含哈希映射中所有键和值的字典
- clear():这使用 delete 命令从 Redis 中删除整个哈希映射