Rust日语分词库lindera-unidic的使用,支持高效精准的日语文本分析和处理

Rust日语分词库lindera-unidic的使用,支持高效精准的日语文本分析和处理

字典版本

这个仓库包含unidic-mecab字典。

字典格式

字典格式和词性标签的详细信息请参考unidic-mecab字典手册。

标准字典格式

索引 名称(日语) 名称(英语) 说明
0 表層形 Surface
1 左文脈ID Left context ID
2 右文脈ID Right context ID
3 コスト Cost
4 品詞大分類 Part-of-speech
5 品詞中分類 Part-of-speech subcategory 1
6 品詞小分類 Part-of-speech subcategory 2
7 品詞細分類 Part-of-speech subcategory 3
8 活用型 Conjugation type
9 活用形 Conjugation form
10 語彙素読み Reading
11 語彙素(語彙素表記 + 語彙素細分類) Lexeme
12 書字形出現形 Orthographic surface form
13 発音形出現形 Phonological surface form
14 書字形基本形 Orthographic base form
15 発音形基本形 Phonological base form
16 語種 Word type
17 語頭変化型 Initial mutation type
18 語頭変化形 Initial mutation form
19 語末変化型 Final mutation type
20 語末変化形 Final mutation form

用户字典格式(CSV)

简单版本

索引 名称(日语) 名称(英语) 说明
0 表層形 Surface
1 品詞大分類 Part-of-speech
2 語彙素読み Reading

详细版本

索引 名称(日语) 名称(英语) 说明
0 表層形 Surface
1 左文脈ID Left context ID
2 右文脈ID Right context ID
3 コスト Cost
4 品詞大分類 Part-of-speech
5 品詞中分類 Part-of-speech subcategory 1
6 品詞小分類 Part-of-speech subcategory 2
7 品詞細分類 Part-of-speech subcategory 3
8 活用型 Conjugation type
9 活用形 Conjugation form
10 語彙素読み Reading
11 語彙素(語彙素表記 + 語彙素細分類) Lexeme
12 書字形出現形 Orthographic surface form
13 発音形出現形 Phonological surface form
14 書字形基本形 Orthographic base form
15 発音形基本形 Phonological base form
16 語種 Word type
17 語頭変化型 Initial mutation type
18 語頭変化形 Initial mutation form
19 語末変化型 Final mutation type
20 語末変化形 Final mutation form
21 - - 21之后可以自由扩展

完整使用示例

首先在Cargo.toml中添加依赖:

[dependencies]
lindera-unidic = "1.0.0"

然后使用以下代码示例进行日语分词:

use lindera::mode::Mode;
use lindera::tokenizer::{Tokenizer, TokenizerConfig};
use lindera_unidic_builder::build_unidic;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 构建UniDic字典数据
    let dictionary_data = build_unidic()?;
    
    // 配置分词器
    let config = TokenizerConfig {
        dictionary: dictionary_data,
        user_dictionary: None,
        mode: Mode::Normal,
    };
    
    // 创建分词器实例
    let tokenizer = Tokenizer::with_config(config)?;
    
    // 日语文本分词
    let text = "日本語の形態素解析を行います。";
    let tokens = tokenizer.tokenize(text)?;
    
    // 输出分词结果
    for token in tokens {
        println!("{}: {:?}", token.text, token.detail);
    }
    
    Ok(())
}

这个示例展示了如何使用lindera-unidic进行日语文本分词。代码首先加载UniDic字典,然后初始化分词器,最后对日语文本进行分词处理并输出结果。每个分词结果包含表面形式和详细的词性信息等。

以下是一个更完整的示例代码,包含自定义用户字典和更多分词选项:

use lindera::mode::Mode;
use lindera::tokenizer::{Tokenizer, TokenizerConfig};
use lindera_unidic_builder::build_unidic;
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 构建UniDic字典数据
    let dictionary_data = build_unidic()?;
    
    // 2. 加载用户自定义字典 (可选)
    let user_dictionary_path = Path::new("user_dict.csv");
    let user_dictionary = if user_dictionary_path.exists() {
        Some(lindera::dictionary::UserDictionary::from_path(user_dictionary_path)?)
    } else {
        None
    };
    
    // 3. 配置分词器
    let config = TokenizerConfig {
        dictionary: dictionary_data,
        user_dictionary,
        mode: Mode::Decompose(PoseLevel::Normal), // 可选的分解模式
    };
    
    // 4. 创建分词器实例
    let tokenizer = Tokenizer::with_config(config)?;
    
    // 5. 日语文本分词
    let text = "令和5年に新しいプロジェクトを開始します。";
    let tokens = tokenizer.tokenize(text)?;
    
    // 6. 输出分词结果及详细信息
    println!("分词结果:");
    for token in tokens {
        println!("- 表層形: {}", token.text);
        println!("  品詞: {}", token.detail[4]); // 品詞大分類
        println!("  読み: {}", token.detail[10]); // 語彙素読み
        println!("  基本形: {}", token.detail[14]); // 書字形基本形
    }
    
    // 7. 统计信息
    println!("\n统计信息:");
    println!("总词数: {}", tokens.len());
    
    Ok(())
}

