Rust语言检测库whatlang的使用,whatlang可快速识别文本语言并支持多种自然语言处理功能
Whatlang
专注于简单性和性能的Rust自然语言检测库。
特性
- 支持69种语言
- 100%使用Rust编写
- 轻量级、快速且简单
- 不仅能识别语言,还能识别脚本(拉丁文、西里尔文等)
- 提供可靠性信息
快速开始
示例:
use whatlang::{detect, Lang, Script};
fn main() {
let text = “Ĉu vi ne volas eklerni Esperanton? Bonvolu! Estas unu de la plej bonaj aferoj!”;
<span class="hljs-keyword">let</span> <span class="hljs-variable">info</span> = <span class="hljs-title function_ invoke__">detect</span>(text).<span class="hljs-title function_ invoke__">unwrap</span>();
<span class="hljs-built_in">assert_eq!</span>(info.<span class="hljs-title function_ invoke__">lang</span>(), Lang::Epo);
<span class="hljs-built_in">assert_eq!</span>(info.<span class="hljs-title function_ invoke__">script</span>(), Script::Latin);
<span class="hljs-built_in">assert_eq!</span>(info.<span class="hljs-title function_ invoke__">confidence</span>(), <span class="hljs-number">1.0</span>);
<span class="hljs-built_in">assert!</span>(info.<span class="hljs-title function_ invoke__">is_reliable</span>());
}
完整示例代码
// 引入whatlang库中的必要模块
use whatlang::{detect, Lang, Script};
fn main() {
// 定义要检测的文本
let text = “Ĉu vi ne volas eklerni Esperanton? Bonvolu! Estas unu de la plej bonaj aferoj!”;
// 使用detect函数检测文本语言信息
let info = detect(text).unwrap();
// 输出检测到的语言、脚本、置信度和可靠性
println!("检测到的语言: {:?}", info.lang());
println!("脚本: {:?}", info.script());
println!("置信度: {}", info.confidence());
println!("是否可靠: {}", info.is_reliable());
// 断言验证检测结果
assert_eq!(info.lang(), Lang::Epo);
assert_eq!(info.script(), Script::Latin);
assert_eq!(info.confidence(), 1.0);
assert!(info.is_reliable());
}
特性开关
特性 | 描述 |
---|---|
enum-map |
Lang 和Script 实现来自enum-map的Enum 特性 |
arbitrary |
支持Arbitrary |
serde |
为Lang 和Script 实现Serialize 和Deserialize |
dev |
启用whatlang::dev 模块,提供一些内部API。用于性能分析目的,不建议普通用户依赖此API。 |
工作原理
语言识别如何工作?
该算法基于三元组语言模型,这是n-gram的一个特例。
is_reliable
如何计算?
它基于以下因素:
- 给定文本中有多少唯一的三元组
- 第一种和第二种(未返回)检测到的语言之间的差异有多大?这个指标在代码库中称为
rate
。
因此,它可以表示为具有阈值函数的2D空间,将其分为"可靠"和"不可靠"区域。

