6 个版本
0.1.5 | 2022年12月23日 |
---|---|
0.1.4 | 2022年12月20日 |
0.1.2 | 2022年11月11日 |
0.1.1 | 2022年8月25日 |
#1266 in 数据结构
260KB
381 行
markov-generator
一个高度可定制的 Rust 库,用于构建 马尔可夫链 并从它们中生成数据序列。
Chain
实现了 Serde 的 Serialize
和 Deserialize
特性,因此您可以使用链多次,而无需每次都重新生成它(这可能是一个漫长的过程)。
示例
use markov_generator::{AddEdges, Chain};
const DEPTH: usize = 6;
// Maps each sequence of 6 items to a list of possible next items.
let mut chain = Chain::new(DEPTH);
// In this case, corpus.txt contains one paragraph per line.
let file = File::open("examples/corpus.txt").unwrap();
let mut reader = BufReader::new(file);
let mut line = String::new();
let mut prev_line = String::new();
while let Ok(1..) = reader.read_line(&mut line) {
// `Both` means that the generated random output could start with the
// beginning of `line`, and that the generated output could end after
// the end of `line`.
chain.add_all(line.chars(), AddEdges::Both);
// Starting index of last `DEPTH` chars in `prev_line`.
let prev_tail =
prev_line.char_indices().nth_back(DEPTH - 1).map_or(0, |(i, _)| i);
// This makes sure there's a chance that the end of the previous line
// could be followed by the start of the current line when generating
// random output.
chain.add_all(
prev_line[prev_tail..].chars().chain(line.chars().take(DEPTH)),
AddEdges::Neither,
);
std::mem::swap(&mut line, &mut prev_line);
line.clear();
}
// Generate and print random Markov data.
let output: String = chain
.generate()
.flat_map(|c| iter::repeat(c).take(1 + (*c == '\n') as usize))
.collect();
print!("{}", &output[..output.len() - 1]);
crate 功能
std
(默认:启用):使用std
。如果禁用,此 crate 将标记为no_std
。hash
(默认:启用):内部使用哈希表。如果禁用,则将使用 B 树。此功能需要std
。serde
(默认:启用):为Chain
实现 Serde 的Serialize
和Deserialize
特性。
依赖项
~0.6–1.4MB
~30K SLoC