8 releases

0.1.7 Sep 12, 2022
0.1.6 Sep 6, 2022
0.1.5 Aug 23, 2022

#746 in Algorithms

Custom license

145KB
3K SLoC

Contains (Zip file, 7.5MB) test/viterbi.npz, (Zip file, 86KB) test/eisner.npz

CODE SIZE CONTRIBUTORS LAST COMMIT

Language version
Python LTP LTP-Core LTP-Extension
Rust LTP

LTP For Rust

传统机器学习方法(LTP 3)实现的 CWS / POS / NER 算法。

method ltp 3.0(c++) ap(1) ap(8) pa pa-i(0.5) pa-ii(0.5)
cws 97.83 97.93 97.67 97.90 97.90 97.93
pos 98.35 98.41 98.30 98.39 98.39 98.38
ner 94.17 94.28 93.42 94.02 94.06 93.95

快速使用

use std::fs::File;
use apache_avro::Codec;
use itertools::multizip;
use ltp::{CWSModel, POSModel, NERModel, ModelSerde, Format};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let file = File::open("data/legacy-models/cws_model.bin")?;
    let cws: CWSModel = ModelSerde::load(file, Format::AVRO(Codec::Deflate))?;
    let file = File::open("data/legacy-models/pos_model.bin")?;
    let pos: POSModel = ModelSerde::load(file, Format::AVRO(Codec::Deflate))?;
    let file = File::open("data/legacy-models/ner_model.bin")?;
    let ner: NERModel = ModelSerde::load(file, Format::AVRO(Codec::Deflate))?;

    let words = cws.predict("他叫汤姆去拿外衣。");
    let pos = pos.predict(&words);
    let ner = ner.predict((&words, &pos));

    for (w, p, n) in multizip((words, pos, ner)) {
        println!("{}/{}/{}", w, p, n);
    }

    Ok(())
}

features

  • 分句
  • 任务
    • 中文分词(cws)
      • 对数字、英文、网址、邮件的处理
      • 支持自定义词典
    • 词性标注(pos)
      • 支持自定义词典
    • 命名实体识别(ner)
  • 算法
    • 平均感知机(ap)
      • 单线程平均感知机
      • 多线程平均感知机
    • 被动攻击算法(pa)
  • 模型量化
  • 在线学习
  • 增量学习

性能测试

评测环境

  • Python 3.10
  • MacBook Pro (16-inch, 2019)
  • 处理器: 2.6 GHz 六核Intel Core i7
  • 内存: 16 GB 2667 MHz DDR4

注: 速度测试文件大小为 33.85 MB / 305041 行 注: 速度测试为 Python 版本 LTP-Extension 的速度

分词

我们选择Jieba、Pkuseg、Thulac等国内代表分词软件与 LTP 做性能比较,根据第二届国际汉语分词测评发布的国际中文分词测评标准,对不同软件进行了速度和准确率测试。

在第二届国际汉语分词测评中,共有四家单位提供的测试语料(Academia Sinica、 City University 、Peking University(PKU) 、Microsoft Research(MSR)), 在评测提供的资源icwb2-data 中包含了来自这四家单位的训练集(icwb2-data/training)、测试集(icwb2-data/testing), 以及根据各自分词标准而提供的相应测试集的标准答案(icwb2-data/gold).在icwb2-data/scripts目录下含有对分词进行自动评分的perl脚本score。

我们在统一测试环境下,对若干流行分词软件和 LTP 进行了测试,使用的模型为各分词软件自带模型。在PKU和MSR测试集评测结果如下:

Algorithm Speed(KB/s) PKU(F1) MSR(F1)
Jieba 982.49 81.8 81.3
Pkuseg 109.72 93.4 87.3
Thulac 48.13 94.0 87.9
Thulac[Fast] 1133.21 同上 同上
LTP 3(pyltp) 451.20 95.3 88.3
LTP legacy(1) 1603.63 95.2 87.7
LTP legacy(2) 2869.42 同上 同上
LTP legacy(4) 4949.38 同上 同上
LTP legacy(8) 6803.88 同上 同上
LTP legacy(16) 7745.16 同上 同上

注:括号内为线程数量

注2:Jieba的词表是在人民日报数据集上统计的

流水线

除了分词以外,我们也测试了 LTP 三个任务(分词、词性标注、命名实体识别)流水线的速度:

Algorithm Speed(KB/s)
LTP 3(pyltp) 153.10
LTP legacy(1) 508.74
LTP legacy(2) 899.25
LTP legacy(4) 1598.03
LTP legacy(8) 2267.48
LTP legacy(16) 2452.34

注:括号内为线程数量

注2:速度数据在人民日报命名实体测试数据上获得,速度计算方式均为所有任务顺序执行的结果。

Dependencies

~1–3MB
~58K SLoC