# bi-lstm-crf
基于Universal Transformer的分词模型见:[https://github.com/GlassyWing/transformer-word-segmenter](https://github.com/GlassyWing/transformer-word-segmenter):
## 简介
不同于英文自然语言处理,中文自然语言处理,例如语义分析、文本分类、词语蕴含等任务都需要预先进行分词。要将中文进行分割,直观的方式是通过为语句中的每一个字进行标记,以确定这个字是位于一个词的开头还是之中:
例如“**成功入侵民主党的电脑系统**”这句话,我们为其标注为:
```js
"成功 入侵 民主党 的 电脑系统"
B I B I B I I S B I I I
```
其中`B`表示一个词语的开头,`I`表示非一个词语的开头,`S`表示单字成词。这样我们就能达到分词的效果。
对于句子这样的序列而言,要为其进行标注,常用的是使用Bi-LSTM卷积网络进行序列标注,如下图:
<center>
<img src="assets/Bi-LSTM.png" width=400 title="Bi-LSTM 的序列标注">
</img>
</center>
通过Bi-LSTM获得每个词所对应的所有标签的概率,取最大概率的标注即可获得整个标注序列,如上图序列`W0W1W2`的标注为`BIS`。但这样有可能会取得不合逻辑的标注序列,如`BS`、`SI`等。我们需要为其设定一些约束,如:
* B后只能是I
* S之后只能是B、S
* ...
而要做到这一点,我们可以在原有的模型基础之上,加上一个CRF层,该层的作用即是学习符号之间的约束(如上所述)。模型架构变为Embedding + Bi-LSTM + CRF,原理参考论文:https://arxiv.org/abs/1508.01991。
## 语料预处理
要训练模型,首先需要准备好语料,这里选用人民日报2014年的80万语料作为训练语料。语料格式如下:
```js
"人民网/nz 1月1日/t 讯/ng 据/p 《/w [纽约/nsf 时报/n]/nz 》/w 报道/v ,/w 美国/nsf 华尔街/nsf 股市/n 在/p 2013年/t 的/ude1 最后/f 一天/mq 继续/v 上涨/vn ,/w 和/cc [全球/n 股市/n]/nz 一样/uyy ,/w 都/d 以/p [最高/a 纪录/n]/nz 或/c 接近/v [最高/a 纪录/n]/nz 结束/v 本/rz 年/qt 的/ude1 交易/vn 。/w "
```
原格式中每一个词语使用空格分开后面使用POS标记词性,而本模型所需要的语料格式如下:
```js
嫌 疑 人 赵 国 军 。 B-N I-N I-N B-NR I-NR I-NR S-W
```
使用命令:
```sh
python tools/data_preprocess.py people-2014/train 2014_processed -c True -s True
```
可将原文件转换为用BIS标签(B:表示语句块的开始,I:表示非语句块的开始,S:表示单独成词)标注的文件。
如上将会使用`people-2014/train`下的文件生成文本文件`2014_processed`
## 生成字典
使用命令:
```python
python tools/make_dicts.py 2014_processed -s src_dict.json -t tgt_dict.json
```
这会使用文件`2014_processed`,生成两个字典文件,`src_dict.json`, `tgt_dict.json`
使用方式见:`python tools/make_dicts.py -h`
## 转换为hdf5格式
使用命令:
```python
python tools/convert_to_h5.py 2014_processed 2014_processed.h5 -s src_dict.json -t tgt_dict.json
```
可将文本文件`2014_processed`转换为hdf5格式,提升训练速度,
使用方式见:`python tools/convert_to_h5.py -h`
## 训练
训练示例见:
```python
train_example.py
```
训练时,默认会生成模型配置文件`data/default-config.json`, 权重文件将会生成在`models`文件夹下。
### 使用字(词)向量
在训练时可以使用已训练的字(词)向量作为每一个字的表征,字(词)向量的格式如下:
```js
而 -0.037438 0.143471 0.391358 ...
个 -0.045985 -0.065485 0.251576 ...
以 -0.085605 0.081578 0.227135 ...
可以 0.012544 0.069829 0.117207 ...
第 -0.321195 0.065808 0.089396 ...
上 -0.186070 0.189417 0.265060 ...
之 0.037873 0.075681 0.239715 ...
于 -0.197969 0.018578 0.233496 ...
对 -0.115746 -0.025029 -0 ...
```
每一行,为一个字(词)和它所对应的特征向量。
汉字字(词)向量来源
可从[https://github.com/Embedding/Chinese-Word-Vectors](https://github.com/Embedding/Chinese-Word-Vectors)获得字(词)向量。字(词)向量文件中每一行格式为一个字(词)与其对应的300维向量。
### 训练效果
训练时模型配置如下:
```json
config = {
"vocab_size": 6864,
"chunk_size": 259,
"embed_dim": 300,
"bi_lstm_units": 256,
"max_num_words": 20000,
"dropout_rate": 0.1
}
```
其它参数:
| 参数 | 值 |
| ---------------- | ---- |
| batch size | 32 |
| epochs | 32 |
| steps_per_epoch | 2000 |
| validation_steps | 20 |
**注**: 训练未使用词向量
最终效果:
在迭代32次后,验证集精度达到98%
<img src="assets/accuracy.png">
<img src="assets/loss.png">
## 分词/解码
1. 编码方式:
```python
import time
from dl_segmenter import get_or_create, DLSegmenter
if __name__ == '__main__':
segmenter: DLSegmenter = get_or_create("../data/default-config.json",
src_dict_path="../data/src_dict.json",
tgt_dict_path="../data/tgt_dict.json",
weights_path="../models/weights.32--0.18.h5")
for _ in range(1):
start_time = time.time()
for sent, tag in segmenter.decode_texts([
"美国司法部副部长罗森·施泰因(Rod Rosenstein)指,"
"这些俄罗斯情报人员涉嫌利用电脑病毒或“钓鱼电邮”,"
"成功入侵民主党的电脑系统,偷取民主党高层成员之间的电邮,"
"另外也从美国一个州的电脑系统偷取了50万名美国选民的资料。"]):
print(sent)
print(tag)
print(f"cost {(time.time() - start_time) * 1000}ms")
```
`get_or_create`:
- 参数:
- config_path: 模型配置路径
- src_dict_path:源字典文件路径
- tgt_dict_path:目标字典文件路径
- weights_path:权重文件路径
- 返回:
分词器对象
`decode_texts`:
- 参数:
- 字符串序列(即可同时处理多段文本)
- 返回:
- 一个序列,序列中每一个元素为对应语句的分词结果和每个词的词性标签。
2. 命令方式:
```python
python examples/predict.py -s <语句>
```
命令方式所使用的模型配置文件、字典文件等如编程方式中所示。进行分词时,多句话可用空格分隔,具体使用方式可使用`predict.py -h`查看。
### 分词效果展示
1. 科技类
> _物理仿真引擎的作用,是让虚拟世界中的物体运动符合真实世界的物理定律,经常用于游戏领域,以便让画面看起来更富有真实感。PhysX是由英伟达提出的物理仿真引擎,其物理模拟计算由专门加速芯片GPU来进行处理,在节省CPU负担的同时还能将物理运算效能成倍提升,由此带来更加符合真实世界的物理效果。_
```python
['物理', '仿真引擎', '的', '作用', ',', '是', '让', '虚拟世界', '中', '的', '物体运动', '符合', '真实世界', '的', '物理定律', ',', '经常', '用于', '游戏', '领域', ',', '以便', '让', '画面', '看起来', '更', '富有', '真实感', '。', 'PhysX', '是', '由', '英伟达', '提出', '的', '物理', '仿真引擎', ',', '其', '物理模拟计算', '由', '专门', '加速', '芯片', 'GPU', '来', '进行', '处理', ',', '在', '节省', 'CPU', '负担', '的', '同时', '还', '能', '将', '物理运算', '效能', '成', '倍', '提升', ',', '由此', '带来', '更加', '符合', '真实世界', '的', '物理', '效果', '。']
['n', 'n', 'ude1', 'n', 'w', 'vshi', 'v', 'gi', 'f', 'ude1', 'nz', 'v', 'nz', 'ude1', 'nz', 'w', 'd', 'v', 'n',

白话Learning
- 粉丝: 4774
最新资源
- 网络营销理论基础与环境概述.pptx
- 五基于ARM的嵌入式系统硬件结构设计.pptx
- C语言程序设计酒店管理系统实验报告.doc
- 论新形势下的网络群防群治工作.doc
- 网络环境的专题教学研究与教学设计.pptx
- 考勤机软件说明书.doc
- 个人云端文件存储与管理系统设计实现
- 酒店用品网网站策划方案.doc
- 东软数据库三级项目.doc
- 关于计算机的心得体会.docx
- 校园网络监控建设方案.doc
- 老年公寓综合信息管理服务系统 老年公寓智能化运营管理系统平台 老年公寓住户与服务综合管理系统 现代化老年公寓一体化管理信息系统 老年公寓住宿与服务综合管理系统 老年公寓老年公寓全面信息化管理系统 老年
- 在线测试管理系统的设计与实现
- java毕业设计,产品售后管理系统
- 分布式智能系统中的协调策略与挑战
- java毕业设计,智能小区管理系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


