![](/img/trans.png)
[英]How can I implement a Markov chain that purges old data when it consumes too much memory?
[英]How to store a huge Markov chain on disk, while being able to query it without using too much RAM?
我将马尔可夫链表示为一个嵌套数据结构,在Python中作为dicts dicts的词典......例如,要明白我的意思,给出句子'this is purely an example, this is not serious.'
,我生成所有连续的对并记录跟随它们的令牌及其频率:
{',': {'this': {'is': 1}},
'an': {'example': {',': 1}},
'example': {',': {'this': 1}},
'is': {'not': {'serious': 1}, 'purely': {'an': 1}},
'not': {'serious': {'.': 1}},
'purely': {'an': {'example': 1}},
'this': {'is': {'not': 1, 'purely': 1}}}
然后,我可以使用重复的项目访问来查询它。 例如,我可以看到,在'this is'
, 'not'
或'purely'
,频率为1。
在这个人为的例子中,链的状态大小为2,但我生成状态为3,4,5,6。文本语料库也很庞大,结果是表示链的字典需要几十GB内存。
我正在研究将马尔可夫链存储在磁盘上的替代方法。 我考虑过Neo4J,但它似乎并不适合这个特定的用例。 这同样适用于Postgres的ltree
结构。 然后,我在关系数据库中找到了一个简单的表,如下所示(状态大小为4):
CREATE TABLE chain (
w1 varchar(20),
w2 varchar(20),
w3 varchar(20),
w4 varchar(20),
children json,
PRIMARY KEY(w1, w2, w3, w4)
);
在构建结构时会有性能权衡,但因为只有在可接受的情况下才会付费。
有没有更好的方法在磁盘上存储大马尔可夫链,这允许查询而不需要大量的RAM?
马尔可夫过程在某种意义上是一种概率状态机,它满足马尔可夫属性(你可以从任何状态启动状态机,以便过去的事件不应该影响概率)。
因此,您应该存储要查询的状态索引,以及包含可以转换到的状态及其概率的Blob或更具描述性的内容。
构建状态索引时,不应仅使用增量索引,而应使用某种类似二进制搜索的方法,这在机器学习应用程序的域中是有意义的。
例如,您可以将状态1000 1100 0100和0000表示为“is”,“not”,“purely”和“this”(为简单起见,我要省略“,”,“an”,“示例”)。 然后,状态“this is”将是0001,第一个00表示“this”,第二个01表示“is”。 在这里我假设,“这是”将包含完整状态,例如,您的数据集中不会有另一个“这是”。 如果是这种情况,我认为这将违反Markov Property或查询逻辑中的缺陷(而不是bigrams你应该查询别的东西)。
无论如何,这应该是RAM效率,并可以使您能够实现多种搜索策略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.