这个完整示例展示了:

  1. 加载标准UniDic字典
  2. 可选加载用户自定义字典
  3. 配置分词器参数
  4. 使用分解模式进行更细致的分析
  5. 输出分词结果及详细信息
  6. 提供统计信息

可以根据需要调整Mode参数来选择不同的分析模式,如Normal(普通模式)、Decompose(分解模式)或Extended(扩展模式)。


1 回复

Rust日语分词库lindera-unidic使用指南

简介

lindera-unidic 是一个基于 Rust 语言的高性能日语分词库,它使用 UniDic 词典进行日语文本分析和处理。该库提供了准确的日语分词功能,适用于各种自然语言处理任务。

主要特性

  • 高效的分词性能
  • 基于 UniDic 词典的准确分词
  • 支持多种分词模式
  • 纯 Rust 实现,无需外部依赖
  • 支持 no_std 环境

安装方法

在 Cargo.toml 中添加依赖:

[dependencies]
lindera-unidic = "0.1.0"

基本使用方法

简单分词示例

use lindera_unidic::tokenizer::Tokenizer;

fn main() {
    // 创建分词器实例
    let tokenizer = Tokenizer::new().unwrap();
    
    // 对日语文本进行分词
    let text = "日本語の文章を分かち書きします。";
    let tokens = tokenizer.tokenize(text).unwrap();
    
    // 输出分词结果
    for token in tokens {
        println!("{}", token.text);
    }
}

获取详细分词信息

use lindera_unidic::tokenizer::Tokenizer;

fn main() {
    let tokenizer = Tokenizer::new().unwrap();
    let text = "東京特許許可局";
    let tokens = tokenizer.tokenize(text).unwrap();
    
    for token in tokens {
        println!("Text: {}", token.text);
        println!("Details: {:?}", token.detail);
        println!("------------------");
    }
}

高级功能

自定义分词模式

use lindera_unidic::{tokenizer::Tokenizer, mode::Mode};

fn main() {
    // 使用不同的分词模式
    let tokenizer_normal = Tokenizer::with_mode(Mode::Normal).unwrap();
    let tokenizer_decompose = Tokenizer::with_mode(Mode::Decompose).unwrap();
    
    let text = "すももももももももものうち";
    
    println!("Normal mode:");
    for token in tokenizer_normal.tokenize(text).unwrap() {
        println!("{}", token.text);
    }
    
    println!("\nDecompose mode:");
    for token in tokenizer_decompose.tokenize(text).unwrap() {
        println!("{}", token.text);
    }
}

处理大文本

use lindera_unidic::tokenizer::Tokenizer;
use std::fs;

fn main() {
    let tokenizer = Tokenizer::new().unwrap();
    
    // 读取大文本文件
    let content = fs::read_to_string("large_japanese_text.txt").unwrap();
    
    // 分批处理
    for line in content.lines() {
        let tokens = tokenizer.tokenize(line).unwrap();
        // 处理分词结果...
    }
}

性能优化

对于需要高性能处理的场景,可以重复使用 Tokenizer 实例:

use lindera_unidic::tokenizer::Tokenizer;

fn process_large_dataset(texts: &[&str]) {
    // 创建一次分词器,多次使用
    let tokenizer = Tokenizer::new().unwrap();
    
    for text in texts {
        let tokens = tokenizer.tokenize(text).unwrap();
        // 处理分词结果...
    }
}

完整示例Demo

下面是一个结合了基本使用和高级功能的完整示例:

use lindera_unidic::{tokenizer::Tokenizer, mode::Mode};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    // 示例1: 简单分词
    println!("=== 简单分词示例 ===");
    let tokenizer = Tokenizer::new()?;
    let text = "Rustで日本語を処理するのは楽しいです!";
    let tokens = tokenizer.tokenize(text)?;
    
    println!("原文: {}", text);
    println!("分词结果:");
    for token in tokens {
        println!("- {}", token.text);
    }
    
    // 示例2: 不同分词模式比较
    println!("\n=== 不同分词模式比较 ===");
    let sample_text = "令和三年五月五日";
    
    let normal_tokens = Tokenizer::with_mode(Mode::Normal)?.tokenize(sample_text)?;
    let decompose_tokens = Tokenizer::with_mode(Mode::Decompose)?.tokenize(sample_text)?;
    
    println!("Normal模式:");
    for token in normal_tokens {
        println!("{} ({:?})", token.text, token.detail);
    }
    
    println!("\nDecompose模式:");
    for token in decompose_tokens {
        println!("{} ({:?})", token.text, token.detail);
    }
    
    // 示例3: 处理文件内容
    println!("\n=== 文件处理示例 ===");
    let content = "東京特許許可局\nすももももももももものうち\n日本語の文章を分かち書きします。";
    
    println!("处理多行文本:");
    for line in content.lines() {
        println!("\n原文: {}", line);
        let tokens = tokenizer.tokenize(line)?;
        for token in tokens {
            println!("- {} ({:?})", token.text, token.detail);
        }
    }
    
    Ok(())
}

注意事项

  1. 首次使用时需要下载 UniDic 词典数据
  2. 对于非常大的文本,建议分批处理以避免内存问题
  3. 不同的分词模式会影响分词结果和性能

lindera-unidic 是一个功能强大且高效的日语分词解决方案,特别适合需要处理日语文本的 Rust 应用程序。

回到顶部