📜  自然语言处理 |在 Redis 中存储频率分布

📅  最后修改于: 2022-05-13 01:55:32.044000             🧑  作者: Mango

自然语言处理 |在 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 rediseasy_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 中删除整个哈希映射