use dedup::{Config, StatefulDedupTransform};
use tenshift_core::sample::{Sample, Tensor};
use tenshift_core::transform::StatefulTransform;
fn main() {
println!("Streaming Deduplication Example");
println!("================================\n");
let config = Config::default()
.with_similarity_threshold(0.9)
.with_signature_size(128)
.with_num_bands(16)
.with_shingle_size(5);
let mut transform = StatefulDedupTransform::new(config)
.expect("Failed to create transform")
.with_text_field("content");
let incoming_docs = vec![
("doc_001", "Introduction to Machine Learning"),
("doc_002", "Introduction to Machine Learning"), ("doc_003", "Advanced Topics in Deep Learning"),
("doc_004", "Introduction to Machine Learning"), ("doc_005", "Rust Programming Best Practices"),
("doc_006", "Rust Best Practices for Production"), ("doc_007", "Data Pipeline Architecture Patterns"),
];
let num_input = incoming_docs.len();
println!("Processing {} documents...\n", num_input);
for (id, content) in &incoming_docs {
let sample = Sample::new()
.with("content", Tensor::bytes(content.as_bytes().to_vec()))
.with("doc_id", Tensor::bytes(id.as_bytes().to_vec()))
.with_metadata("source", 0);
let output = transform.push(sample);
if !output.is_empty() {
println!("Immediate output: {} samples", output.len());
}
}
let clusters = transform.clusters().to_vec();
let stats = transform.stats();
let deduplicated = transform.finish();
println!("Deduplication Results");
println!("=====================");
println!("Input documents: {}", num_input);
println!("Output documents: {}", deduplicated.len());
println!("Duplicates removed: {}", num_input - deduplicated.len());
println!();
println!("Duplicate Clusters:");
for cluster in &clusters {
println!(" Cluster {}: {:?}", cluster.id, cluster.indices);
}
println!();
println!("Remaining unique documents:");
for sample in &deduplicated {
if let Some(tensor) = sample.get("doc_id") {
let doc_id = String::from_utf8_lossy(tensor.as_bytes());
println!(" - {}", doc_id);
}
}
println!();
println!("Performance Statistics:");
println!(" Documents processed: {}", stats.doc_count);
println!(" Duplicate clusters: {}", stats.cluster_count);
println!(" Estimated recall: {:.1}%", stats.estimated_recall() * 100.0);
}