Генератор Луи Маркова для столов - PullRequest
0 голосов
/ 14 декабря 2018

Чего я хочу добиться, так это вернуть цепочку Маркова с переменным порядком в виде таблицы из таблицы с числами.Таблица цепей Маркова должна иметь ту же длину, что и входная таблица.

Ниже приведен мой код (его изменение из этого кода: https://gist.github.com/weakish/f722e3035d441c0c1f032664b7b52127).«N» - это порядок марков, «MAXGEN» - длина цепочки марков и «строка» входной строки.Он выводит цепочку markov в виде списка, но пока только при достижении MAXGEN.Кто-нибудь знает, как выбрать новое случайное значение, если "nextword == NOWORD", чтобы длина MAXGEN достигалась при каждом создании цепочки markov?

math.randomseed(os.time()- os.clock() * 1000);
local N = 2;
local MAXGEN = 8;
;
local function allwords();
local line = "1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1";
local pos = 1;
return function();
while line do;
local s, e = string.find(line, "%w+", pos);
if s then;
pos = e + 1;
return string.sub(line, s, e);
end;
return nil;
end;
end;
end;
;
local function prefix(words);
local prefix_sequence = '';
for _, w in pairs(words) do;
prefix_sequence = prefix_sequence .. w .. " ";
end;
return prefix_sequence;
end;
;
local statetab = {};
;
local function insert(index, value);
local list = statetab[index];
if list == nil then;
statetab[index] = {value};
else;
list[#list+1] = value;
end;
end;
;
local NOWORD = "n";
;
-- build table;
local function init_words ();
local prefix_words = {};
local i = 1;
while i <= N do;
prefix_words[i] = NOWORD;
i = i + 1;
end;
return prefix_words;
end;
;
local prefix_words = init_words();
;
for w in allwords() do;
insert(prefix(prefix_words), w);
table.remove(prefix_words, 1);
table.insert(prefix_words, w);
end;
insert(prefix(prefix_words), NOWORD);
;
prefix_words = init_words();
;
;
-- generate text;
;
rl = {};
for i = 1, MAXGEN + N do;
local list = statetab[prefix(prefix_words)];
;
-- choose random item from list;
local r = math.random(#list);
local nextword = list[r];
if nextword == NOWORD then return end;
table.insert(rl, nextword);
table.remove(prefix_words, 1);
table.insert(prefix_words, nextword);
end;
for i = 1, #rl do;
rl[i] = tonumber(rl[(i)+N]);    
end;
print (table.unpack(rl));

Я также нашел этот пример на python, который выглядит оченьэлегантный, и может быть лучшим решением, если мне удастся перенести его на lua: https://eli.thegreenplace.net/2018/elegant-python-code-for-a-markov-chain-text-generator/

...