Rust印尼语自然语言处理库lingua-indonesian-language-model的使用,支持印尼语文本分析与语言模型处理

Rust印尼语自然语言处理库lingua-indonesian-language-model的使用

印尼语语言模型for Lingua

这是用于印尼语的语言模型,由Lingua使用。Lingua是Rust生态系统中最准确的自然语言检测库。

版本更新

版本1.2.0

  • 通过包含独特和最常见的ngrams来增强语言模型,支持独立于其他语言的绝对置信度指标。

版本1.1.0

  • 语言模型文件现在使用Brotli算法压缩,平均减小了15%的文件大小。

安装

在项目目录中运行以下Cargo命令:

cargo add lingua-indonesian-language-model

或者在Cargo.toml中添加以下行:

lingua-indonesian-language-model = "1.2.0"

示例代码

use lingua::{Language, LanguageDetector, LanguageDetectorBuilder};
use lingua_indonesian_language_model::INDONESIAN;

fn main() {
    // 创建语言检测器并包含印尼语模型
    let languages = vec![Language::Indonesian];
    let detector: LanguageDetector = LanguageDetectorBuilder::from_languages(&languages)
        .with_preloaded_language_models()
        .build();
    
    // 要检测的印尼语文本
    let text = "Halo, apa kabar? Saya sedang belajar Rust.";
    
    // 检测语言
    let detected_language = detector.detect_language_of(text);
    
    match detected_language {
        Some(language) => println!("检测到的语言: {:?}", language),
        None => println!("未能确定语言"),
    }
    
    // 获取检测置信度
    let confidence_values = detector.compute_language_confidence_values(text);
    println!("语言置信度:");
    for (language, confidence) in confidence_values {
        println!("{:?}: {:.4}", language, confidence);
    }
}

完整示例demo

use lingua::{Language, LanguageDetector, LanguageDetectorBuilder};
use lingua_indonesian_language_model::INDONESIAN;

fn main() {
    // 初始化检测器,支持多种语言
    let languages = vec![
        Language::Indonesian,
        Language::English,
        Language::Malay
    ];
    
    // 构建语言检测器
    let detector = LanguageDetectorBuilder::from_languages(&languages)
        .with_preloaded_language_models()
        .build();

    // 测试印尼语文本
    let indonesian_text = "Selamat pagi, bagaimana kabarmu hari ini?";
    println!("测试文本1: {}", indonesian_text);
    
    // 检测语言
    let result = detector.detect_language_of(indonesian_text);
    match result {
        Some(lang) => println!("检测结果: {:?}", lang),
        None => println!("无法确定语言")
    }
    
    // 测试混合文本
    let mixed_text = "Hello world! Apa kabar? 你好吗?";
    println!("\n测试文本2: {}", mixed_text);
    
    // 获取所有语言的置信度
    let confidences = detector.compute_language_confidence_values(mixed_text);
    println!("语言置信度分析:");
    for (lang, score) in confidences {
        println!("{:?}: {:.2}%", lang, score * 100.0);
    }
    
    // 测试短文本
    let short_text = "Terima kasih";
    println!("\n测试文本3: {}", short_text);
    
    // 检测短文本
    let short_result = detector.detect_language_of(short_text);
    match short_result {
        Some(lang) => println!("检测结果: {:?}", lang),
        None => println!("文本过短,无法确定")
    }
}

代码说明

  1. 导入必要的模块和印尼语语言模型
  2. 创建支持多种语言的检测器(印尼语、英语、马来语)
  3. 测试纯印尼语文本的检测
  4. 测试混合语言的文本并分析各语言置信度
  5. 测试短文本的检测能力

这个完整示例展示了lingua-indonesian-language-model库在多种场景下的应用,包括纯印尼语文本检测、混合语言分析以及短文本处理能力。


1 回复

Rust印尼语自然语言处理库lingua-indonesian-language-model使用指南

库简介

lingua-indonesian-language-model是一个专门为印尼语设计的Rust自然语言处理库,提供了印尼语文本分析和语言模型处理功能。该库适合需要处理印尼语文本的开发者,包括文本预处理、特征提取和语言模型应用等场景。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
lingua-indonesian-language-model = "0.1.0"  # 请使用最新版本号

主要功能

1. 文本预处理

use lingua_indonesian_language_model::preprocessing::{Tokenizer, Normalizer};

fn main() {
    let text = "Ini adalah contoh teks dalam Bahasa Indonesia.";
    
    // 初始化分词器
    let tokenizer = Tokenizer::new();
    let tokens = tokenizer.tokenize(text);
    println!("分词结果: {:?}", tokens);
    
    // 文本标准化
    let normalizer = Normalizer::new();
    let normalized_text = normalizer.normalize(text);
    println!("标准化文本: {}", normalized_text);
}

2. 词性标注

use lingua_indonesian_language_model::pos_tagger::POSTagger;

fn main() {
    let tagger = POSTagger::load_default_model().unwrap();
    let sentence = "Saya pergi ke pasar membeli buah.";
    
    let tagged_words = tagger.tag_sentence(sentence);
    for (word, tag) in tagged_words {
        println!("{}: {}", word, tag);
    }
}

3. 命名实体识别

use lingua_indonesian_language_model::ner::NamedEntityRecognizer;

