首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用外行术语解释马尔可夫链算法

用外行术语解释马尔可夫链算法
EN

Stack Overflow用户
提问于 2010-11-03 04:05:53
回答 2查看 17K关注 0票数 24

我不太理解这个马尔可夫...它需要两个单词作为前缀和后缀,保存它们的列表并生成随机单词?

代码语言:javascript
复制
    /* Copyright (C) 1999 Lucent Technologies */
/* Excerpted from 'The Practice of Programming' */
/* by Brian W. Kernighan and Rob Pike */

#include <time.h>
#include <iostream>
#include <string>
#include <deque>
#include <map>
#include <vector>

using namespace std;

const int  NPREF = 2;
const char NONWORD[] = "\n";    // cannot appear as real line: we remove newlines
const int  MAXGEN = 10000; // maximum words generated

typedef deque<string> Prefix;

map<Prefix, vector<string> > statetab; // prefix -> suffixes

void        build(Prefix&, istream&);
void        generate(int nwords);
void        add(Prefix&, const string&);

// markov main: markov-chain random text generation
int main(void)
{
    int nwords = MAXGEN;
    Prefix prefix;  // current input prefix

    srand(time(NULL));
    for (int i = 0; i < NPREF; i++)
        add(prefix, NONWORD);
    build(prefix, cin);
    add(prefix, NONWORD);
    generate(nwords);
    return 0;
}

// build: read input words, build state table
void build(Prefix& prefix, istream& in)
{
    string buf;

    while (in >> buf)
        add(prefix, buf);
}

// add: add word to suffix deque, update prefix
void add(Prefix& prefix, const string& s)
{
    if (prefix.size() == NPREF) {
        statetab[prefix].push_back(s);
        prefix.pop_front();
    }
    prefix.push_back(s);
}

// generate: produce output, one word per line
void generate(int nwords)
{
    Prefix prefix;
    int i;

    for (i = 0; i < NPREF; i++)
        add(prefix, NONWORD);
    for (i = 0; i < nwords; i++) {
        vector<string>& suf = statetab[prefix];
        const string& w = suf[rand() % suf.size()];
        if (w == NONWORD)
            break;
        cout << w << "\n";
        prefix.pop_front(); // advance
        prefix.push_back(w);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-03 04:45:51

根据维基百科的说法,马尔可夫链是一个随机过程,其中下一个状态依赖于前一个状态。这有点难以理解,所以我将尝试更好地解释它:

您看到的似乎是一个生成基于文本的马尔可夫链的程序。本质上,其算法如下:

  1. 将文本拆分成标记(words,punctuation).
  2. Build a频率表。这是一种数据结构,对于文本体中的每个单词,您都有一个条目(键)。这个键被映射到另一个数据结构,该结构基本上是这个词(键)后面的所有单词的列表,以及它的frequency.
  3. Generate马尔可夫链。为此,您选择一个起始点(频率表中的一个关键字),然后随机选择另一个状态(下一个单词)。你选择的下一个单词取决于它的频率(所以一些单词比其他单词更有可能)。在此之后,您使用这个新词作为关键字,然后重新开始。

例如,如果您查看此解决方案的第一句话,您可以得出以下频率表:

代码语言:javascript
复制
According: to(100%)
to:        Wikipedia(100%)
Wikipedia: ,(100%)
a:         Markov(50%), random(50%)
Markov:    Chain(100%)
Chain:     is(100%)
is:        a(33%), dependent(33%), ...(33%)
random:    process(100%)
process:   with(100%)
.
.
.
better:    :(100%)

从本质上讲,从一个状态到另一个状态的状态转换是基于概率的。在基于文本的马尔可夫链的情况下,转移概率基于所选单词后面的单词的频率。因此,所选单词表示先前的状态,而频率表或单词表示(可能的)连续状态。如果知道前一个状态,就可以找到连续状态(这是获得正确频率表的唯一方法),因此这符合连续状态依赖于前一个状态的定义。

Perl --不久前,我用写了一个程序来做这件事。你可以在here上读到它。

票数 52
EN

Stack Overflow用户

发布于 2013-08-01 11:39:23

马尔可夫链是以状态转移为概率的状态机。

单词:鸡;可能的下一个单词: 10% -是;30% -曾经;50% -腿;10% -跑;

然后,您只需随机选择下一个单词,或通过轮盘赌选择。您可以从一些输入文本中获得这些概率。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4081662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档