比较与替代方案
Whatlang | CLD2 | CLD3 | |
---|---|---|---|
实现语言 | Rust | C++ | C++ |
语言 | 68 | 83 | 107 |
算法 | 三元组 | 四元组 | 神经网络 |
支持的编码 | UTF-8 | UTF-8 | ? |
HTML支持 | 否 | 是 | ? |
许可证
MIT © Sergey Potapov
1 回复
Rust语言检测库whatlang使用指南
简介
whatlang是一个高效的Rust语言检测库,能够快速识别文本的语言类型。该库支持检测80多种语言,具有高准确率和出色的性能表现,特别适合需要实时语言识别的应用场景。
主要特性
- 支持80+种语言的检测
- 检测速度快,处理效率高
- 提供语言检测置信度评分
- 支持排除特定语言进行检测
- 轻量级,无外部依赖
安装方法
在Cargo.toml中添加依赖:
[dependencies]
whatlang = "0.16"
基本使用方法
1. 简单语言检测
use whatlang::detect;
fn main() {
let text = "This is an example text in English.";
let info = detect(text).unwrap();
println!("检测语言: {}", info.lang().eng_name());
println!("ISO 639-3代码: {}", info.lang().code());
println!("置信度: {:.2}", info.confidence());
}
2. 检测特定语言
use whatlang::{detect, Lang};
fn main() {
let text = "Bonjour, comment allez-vous?";
// 检测是否为法语
if let Some(info) = detect(text) {
if info.lang() == Lang::Fra {
println!("这是法语文本");
} else {
println!("检测到其他语言: {}", info.lang().eng_name());
}
}
}
3. 排除特定语言检测
use whatlang::{detect, Lang};
fn main() {
let text = "Hola, ¿cómo estás?";
let options = whatlang::Options::from_lang(Lang::Spa).unwrap();
let info = detect_with_options(text, &options).unwrap();
println!("检测语言: {}", info.lang().eng_name());
}
4. 批量文本检测
use whatlang::detect;
fn batch_detect(texts: Vec<&str>) {
for text in texts {
if let Some(info) = detect(text) {
println!("文本: '{}'", text);
println!("语言: {}", info.lang().eng_name());
println!("---");
}
}
}
fn main() {
let texts = vec![
"Hello world",
"Bonjour le monde",
"Hola mundo",
"こんにちは世界"
];
batch_detect(texts);
}
高级功能
自定义检测选项
use whatlang::{Options, Lang};
fn custom_detection() {
let options = Options::builder()
.set_blacklist(vec![Lang::Eng, Lang::Spa]) // 排除英语和西班牙语
.set_min_confidence(0.5) // 设置最小置信度
.build()
.unwrap();
let text = "Guten Tag!";
if let Some(info) = whatlang::detect_with_options(text, &options) {
println!("检测结果: {:?}", info);
}
}
获取详细检测信息
use whatlang::detect;
fn detailed_analysis(text: &str) {
if let Some(info) = detect(text) {
println!("语言: {}", info.lang().eng_name());
println!("ISO代码: {}", info.lang().code());
println!("置信度: {:.4}", info.confidence());
println!("是否为RTL语言: {}", info.lang().is_rtl());
println!("脚本类型: {:?}", info.script());
}
}
性能优化建议
- 预处理文本:移除不必要的标点和数字
- 设置最小文本长度:whatlang建议至少20个字符以获得准确结果
- 使用黑名单:如果知道文本不可能是某些语言,可以排除它们
use whatlang::{Options, Lang};
fn optimized_detection(text: &str) {
let options = Options::builder()
.set_blacklist(vec![Lang::Cmn, Lang::Jpn, Lang::Kor]) // 排除中文、日语、韩语
.set_min_confidence(0.3)
.build()
.unwrap();
let info = whatlang::detect_with_options(text, &options).unwrap();
// 处理检测结果
}
错误处理
use whatlang::detect;
fn safe_detection(text: &str) -> Result<String, &'static str> {
if text.len() < 10 {
return Err("文本过短,无法准确检测");
}
match detect(text) {
Some(info) => Ok(info.lang().eng_name().to_string()),
None => Err("无法检测语言")
}
}
完整示例demo
use whatlang::{detect, detect_with_options, Lang, Options, Info};
fn main() {
// 示例1: 简单语言检测
println!("=== 简单语言检测 ===");
let english_text = "This is a sample text in English for language detection.";
if let Some(info) = detect(english_text) {
println!("检测语言: {}", info.lang().eng_name());
println!("ISO代码: {}", info.lang().code());
println!("置信度: {:.3}", info.confidence());
println!("脚本: {:?}", info.script());
println!("是否为RTL: {}", info.lang().is_rtl());
}
println!();
// 示例2: 检测特定语言
println!("=== 检测特定语言 ===");
let french_text = "Bonjour, comment allez-vous aujourd'hui?";
if let Some(info) = detect(french_text) {
if info.lang() == Lang::Fra {
println!("✅ 这是法语文本");
} else {
println!("❌ 不是法语,检测到: {}", info.lang().eng_name());
}
}
println!();
// 示例3: 批量文本检测
println!("=== 批量文本检测 ===");
let texts = vec![
"Hello world, this is English",
"Hola mundo, esto es español",
"Bonjour le monde, c'est français",
"こんにちは世界、これは日本語です",
"안녕하세요 세계, 이것은 한국어입니다"
];
for (i, text) in texts.iter().enumerate() {
if let Some(info) = detect(text) {
println!("文本 {}: {}", i + 1, info.lang().eng_name());
println!(" 置信度: {:.2}", info.confidence());
}
}
println!();
// 示例4: 使用自定义选项(黑名单和最小置信度)
println!("=== 使用自定义选项检测 ===");
let options = Options::builder()
.set_blacklist(vec![Lang::Eng, Lang::Spa]) // 排除英语和西班牙语
.set_min_confidence(0.4) // 设置最小置信度阈值
.build()
.unwrap();
let test_text = "Guten Tag! Wie geht es Ihnen?";
if let Some(info) = detect_with_options(test_text, &options) {
println!("检测结果: {}", info.lang().eng_name());
println!("置信度: {:.3}", info.confidence());
}
println!();
// 示例5: 错误处理和安全检测
println!("=== 错误处理示例 ===");
let short_text = "Hi";
match safe_detect(short_text) {
Ok(language) => println!("检测到的语言: {}", language),
Err(e) => println!("错误: {}", e),
}
let valid_text = "This is a sufficiently long text for accurate detection";
match safe_detect(valid_text) {
Ok(language) => println!("检测到的语言: {}", language),
Err(e) => println!("错误: {}", e),
}
}
// 安全的语言检测函数,包含错误处理
fn safe_detect(text: &str) -> Result<String, &'static str> {
if text.len() < 20 {
return Err("文本长度不足20个字符,建议提供更长文本以获得准确结果");
}
match detect(text) {
Some(info) => {
if info.confidence() < 0.3 {
Err("置信度过低,无法确定语言")
} else {
Ok(info.lang().eng_name().to_string())
}
},
None => Err("无法检测到任何语言")
}
}
whatlang库为Rust开发者提供了强大而高效的语言检测能力,适用于多语言应用、内容过滤、搜索引擎优化等多种场景。