fn main() {
    let ner = NamedEntityRecognizer::load_default_model().unwrap();
    let text = "Presiden Joko Widodo berkunjung ke Bandung.";
    
    let entities = ner.extract_entities(text);
    for entity in entities {
        println!("实体: {}, 类型: {}, 位置: {:?}", 
            entity.text, entity.entity_type, entity.span);
    }
}

4. 语言模型使用

use lingua_indonesian_language_model::language_model::IndonesianLanguageModel;

fn main() {
    let model = IndonesianLanguageModel::load_default().unwrap();
    let sentence = "Hari ini cuaca sangat";
    
    // 获取下一个词的概率分布
    let predictions = model.predict_next_word(sentence);
    for (word, prob) in predictions.top_k(5) {
        println!("{}: {:.2}%", word, prob * 100.0);
    }
    
    // 计算句子概率
    let sentence_prob = model.sentence_probability(sentence);
    println!("句子概率: {:.2}", sentence_prob);
}

高级功能

1. 自定义模型训练

use lingua_indonesian_language_model::training::ModelTrainer;

fn main() {
    let corpus = vec![
        "Ini adalah kalimat pertama.".to_string(),
        "Ini adalah kalimat kedua.".to_string(),
        // 更多训练数据...
    ];
    
    let mut trainer = ModelTrainer::new();
    trainer.train(&corpus);
    
    // 保存训练好的模型
    trainer.save_model("custom_model.bin").unwrap();
}

2. 情感分析

use lingua_indonesian_language_model::sentiment::SentimentAnalyzer;

fn main() {
    let analyzer = SentimentAnalyzer::load_default_model().unwrap();
    let text = "Saya sangat senang dengan produk ini!";
    
    let sentiment = analyzer.analyze(text);
    println!("情感分析结果: {:?}", sentiment);
}

性能优化建议

  1. 对于大量文本处理,考虑使用批处理模式
  2. 模型加载是耗时操作,应尽量复用已加载的模型
  3. 对于生产环境,建议预加载所有需要的模型

错误处理

use lingua_indonesian_language_model::error::NlpError;

fn process_text(text: &str) -> Result<(), NlpError> {
    let tagger = POSTagger::load_default_model()?;
    let _ = tagger.tag_sentence(text)?;
    Ok(())
}

fn main() {
    match process_text("Contoh teks") {
        Ok(_) => println!("处理成功"),
        Err(e) => eprintln!("发生错误: {}", e),
    }
}

注意事项

  1. 该库主要针对现代标准印尼语设计,可能不适用于某些方言
  2. 首次使用某些功能时需要下载模型文件
  3. 对于专业领域文本,建议使用领域特定的模型或进行额外训练

这个库为Rust开发者提供了处理印尼语文本的全面工具集,从基础的分词到高级的语言模型应用,能够满足大多数印尼语NLP任务的需求。

完整示例Demo

下面是一个结合多个功能的完整示例,展示如何使用该库处理印尼语文本:

use lingua_indonesian_language_model::{
    preprocessing::{Tokenizer, Normalizer},
    pos_tagger::POSTagger,
    ner::NamedEntityRecognizer,
    sentiment::SentimentAnalyzer,
    language_model::IndonesianLanguageModel,
    error::NlpError
};

fn main() -> Result<(), NlpError> {
    // 示例文本
    let text = "Presiden Joko Widodo menyatakan sangat bangga dengan prestasi tim sepak bola Indonesia.";

    // 1. 文本预处理
    println!("=== 文本预处理 ===");
    let normalizer = Normalizer::new();
    let normalized_text = normalizer.normalize(text);
    println!("标准化文本: {}", normalized_text);

    let tokenizer = Tokenizer::new();
    let tokens = tokenizer.tokenize(&normalized_text);
    println!("分词结果: {:?}", tokens);

    // 2. 词性标注
    println!("\n=== 词性标注 ===");
    let tagger = POSTagger::load_default_model()?;
    let tagged_words = tagger.tag_sentence(&normalized_text);
    for (word, tag) in tagged_words {
        println!("{}: {}", word, tag);
    }

    // 3. 命名实体识别
    println!("\n=== 命名实体识别 ===");
    let ner = NamedEntityRecognizer::load_default_model()?;
    let entities = ner.extract_entities(text);
    for entity in entities {
        println!("实体: {}, 类型: {}, 位置: {:?}", 
            entity.text, entity.entity_type, entity.span);
    }

    // 4. 情感分析
    println!("\n=== 情感分析 ===");
    let analyzer = SentimentAnalyzer::load_default_model()?;
    let sentiment = analyzer.analyze(text);
    println!("情感分析结果: {:?}", sentiment);

    // 5. 语言模型预测
    println!("\n=== 语言模型预测 ===");
    let model = IndonesianLanguageModel::load_default()?;
    let predictions = model.predict_next_word("Indonesia meraih");
    println!("下一个词的预测:");
    for (word, prob) in predictions.top_k(5) {
        println!("{}: {:.2}%", word, prob * 100.0);
    }

    Ok(())
}

这个完整示例展示了:

  1. 文本标准化和分词预处理
  2. 词性标注分析
  3. 命名实体识别
  4. 情感分析
  5. 语言模型预测

运行此程序将展示如何处理印尼语文本并获取各种NLP分析结果。注意首次运行可能需要下载模型文件。

回到顶部