#graph #markov #probability #cli-applications #generation #procedural #generate

bin+lib markovgen

一个用于从文本数据集构建马尔可夫链图,并通过遍历它们高效生成文本序列的库,包括一个配套的 CLI 应用程序。

2 个不稳定版本

0.2.0 2024年5月15日
0.1.0 2024年5月15日

#505 in 数学

MIT 许可证

32KB
519 代码行

markovgen

一个用于从文本数据集构建马尔可夫链图并高效生成文本序列的库。

功能

  • 简单的图构建和遍历 API
  • 可配置的最小序列长度
  • 一个示例 CLI 应用程序(markovcli),支持从数据集构建图并将其写入磁盘,以及使用可定制的序列长度对图进行采样。
    • 默认设置下,我的机器从 first_names 基准数据集(见 benches/)以每秒生成超过 2.5 百万个名称(并且将 cli_no_print 特性设置为避免 I/O 过载)
    • 使用以下命令尝试:cargo run -r -F serde --bin markovcli

示例

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