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

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

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

nltk.probability.ConditionalFreqDist类是 FreqDist 实例的容器,每个条件有一个 FreqDist。它用于计算依赖于另一个条件的频率,例如另一个词或类标签。它在这里被用来使用RedisHashFreqDist在 Redis 之上创建一个 API 兼容的类。
在下面给出的代码中,一个RedisConditionalHashFreqDist类扩展了nltk.probability.ConditionalFreqDist并覆盖了__getitem__()方法。重写__getitem__()以创建 RedisHashFreqDist 的实例而不是 FreqDist。

代码 :

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()

可以通过传入 Redis 连接和基本名称来创建此类的实例。之后,它就像 ConditionalFreqDist 一样工作,如下面的代码所示:
代码 :

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()


输出 :

0
[]
1
1
['cond1']

这个怎么运作 ?

  • RedisConditionalHashFreqDist使用名称前缀来引用 RedisHashFreqDist 实例。
  • 传递给 RedisConditionalHashFreqDist 的名称是一个基本名称,它与每个条件相结合,为每个RedisHashFreqDist创建一个唯一名称。
  • 例如,如果 RedisConditionalHashFreqDist 的基本名称是'condhash' ,并且条件是 'cond1',那么 RedisHashFreqDist 的最终名称是'condhash:cond1'
  • 此命名模式在初始化时使用 keys 命令查找所有现有的哈希映射。
  • 通过搜索与“condhash:*”匹配的所有键,用户可以识别所有现有条件并为每个条件创建一个 RedisHashFreqDist 实例。
  • 将字符串与冒号组合是 Redis 键的常见命名约定,作为定义命名空间的一种方式。
  • 每个 RedisConditionalHashFreqDist 实例定义一个哈希映射的命名空间。

RedisConditionalHashFreqDist 还定义了一个clear()方法。这是一个在所有内部 RedisHashFreqDist 实例上调用 clear() 的辅助方法。 clear() 方法未在ConditionalFreqDist中定义。