私はこのマルコフを完全には理解していません...接頭辞と接尾辞の2つの単語がそれらのリストを保存し、ランダムな単語を作成しますか?
/* 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);
}
}
ウィキペディアによると、マルコフ連鎖は、次の状態が前の状態に依存するランダムなプロセスです。これは少し理解しにくいので、もっとよく説明しようと思います。
あなたが見ているのは、テキストベースのマルコフ連鎖を生成するプログラムのようです。基本的に、そのためのアルゴリズムは次のとおりです。
たとえば、このソリューションの最初の文を見ると、次の度数分布表を思い付くことができます。
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%)
基本的に、ある状態から別の状態への状態遷移は確率に基づいています。テキストベースのマルコフ連鎖の場合、遷移確率は、選択した単語に続く単語の頻度に基づいています。したがって、選択された単語は前の状態を表し、度数分布表または単語は(可能な)連続した状態を表します。前の状態がわかっている場合は連続状態が見つかります(これが正しい度数分布表を取得する唯一の方法です)。したがって、これは、連続状態が前の状態に依存しているという定義に適合します。
Shameless Plug-少し前に、Perlでこれを実行するプログラムを作成しました。あなたはそれについて読むことができます ここ 。
マルコフ連鎖は、状態遷移が確率であるステートマシンです。
単語:チキン;可能な次の単語:10%-は; 30%-だった; 50%-脚; 10%-実行;
次に、ランダムに、またはルーレットホイールを選択して次の単語を選択するだけです。これらの確率は、いくつかの入力テキストから取得します。