![CODE SIZE](https://img.shields.io/github/languages/code-size/HIT-SCIR/ltp)
![CONTRIBUTORS](https://img.shields.io/github/contributors/HIT-SCIR/ltp)
![LAST COMMIT](https://img.shields.io/github/last-commit/HIT-SCIR/ltp)

| Language                             | version                                                                                                                                                                                                                                                                                                                   |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Python](python/interface/README.md) | [![LTP](https://img.shields.io/pypi/v/ltp?label=LTP)](https://pypi.org/project/ltp) [![LTP-Core](https://img.shields.io/pypi/v/ltp-core?label=LTP-Core)](https://pypi.org/project/ltp-core)   [![LTP-Extension](https://img.shields.io/pypi/v/ltp-extension?label=LTP-Extension)](https://pypi.org/project/ltp-extension) |
| [Rust](rust/ltp/README.md)           | [![LTP](https://img.shields.io/crates/v/ltp?label=LTP)](https://crates.io/crates/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      |

## 快速使用

```rust
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

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

## 性能测试

### 分词

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

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

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

- File Size: 33.85 MB / 305041 lines
- Hard Ware:
  - MacBook Pro (16-inch, 2019)
  - 处理器: 2.6 GHz 六核Intel Core i7
  - 内存: 16 GB 2667 MHz DDR4
  - 图形卡: Intel UHD Graphics 630 1536 MB

| Algorithm                                                                   | Speed(KB/s) |  PKU(F1) |  MSR(F1) |
| --------------------------------------------------------------------------- | ----------: | -------: | -------: |
| [Jieba](https://github.com/fxsjy/jieba)                                     |      982.49 |     81.8 |     81.3 |
| [Pkuseg](https://github.com/lancopku/pkuseg-python)                         |      109.72 |     93.4 |     87.3 |
| [Thulac](https://github.com/thunlp/THULAC-Python)                           |       48.13 |     94.0 |     87.9 |
| Thulac\[Fast\]                                                              |     1133.21 |       同上 |       同上 |
| [LTP 3(pyltp)](https://github.com/HIT-SCIR/pyltp)                           |      451.20 | **95.3** | **88.3** |
| [LTP legacy(1)](https://github.com/HIT-SCIR/ltp/tree/main/python/extension) | **1155.11** |     95.2 |     87.7 |
| LTP legacy(2)                                                               |     2192.58 |       同上 |       同上 |
| LTP legacy(4)                                                               |     3771.35 |       同上 |       同上 |
| LTP legacy(8)                                                               |     5763.14 |       同上 |       同上 |
| LTP legacy(16)                                                              | **7113.26** |       同上 |       同上 |

**注：括号内为线程数量**
**注2：结巴分词的词表是在人民日报数据集上统计的**

### 流水线

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

- File Size: 33.85 MB / 305041 lines
- Hard Ware:
  - MacBook Pro (16-inch, 2019)
  - 处理器: 2.6 GHz 六核Intel Core i7
  - 内存: 16 GB 2667 MHz DDR4
  - 图形卡: Intel UHD Graphics 630 1536 MB

| Algorithm      | Time(s) | Speed(KB/s) |
| -------------- | ------: | ----------: |
| LTP 3          |  226.40 |      153.10 |
| LTP legacy(1)  |   90.66 |      382.33 |
| LTP legacy(2)  |   49.43 |      701.23 |
| LTP legacy(4)  |   27.98 |     1238.76 |
| LTP legacy(8)  |   20.11 |     1723.72 |
| LTP legacy(16) |   16.99 |     2040.26 |

**注：括号内为线程数量**
