paddlepaddle中文词法分析LAC
摘自:https://aistudio.baidu.com/aistudio/projectdetail/305812
相关代码:
链接:https://pan.baidu.com/s/1uK9Cq55RZinAIDAcdCOLuw
提取码:sjpy
分词基本知识
什么是分词
词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文分词的基础与关键。
由于英文单词本来就有空格进行分割,所以处理起来相对方便。但是,由于中文是没有分隔符的,所以分词的问题就比较重要。
分词常用的手段是基于字典的最长串匹配,但是歧义分词很难。举个例子,‘他 将来 我 校 讲学’ ,也可切分成’他 将 来 我 校 讲学‘。
中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块。不同于英文的是,中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词,分词效果将直接影响词性、句法树等模块的效果。当然分词只是一个工具,场景不同,要求也不同。在人机自然语言交互中,成熟的中文分词算法能够达到更好的自然语言处理效果,帮助计算机理解复杂的中文语言。中文分词根据实现原理和特点,主要分为以下2个类别:
分词基本知识
常见的分词方法
1、基于词典分词算法也称字符串匹配分词算法。
该算法是按照一定的策略将待匹配的字符串和一个已建立好的“充分大的”词典中的词进行匹配,若找到某个词条,则说明匹配成功,识别了该词。常见的基于词典的分词算法分为以下几种:正向最大匹配法、逆向最大匹配法和双向匹配分词法等。基于词典的分词算法是应用最广泛、分词速度最快的。很长一段时间内研究者都在对基于字符串匹配方法进行优化,比如最大长度设定、字符串存储和查找方式以及对于词表的组织结构,比如采用TRIE索引树、哈希索引等。
2、基于统计的机器学习算法
这类目前常用的是算法是HMM、CRF、SVM、深度学习等算法,比如stanford、Hanlp分词工具是基于CRF算法。以CRF为例,基本思路是对汉字进行标注训练,不仅考虑了词语出现的频率,还考虑上下文,具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果。Nianwen Xue在其论文《Combining Classifiers for Chinese Word Segmentation》中首次提出对每个字符进行标注,通过机器学习算法训练分类器进行分词,在论文《Chinese word segmentation as character tagging》中较为详细地阐述了基于字标注的分词法。常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。随着深度学习的兴起,也出现了基于神经网络的分词器,例如有人员尝试使用双向LSTM+CRF实现分词器,其本质上是序列标注,所以有通用性,命名实体识别等都可以使用该模型,据报道其分词器字符准确率可高达97.5%。算法框架的思路与论文《Neural Architectures for Named Entity Recognition》类似,利用该框架可以实现中文分词,
分词器当前存在问题
目前中文分词难点主要有三个:
- 1、分词标准:比如人名,在哈工大的标准中姓和名是分开的,但在Hanlp中是合在一起的。这需要根据不同的需求制定不同的分词标准。
- 2、歧义:对同一个待切分字符串存在多个分词结果。歧义又分为组合型歧义、交集型歧义和真歧义三种类型。
- 组合型歧义:分词是有不同的粒度的,指某个词条中的一部分也可以切分为一个独立的词条。比如“中华人民共和国”,粗粒度的分词就是“中华人民共和国”,细粒度的分词可能是“中华/人民/共和国”
- 交集型歧义:在“郑州天和服装厂”中,“天和”是厂名,是一个专有词,“和服”也是一个词,它们共用了“和”字。
- 真歧义:本身的语法和语义都没有问题, 即便采用人工切分也会产生同样的歧义,只有通过上下文的语义环境才能给出正确的切分结果。例如:对于句子“美国会通过对台售武法案”,既可以切分成“美国/会/通过对台售武法案”,又可以切分成“美/国会/通过对台售武法案”。一般在搜索引擎中,构建索引时和查询时会使用不同的分词算法。常用的方案是,在索引的时候使用细粒度的分词以保证召回,在查询的时候使用粗粒度的分词以保证精度。
- 3、新词:也称未被词典收录的词,该问题的解决依赖于人们对分词技术和汉语语言结构的进一步认识。
NLP基础知识-中文分词词性表
词性编码 | 词性名称 | 注 解 |
---|---|---|
Ag | 形语素 | 形容词性语素。形容词代码为 a,语素代码g前面置以A。 |
a | 形容词 | 取英语形容词 adjective的第1个字母。 |
ad | 副形词 | 直接作状语的形容词。形容词代码 a和副词代码d并在一起。 |
an | 名形词 | 具有名词功能的形容词。形容词代码 a和名词代码n并在一起。 |
b | 区别词 | 取汉字“别”的声母。 |
c | 连词 | 取英语连词 conjunction的第1个字母。 |
dg | 副语素 | 副词性语素。副词代码为 d,语素代码g前面置以D。 |
d | 副词 | 取 adverb的第2个字母,因其第1个字母已用于形容词。 |
e | 叹词 | 取英语叹词 exclamation的第1个字母。 |
f | 方位词 | 取汉字“方”。 |
g | 语素 | 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。 |
h | 前接成分 | 取英语 head的第1个字母。 |
i | 成语 | 取英语成语 idiom的第1个字母。 |
j | 简称略语 | 取汉字“简”的声母。 |
k | 后接成分。 | |
l | 习用语 | 习用语尚未成为成语,有点“临时性”,取“临”的声母。 |
m | 数词 | 取英语 numeral的第3个字母,n,u已有他用。 |
Ng | 名语素 | 名词性语素。名词代码为 n,语素代码g前面置以N。 |
n | 名词 | 取英语名词 noun的第1个字母。 |
nr | 人名 | 名词代码 n和“人(ren)”的声母并在一起。 |
ns | 地名 | 名词代码 n和处所词代码s并在一起。 |
nt | 机构团体 | “团”的声母为 t,名词代码n和t并在一起。 |
nz | 其他专名 | “专”的声母的第 1个字母为z,名词代码n和z并在一起。 |
o | 拟声词 | 取英语拟声词 onomatopoeia的第1个字母。 |
p | 介词 | 取英语介词 prepositional的第1个字母。 |
q | 量词 | 取英语 quantity的第1个字母。 |
r | 代词 | 取英语代词 pronoun的第2个字母,因p已用于介词。 |
s | 处所词 | 取英语 space的第1个字母。 |
tg | 时语素 | 时间词性语素。时间词代码为 t,在语素的代码g前面置以T。 |
t | 时间词 | 取英语 time的第1个字母。 |
u | 助词 | 取英语助词 auxiliary |
vg | 动语素 | 动词性语素。动词代码为 v。在语素的代码g前面置以V。 |
v | 动词 | 取英语动词 verb的第一个字母。 |
vd | 副动词 | 直接作状语的动词。动词和副词的代码并在一起。 |
vn | 名动词 | 指具有名词功能的动词。动词和名词的代码并在一起。 |
w | 标点符号 | |
x | 非语素字 | 非语素字只是一个符号,字母 x通常用于代表未知数、符号。 |
y | 语气词 | 取汉字“语”的声母。 |
z | 状态词 | 取汉字“状”的声母的前一个字母。 |
un | 未知词 | 不可识别词及用户自定义词组。取英文Unkonwn首两个字母。 |
缩略版本可见下表:
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 普通名词 | f | 方位名词 | s | 处所名词 | t | 时间 |
nr | 人名 | ns | 地名 | nt | 机构名 | nw | 作品名 |
nz | 其他专名 | v | 普通动词 | vd | 动副词 | vn | 名动词 |
a | 形容词 | ad | 副形词 | an | 名形词 | d | 副词 |
m | 数量词 | q | 量词 | r | 代词 | p | 介词 |
c | 连词 | u | 助词 | xc | 其他虚词 | w | 标点符号 |
PER | 人名 | LOC | 地名 | ORG | 机构名 | TIME | 时间 |
中文词法分析LAC
Lexical Analysis of Chinese,简称 LAC,是一个联合的词法分析模型,在单个模型中完成中文分词、词性标注、专名识别任务。我们在自建的数据集上对分词、词性标注、专名识别进行整体的评估效果,具体数值见下表
模型 | Precision | Recall | F1-score |
---|---|---|---|
Lexical Analysis | 89.2% | 89.4% | 89.3% |
BERT finetuned | 90.2% | 90.4% | 90.3% |
ERNIE finetuned | 91.7% | 91.7% | 91.7% |
一、数据准备
可通过脚本下载数据集和预训练模型
- 全部下载
python downloads.py all
或者
sh downloads.sh
- 训练数据集 下载数据集文件,解压后会生成
./data/
文件夹
python downloads.py dataset
- 预训练模型 可下载三种模型:baseline、finetuned、ernie
# download baseline model
python downloads.py lac
# download ERNIE finetuned model
python downloads.py finetuned
# download ERNIE model for training
python downloads.py ernie
二、模型评估
我们基于自建的数据集训练了一个词法分析的模型,可以直接用这个模型对测试集 ./data/test.tsv
进行验证
# baseline model
sh run.sh eval
# ERNIE finetuned model
sh run_ernie.sh eval
- 评估结果
baseline model: [test] P: 0.89211, R: 0.89442, F1: 0.89326, elapsed time: 0.955 s
ernie finetuned model: [test] loss: 3.13399, P: 0.91724, R: 0.91663, F1: 0.91694, elapsed time: 598.154 s
三、模型训练
我们可在./data/train.tsv
上进行训练,示例包含程序在单机单卡/多卡,以及CPU多线程的运行设置,若需进行ERNIE Finetune训练,需先行下载ERNIE
开放的模型,通过命令python downloads.py ernie
可完成下载
多机模式不建议在AI Studio下尝试,会崩溃
多机模式不建议在AI Studio下尝试,会崩溃
多机模式不建议在AI Studio下尝试,会崩溃(重要的事说三遍!有条件的可以在自己的本地环境尝试)
# baseline model, using single GPU
sh run.sh train_single_gpu
# baseline model, using multi GPU
sh run.sh train_multi_gpu
# baseline model, using multi CPU
sh run.sh train_multi_cpu
# ERNIE finetuned model
sh run_ernie.sh train
# ERNIE finetuned model, using single GPU
sh run_ernie.sh train_single_gpu
# ERNIE finetuned model, using multi CPU
sh run_ernie.sh train_multi_cpu
四、模型的预测
使用预训练的模型可以对未知的数据进行预测
- 数据集格式
!head LAC/lexical_analysis/data/test.tsv
text_a label 除了他续任十二届政协委员,马化腾,雷军,李彦宏也被推选为新一届全国人大代表或全国政协委员 p-Bp-Ir-Bv-Bv-Im-Bm-Im-IORG-BORG-In-Bn-Iw-BPER-BPER-IPER-Iw-BPER-BPER-Iw-BPER-BPER-IPER-Id-Bp-Bv-Bv-Iv-Ba-Bm-Bm-IORG-BORG-IORG-IORG-In-Bn-Ic-Bn-Bn-IORG-BORG-In-Bn-I 其中,这也和应届生就业市场疲软有关 r-Br-Iw-Br-Bd-Bp-Bn-Bn-In-Iv-Bv-In-Bn-Ia-Ba-Iv-Bv-I 此外,创伤及大面积烧伤,由于严重的失血,脱水,造成血液浓缩,血细胞增多也可增加血液的凝固度 d-Bd-Iw-Bn-Bn-Ic-Bn-Bn-In-Ivn-Bvn-Iw-Bp-Bp-Ia-Ba-Iu-Bvn-Bvn-Iw-Bvn-Bvn-Iw-Bv-Bv-In-Bn-Iv-Bv-Iw-Bn-Bn-In-Iv-Bv-Id-Bv-Bv-Bv-In-Bn-Iu-Bn-Bn-In-I 设计理念精益求精,以合理的价格建造优质放心的工程 vn-Bvn-In-Bn-Iv-Bv-Iv-Iv-Iw-Bp-Ba-Ba-Iu-Bn-Bn-Iv-Bv-Ia-Ba-Iv-Bv-Iu-Bn-Bn-I 负责医疗广告的技术出证 v-Bv-In-Bn-In-Bn-Iu-Bn-Bn-Iv-Bn-B 工作中,细化过程,注重抽查检查,切实抓好常规教学,安全教育,食堂卫生,校外寄宿生管理等工作 n-Bn-If-Bw-Bv-Bv-In-Bn-Iw-Bv-Bv-Ivn-Bvn-Ivn-Bvn-Iw-Bad-Bad-Iv-Bv-In-Bn-Ivn-Bvn-Iw-Ban-Ban-Ivn-Bvn-Iw-Bn-Bn-Ian-Ban-Iw-Bs-Bs-In-Bn-In-Ivn-Bvn-Iu-Bn-Bn-I 七是负责全市机关,事业单位的工资制度改革和工资福利工作 m-Bv-Bv-Bv-In-Bn-In-Bn-Iw-Bn-Bn-In-In-Iu-Bn-Bn-In-Bn-Ivn-Bvn-Ic-Bn-Bn-In-Bn-In-Bn-I 唐婉质问林致远,可林致远却说没什么. PER-BPER-Iv-Bv-IPER-BPER-IPER-Iw-Bc-BPER-BPER-IPER-Iv-Bv-Iv-Br-Br-Iw-B 宋思明喜欢这种十里洋场的明暗交替,醉心这种慵懒的步履 PER-BPER-IPER-Iv-Bv-Ir-Br-In-Bn-In-In-Iu-Bn-Bn-Ivn-Bvn-Iw-Bv-Bv-Ir-Br-Ia-Ba-Iu-Bn-Bn-I
- 预测方法
# baseline model
sh run.sh infer
# ERNIE finetuned model
sh run_ernie.sh infer
- 预测结果
举例说明,全部结果可执行命令后在终端查看
(用户, n)(应, v)(关闭, v)(现在, TIME)(的, u)(led, n)(继承, vn)
(姐姐, n)(我, r)(休息, v)(一下, m)(,, w)(马上, d)(就, d)(煮面, v)
(显然, ad)(,, w)(东风标致308, nz)(也, d)(开始, v)(见证, v)(东风标致, ORG)(品牌, n)(的, u)(崛起, vn)
(可能, v)(是, v)(我, r)(长期, n)(劳累, a)(经常, d)(出汗, v)(所以, c)(下面, f)(长期, n)(比较, d)(潮湿, a)(的, u)(原因, n)
(两人, n)(在, p)(两派, n)(中, f)(都是, v)(地位, n)(不俗, a)(,, w)(如今, TIME)(互相, d)(牵制, v)(,, w)(使得, v)(楚晓燕, PER)(处境, n)(不, d)(至于, d)(太, d)(为难, a)
五、如何使用自己的数据训练
构建自己的数据
第一行是 text_a\tlabel
固定的开头,后面的每行数据都是由两列组成,以制表符分隔,第一列是 utf-8 编码的中文文本,以 \002
分割,第二列是对应每个字的标注,以 \002
分隔。我们采用 IOB2 标注体系,即以 X-B 作为类型为 X 的词的开始,以 X-I 作为类型为 X 的词的持续,以 O 表示不关注的字(实际上,在词性、专名联合标注中,不存在 O )。示例如下:
除\002了\002他\002续\002任\002十\002二\002届\002政\002协\002委\002员\002,\002马\002化\002腾\002,\002雷\002军\002,\002李\002彦\002宏\002也\002被\002推\002选\002为\002新\002一\002届\002全\002国\002人\002大\002代\002表\002或\002全\002国\002政\002协\002委\002员 p-B\002p-I\002r-B\002v-B\002v-I\002m-B\002m-I\002m-I\002ORG-B\002ORG-I\002n-B\002n-I\002w-B\002PER-B\002PER-I\002PER-I\002w-B\002PER-B\002PER-I\002w-B\002PER-B\002PER-I\002PER-I\002d-B\002p-B\002v-B\002v-I\002v-B\002a-B\002m-B\002m-I\002ORG-B\002ORG-I\002ORG-I\002ORG-I\002n-B\002n-I\002c-B\002n-B\002n-I\002ORG-B\002ORG-I\002n-B\002n-I
- 模型依赖数据包括:
- 输入文本的词典,在
conf
目录下,对应word.dic
- 对输入文本中特殊字符进行转换的字典,在
conf
目录下,对应q2b.dic
- 标记标签的词典,在
conf
目录下,对应tag.dic
- 输入文本的词典,在
- 在训练和预测阶段,我们都需要进行原始数据的预处理,具体处理工作包括:
- 从原始数据文件中抽取出句子和标签,构造句子序列和标签序列
- 将句子序列中的特殊字符进行转换
- 依据词典获取词对应的整数索引
代码结构说明
.
├── README.md # 本文档
├── conf/ # 词典及程序默认配置的目录
├── compare.py # 执行LAC与其他开源分词的对比脚本
├── creator.py # 执行创建网络和数据读取器的脚本
├── data/ # 存放数据集的目录
├── downloads.py # 用于下载数据和模型的脚本
├── downloads.sh # 用于下载数据和模型的脚本
├── eval.py # 词法分析评估的脚本
├── inference_model.py # 执行保存inference_model的脚本,用于准备上线部署环境
├── gru-crf-model.png # README 用到的模型图片
├── predict.py # 执行预测功能的脚本
├── reader.py # 文件读取相关函数
├── run_ernie_sequence_labeling.py # 用于 finetune ERNIE 的代码
├── run_ernie.sh # 启用上面代码的脚本
├── train.py # 词法分析训练脚本
├── run.sh # 启用上面代码的脚本
└── utils.py # 常用工具函数
如何组建自己的模型
可以根据自己的需求,组建自定义的模型,具体方法如下所示:
- 定义自己的词法分析模型,可以在
../models/sequence_labeling/nets.py
中添加自己的网络结构,具体接口要求可以参考默认的lex_net
函数。 - 模型训练、评估、预测的逻辑,需要在
run.sh
和run_ernie.sh
中修改对应的模型路径、数据路径和词典路径等参数。