LAC全称Lexical Analysis of Chinese,是百度自然语言处理部研发的一款联合的词法分析工具,实现中文分词、词性标注、专名识别等功能。该工具具有以下特点与优势:
中文分词 (Word Segmentation) 是将连续的自然语言文本,切分出具有语义合理性和完整性的词汇序列的过程。因为在汉语中,词是承担语义的最基本单位,切词是文本分类、情感分析、信息检索等众多自然语言处理任务的基础。 词性标注(Part-of-speech Tagging)是为自然语言文本中的每一个词汇赋予一个词性的过程,这里的词性包括名词、动词、形容词、副词等等。 命名实体识别(Named Entity Recognition,NER)又称作 “专名识别”,是指识别自然语言文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。 我们将这三个任务统一成一个联合任务,称为词法分析任务,基于深度神经网络,利用海量标注语料进行训练,提供了一个端到端的解决方案。
我们把这个联合的中文词法分析解决方案命名为 LAC 。LAC 既可以认为是 Lexical Analysis of Chinese 的首字母缩写,也可以认为是 LAC Analyzes Chinese 的递归缩写。
在此我们主要介绍Python安装与使用,其他语言使用:
代码兼容Python2/3
全自动安装: pip install lac
半自动下载:先下载http://pypi.python.org/pypi/lac/,解压后运行 python setup.py install
安装完成后可在命令行输入lac
或lac --segonly
,lac --rank
启动服务,进行快速体验。
国内网络可使用百度源安装,安装速率更快:
pip install lac -i https://mirror.baidu.com/pypi/simple
from LAC import LAC # 装载分词模型 lac = LAC(mode='seg') # 单个样本输入,输入为Unicode编码的字符串 text = u"LAC是个优秀的分词工具" seg_result = lac.run(text) # 批量样本输入, 输入为多个句子组成的list,平均速率会更快 texts = [u"LAC是个优秀的分词工具", u"百度是一家高科技公司"] seg_result = lac.run(texts)
【单样本】:seg_result = [LAC, 是, 个, 优秀, 的, 分词, 工具] 【批量样本】:seg_result = [[LAC, 是, 个, 优秀, 的, 分词, 工具], [百度, 是, 一家, 高科技, 公司]]
from LAC import LAC # 装载LAC模型 lac = LAC(mode='lac') # 单个样本输入,输入为Unicode编码的字符串 text = u"LAC是个优秀的分词工具" lac_result = lac.run(text) # 批量样本输入, 输入为多个句子组成的list,平均速率更快 texts = [u"LAC是个优秀的分词工具", u"百度是一家高科技公司"] lac_result = lac.run(texts)
每个句子的输出其切词结果word_list以及对每个单词的标注tags_list,其格式为(word_list, tags_list)
【单样本】: lac_result = ([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n]) 【批量样本】:lac_result = [ ([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n]), ([LAC, 是, 个, 优秀, 的, 分词, 工具], [nz, v, q, a, u, n, n]) ]
词性和专名类别标签集合如下表,其中我们将最常用的4个专名类别标记为大写的形式:
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 普通名词 | f | 方位名词 | s | 处所名词 | nw | 作品名 |
nz | 其他专名 | v | 普通动词 | vd | 动副词 | vn | 名动词 |
a | 形容词 | ad | 副形词 | an | 名形词 | d | 副词 |
m | 数量词 | q | 量词 | r | 代词 | p | 介词 |
c | 连词 | u | 助词 | xc | 其他虚词 | w | 标点符号 |
PER | 人名 | LOC | 地名 | ORG | 机构名 | TIME | 时间 |
from LAC import LAC # 装载词语重要性模型 lac = LAC(mode='rank') # 单个样本输入,输入为Unicode编码的字符串 text = u"LAC是个优秀的分词工具" rank_result = lac.run(text) # 批量样本输入, 输入为多个句子组成的list,平均速率会更快 texts = [u"LAC是个优秀的分词工具", u"百度是一家高科技公司"] rank_result = lac.run(texts)
【单样本】:rank_result = [['LAC', '是', '个', '优秀', '的', '分词', '工具'], [nz, v, q, a, u, n, n],[3, 0, 0, 2, 0, 3, 1]] 【批量样本】:rank_result = [ (['LAC', '是', '个', '优秀', '的', '分词', '工具'], [nz, v, q, a, u, n, n], [3, 0, 0, 2, 0, 3, 1]), (['百度', '是', '一家', '高科技', '公司'], [ORG, v, m, n, n], [3, 0, 2, 3, 1]) ]
词语重要性各类别标签集合如下表,我们使用4-Level梯度进行分类:
标签 | 含义 | 常见于词性 |
---|---|---|
0 | query中表述的冗余词 | p, w, xc ... |
1 | query中限定较弱的词 | r, c, u ... |
2 | query中强限定的词 | n, s, v ... |
3 | query中的核心词 | nz, nw, LOC ... |
在模型输出的基础上,LAC还支持用户配置定制化的切分结果和专名类型输出。当模型预测匹配到词典的中的item时,会用定制化的结果替代原有结果。为了实现更加精确的匹配,我们支持以由多个单词组成的长片段作为一个item。
我们通过装载词典文件的形式实现该功能,词典文件每行表示一个定制化的item,由一个单词或多个连续的单词组成,每个单词后使用'/'表示标签,如果没有'/'标签则会使用模型默认的标签。每个item单词数越多,干预效果会越精准。
词典文件示例
这里仅作为示例,展现各种需求情况下的结果。后续还将开放以通配符配置词典的模式,敬请期待。
春天/SEASON 花/n 开/v 秋天的风 落 阳
from LAC import LAC lac = LAC() # 装载干预词典, sep参数表示词典文件采用的分隔符,为None时默认使用空格或制表符'\t' lac.load_customization('custom.txt', sep=None) # 干预后结果 custom_result = lac.run(u"春天的花开秋天的风以及冬天的落阳")
春天/TIME 的/u 花开/v 秋天/TIME 的/u 风/n 以及/c 冬天/TIME 的/u 落阳/n
春天/SEASON 的/u 花/n 开/v 秋天的风/n 以及/c 冬天/TIME 的/u 落/n 阳/n
我们也提供了增量训练的接口,用户可以使用自己的数据,进行增量训练,首先需要将数据转换为模型输入的格式,并且所有数据文件均为"UTF-8"编码:
数据样例
与大多数开源分词数据集格式一致,使用空格作为单词切分标记,如下所示:
LAC 是 个 优秀 的 分词 工具 。 百度 是 一家 高科技 公司 。 春天 的 花开 秋天 的 风 以及 冬天 的 落阳 。
from LAC import LAC # 选择使用分词模型 lac = LAC(mode = 'seg') # 训练和测试数据集,格式一致 train_file = "./data/seg_train.tsv" test_file = "./data/seg_test.tsv" lac.train(model_save_dir='./my_seg_model/',train_data=train_file, test_data=test_file) # 使用自己训练好的模型 my_lac = LAC(model_path='my_seg_model')
样例数据
在分词数据的基础上,每个单词以“/type”的形式标记其词性或实体类别。值得注意的是,词法分析的训练目前仅支持标签体系与我们一致的数据。后续也会开放支持新的标签体系,敬请期待。
LAC/nz 是/v 个/q 优秀/a 的/u 分词/n 工具/n 。/w 百度/ORG 是/v 一家/m 高科技/n 公司/n 。/w 春天/TIME 的/u 花开/v 秋天/TIME 的/u 风/n 以及/c 冬天/TIME 的/u 落阳/n 。/w
from LAC import LAC # 选择使用默认的词法分析模型 lac = LAC() # 训练和测试数据集,格式一致 train_file = "./data/lac_train.tsv" test_file = "./data/lac_test.tsv" lac.train(model_save_dir='./my_lac_model/',train_data=train_file, test_data=test_file) # 使用自己训练好的模型 my_lac = LAC(model_path='my_lac_model')
. ├── python # Python调用的脚本 ├── c++ # C++调用的代码 ├── java # Java调用的代码 ├── Android # Android调用的示例 ├── README.md # 本文件 └── CMakeList.txt # 编译C++和Java调用的脚本
如果您的学术工作成果中使用了LAC,请您增加下述引用。我们非常欣慰LAC能够对您的学术工作带来帮助。
@article{jiao2018LAC, title={Chinese Lexical Analysis with Deep Bi-GRU-CRF Network}, author={Jiao, Zhenyu and Sun, Shuqi and Sun, Ke}, journal={arXiv preprint arXiv:1807.01882}, year={2018}, url={https://arxiv.org/abs/1807.01882} }
我想等网站访问量多了,在这个位置放个广告。网站纯公益,但是用爱发电服务器也要钱啊 ----------狂奔的小蜗牛