引言:
我们现在准备做的就是给定一个由不同的单词组成的句子,由这个句子产生一些随机的可以读的英语文本。
马尔可夫链可以比较好的完成这个任务!
描述:
该算法把每个短语分割为两个部分:一部分是由多个词构成的前缀,另一部分是只包含一个词的后缀。马尔可夫链算法能够
生成输出短语的序列,其方法是依据 原文本的统计性质,随机性地选择跟在前缀后面的特定后缀。采用三个词的短语就能够工作
得很好——利用连续两个词构成的前缀来选择作为后缀的一个词:
设置w1和w2为文本的前两个词
输出w1和w2
循环:
随机地选出w3,它是文本中w1w2的后缀中的一个
打印w3
把w1和w2分别换成w2和w3
重复循环
马尔可夫的数据结构简单一点说就是:以NPREF个单词做为前缀,前缀可以用一个大小为NPREF的一维数组表示(键),
后缀可以用一个链表或者一个动态数组表示(值),看起来就像是一个映射,
用C++的语法表示可以是:
map<vector<string> key[NPREF],vector<string> value>
图示:
如果用纯C来设计数据结构的话,看起来像是这样:
数据结构部分代码:
typedef struct State State;
typedef struct Suffix Suffix;
struct State
{
char *pref[NPREF];
Suffix *suf;
State *next;
};
struct Suffix
{
char *word;
Suffix *next;
};
State *statetab[NHASH];
那么生成前缀后缀的算法应该