Rust语言检测库whatlang的使用,whatlang可快速识别文本语言并支持多种自然语言处理功能

Whatlang - rust library for natural language detection

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 LangScript实现来自enum-map的Enum特性
arbitrary 支持Arbitrary
serde LangScript实现SerializeDeserialize
dev 启用whatlang::dev模块,提供一些内部API。
用于性能分析目的,不建议普通用户依赖此API。

工作原理

语言识别如何工作?

该算法基于三元组语言模型,这是n-gram的一个特例。

is_reliable如何计算?

它基于以下因素:

  • 给定文本中有多少唯一的三元组
  • 第一种和第二种(未返回)检测到的语言之间的差异有多大?这个指标在代码库中称为rate

因此,它可以表示为具有阈值函数的2D空间,将其分为"可靠"和"不可靠"区域。

Language recognition whatlang rust

比较与替代方案

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());
    }
}

性能优化建议

  1. 预处理文本:移除不必要的标点和数字
  2. 设置最小文本长度:whatlang建议至少20个字符以获得准确结果
  3. 使用黑名单:如果知道文本不可能是某些语言,可以排除它们
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开发者提供了强大而高效的语言检测能力,适用于多语言应用、内容过滤、搜索引擎优化等多种场景。

回到顶部