///|
fn parse_rounds(value : String) -> Int {
if value.is_empty() {
10
} else {
let mut result = 0
for c in value {
if c >= '0' && c <= '9' {
result = result * 10 + c.to_int() - '0'.to_int()
}
}
if result <= 0 {
1
} else {
result
}
}
}
///|
fn print_help() -> Unit {
println("moonbit-deid - deterministic clinical PHI redaction")
println("")
println("Usage: moon run cmd/main -- [options] [text]")
println("")
println("Options:")
println(" --audit print the audit report")
println(" --mode=preserve preserve replacement length")
println(" --mode=partial keep edge characters")
println(" --mode=hash use deterministic stable hashes")
println(" --benchmark[=N] run N benchmark rounds")
println(" --help show this help")
}
///|
fn run_benchmark(rounds : Int) -> Unit {
try {
let started = @env.now()
let results = @deid.run_all_benchmarks(
rounds,
@deid.RedactionConfig::default(),
)
let elapsed = @env.now() - started
let mut documents = 0
let mut characters = 0
let mut findings = 0
for item in results {
documents += item.documents * item.repetitions
characters += item.input_characters
findings += item.findings
}
println("benchmark.cases=" + results.length().to_string())
println("benchmark.documents=" + documents.to_string())
println("benchmark.input_characters=" + characters.to_string())
println("benchmark.findings=" + findings.to_string())
println("benchmark.elapsed_ms=" + elapsed.to_string())
let divisor : UInt64 = if elapsed == 0 { 1 } else { elapsed }
println(
"benchmark.characters_per_ms=" +
(characters.to_uint64() / divisor).to_string(),
)
} catch {
err => println("benchmark.error=" + err.to_string())
}
}
///|
fn main raise {
let args = @env.args()
if args.any(fn(arg : String) { arg == "--help" || arg == "-h" }) {
print_help()
return
}
let mut show_audit = false
let mut benchmark : String? = None
let mut options = @deid.token_options()
let text_parts = []
for i in 1.. {
run_benchmark(parse_rounds(value))
return
}
None => ()
}
let sample = if text_parts.is_empty() {
"姓名:张三,电话13800138000,身份证110101199003071234。"
} else {
text_parts.join(" ")
}
let result = @deid.redact(sample, options~)
println(result.text)
if show_audit {
println(@deid.audit_markdown(result.audit))
}
}