2 个不稳定版本
0.2.0 | 2024年5月15日 |
---|---|
0.1.0 | 2024年5月15日 |
#505 in 数学
32KB
519 代码行
markovgen
一个用于从文本数据集构建马尔可夫链图并高效生成文本序列的库。
功能
- 简单的图构建和遍历 API
- 可配置的最小序列长度
- 一个示例 CLI 应用程序(markovcli),支持从数据集构建图并将其写入磁盘,以及使用可定制的序列长度对图进行采样。
- 默认设置下,我的机器从 first_names 基准数据集(见
benches/
)以每秒生成超过 2.5 百万个名称(并且将 cli_no_print 特性设置为避免 I/O 过载) - 使用以下命令尝试:
cargo run -r -F serde --bin markovcli
- 默认设置下,我的机器从 first_names 基准数据集(见
示例
src/bin/example.rs
:
use std::sync::Arc;
use markovgen::*;
const NAME_DATASET: &str = "Tim\nTom\nThomas\nNathan\nNina\nTiara\nTyra\nTyrone";
const SEQUENCE_START: char = '\x01';
const SEQUENCE_END: char = '\x02';
fn main() {
let mut constructor = GraphConstructor::new();
NAME_DATASET.lines().for_each(|l| {
l.chars().fold(SEQUENCE_START, |acc, x| {
constructor.register_sequence(acc, x);
x
});
constructor.register_sequence(l.chars().last().unwrap(), SEQUENCE_END);
});
let graph = Arc::new(constructor.construct());
let mut stepper = GraphStepper::new(
graph,
GraphStepperConfiguration {
start_char: Some(SEQUENCE_START),
min_length: Some(3),
},
)
.unwrap();
// Step until reaching a "dead end" vertex, with a timeout of 16 steps.
println!("{}", stepper.step_until_end_state(16).unwrap());
}
运行此命令应生成类似的内容
$ cargo run --bin example
Ninathom
1.0 版本计划
- 这是我早期的第一个 Rust 项目之一,我只是稍微清理了一下。在 1.0.0 版本发布之前,我可能会更改 API 使其更易于使用。
- 正确的多线程支持(我认为只需克隆 GraphSteppers 并在不同的任务中使用它们就已经足够了,但我还没有实际尝试过)
- 泛型实现,允许使用 String 和 char 顶点(目前仅支持 chars,因为这与我最初用于生成名称的使用案例相符)
依赖关系
~2–2.8MB
~54K SLoC