1#![cfg_attr(
5 all(feature = "std", feature = "train"),
6 doc = "
7## Examples
8
9```rust
10# fn main() -> Result<(), Box<dyn std::error::Error>> {
11use std::num::NonZeroU32;
12
13use lindera_crf::{Edge, FeatureProvider, FeatureSet, Lattice, Model, Trainer};
14
15// Train:
16// 京(kyo) 都(to)
17// 東(to) 京(kyo)
18// 京(kei) 浜(hin)
19// 京(kyo) の(no) 都(miyako)
20//
21// Test:
22// 水(mizu) の(no) 都(miyako)
23//
24// 1-gram features:
25// 京: 1, 都: 2, 東: 3, 浜: 4, の: 5, 水: 6
26// 2-gram features:
27// kyo: 1, to: 2, kei: 3, hin: 4, no: 5, miyako: 6, mizu: 7
28
29let mut provider = FeatureProvider::new();
30let label_京kyo = provider.add_feature_set(FeatureSet::new(
31 &[NonZeroU32::new(1).unwrap()],
32 &[NonZeroU32::new(1)],
33 &[NonZeroU32::new(1)],
34))?;
35let label_都to = provider.add_feature_set(FeatureSet::new(
36 &[NonZeroU32::new(2).unwrap()],
37 &[NonZeroU32::new(2)],
38 &[NonZeroU32::new(2)],
39))?;
40let label_東to = provider.add_feature_set(FeatureSet::new(
41 &[NonZeroU32::new(3).unwrap()],
42 &[NonZeroU32::new(2)],
43 &[NonZeroU32::new(2)],
44))?;
45let label_京kei = provider.add_feature_set(FeatureSet::new(
46 &[NonZeroU32::new(1).unwrap()],
47 &[NonZeroU32::new(3)],
48 &[NonZeroU32::new(3)],
49))?;
50let label_浜hin = provider.add_feature_set(FeatureSet::new(
51 &[NonZeroU32::new(4).unwrap()],
52 &[NonZeroU32::new(4)],
53 &[NonZeroU32::new(4)],
54))?;
55let label_のno = provider.add_feature_set(FeatureSet::new(
56 &[NonZeroU32::new(5).unwrap()],
57 &[NonZeroU32::new(5)],
58 &[NonZeroU32::new(5)],
59))?;
60let label_都miyako = provider.add_feature_set(FeatureSet::new(
61 &[NonZeroU32::new(2).unwrap()],
62 &[NonZeroU32::new(6)],
63 &[NonZeroU32::new(6)],
64))?;
65let label_水mizu = provider.add_feature_set(FeatureSet::new(
66 &[NonZeroU32::new(6).unwrap()],
67 &[NonZeroU32::new(7)],
68 &[NonZeroU32::new(7)],
69))?;
70
71let mut lattices = vec![];
72
73// 京都 (kyo to)
74let mut lattice = Lattice::new(2)?;
75lattice.add_edge(0, Edge::new(1, label_京kyo))?;
76lattice.add_edge(1, Edge::new(2, label_都to))?;
77
78lattice.add_edge(0, Edge::new(1, label_京kei))?;
79lattice.add_edge(1, Edge::new(2, label_都miyako))?;
80
81lattices.push(lattice);
82
83// 東京 (to kyo)
84let mut lattice = Lattice::new(2)?;
85lattice.add_edge(0, Edge::new(1, label_東to))?;
86lattice.add_edge(1, Edge::new(2, label_京kyo))?;
87
88lattice.add_edge(1, Edge::new(2, label_京kei))?;
89
90lattices.push(lattice);
91
92// 京浜 (kei hin)
93let mut lattice = Lattice::new(2)?;
94lattice.add_edge(0, Edge::new(1, label_京kei))?;
95lattice.add_edge(1, Edge::new(2, label_浜hin))?;
96
97lattice.add_edge(0, Edge::new(1, label_京kyo))?;
98
99lattices.push(lattice);
100
101// 京の都 (kyo no miyako)
102let mut lattice = Lattice::new(3)?;
103lattice.add_edge(0, Edge::new(1, label_京kyo))?;
104lattice.add_edge(1, Edge::new(2, label_のno))?;
105lattice.add_edge(2, Edge::new(3, label_都miyako))?;
106
107lattice.add_edge(0, Edge::new(1, label_京kei))?;
108lattice.add_edge(2, Edge::new(3, label_都to))?;
109
110lattices.push(lattice);
111
112// Generates a model
113let trainer = Trainer::new();
114let model = trainer.train(&lattices, provider);
115
116// 水の都 (mizu no miyako)
117let mut lattice = Lattice::new(3)?;
118lattice.add_edge(0, Edge::new(1, label_水mizu))?;
119lattice.add_edge(1, Edge::new(2, label_のno))?;
120lattice.add_edge(2, Edge::new(3, label_都to))?;
121lattice.add_edge(2, Edge::new(3, label_都miyako))?;
122
123let (path, _) = model.search_best_path(&lattice);
124
125assert_eq!(vec![
126 Edge::new(1, label_水mizu),
127 Edge::new(2, label_のno),
128 Edge::new(3, label_都miyako),
129], path);
130# Ok(())
131# }
132```
133"
134)]
135#![deny(missing_docs)]
136#![cfg_attr(docsrs, feature(doc_cfg))]
137#![cfg_attr(not(feature = "std"), no_std)]
138
139#[cfg(not(feature = "alloc"))]
140compile_error!("`alloc` feature is currently required to build this crate");
141
142#[macro_use]
143extern crate alloc;
144
145pub mod errors;
146mod feature;
147mod lattice;
148mod model;
149mod utils;
150
151#[cfg(feature = "train")]
152mod forward_backward;
153#[cfg(feature = "train")]
154mod math;
155#[cfg(feature = "train")]
156mod optimizers;
157#[cfg(feature = "train")]
158mod trainer;
159
160#[cfg(test)]
161mod test_utils;
162
163pub use feature::{FeatureProvider, FeatureSet};
164pub use lattice::{Edge, Lattice};
165pub use model::{MergedFeatureSet, MergedModel, Model, RawModel};
166
167#[cfg(feature = "train")]
168pub use trainer::{Regularization, Trainer};