Package: nlp-toolkit
nlp_toolkit中文NLP基础工具箱，包括以下任务：例如文本分类、序列标注等。本仓库复现了一些近几年比较火的nlp论文。所有的代码是基于keras开发的。不到10行代码，你就可以快速训练一个文本分类模型（暂时不支持多标签任务）或序列标注模型，或者可以体验基于名词短语切分的分词器直接安装pipinstallnlp_toolkit# 使用GPUpipinstalltensorflow-gpu,GPUtil手动安装gitclonehttps://github.com/stevewyl/nlp_toolkitcdnlp_toolkit# 只使用CPUpipinstall-rrequirements.txt# 使用GPUpipinstall-rrequirements-gpu.txt# 如果keras_contrib安装失败pipinstallgit+https://www.github.com/keras-team/keras-contrib.git安装错误ImportError: cannot import name 'normalize_data_format'pipinstall-Ukeras使用方法本仓库的框架图：主要由以下几大模块组成：Dataset：处理文本和标签数据为适合模型输入的格式，主要进行的处理操作有清理、分词、index化Model Zoo & Layer：近几年在该任务中常用的模型汇总及一些Keras的自定义层目前支持的自定义层有如下：1D注意力层 🆗2D注意力层 🆗多头注意力层 🆗位置嵌入层 🆗K-max池化层Trainer：定义模型的训练流程，支持bucket序列、自定义callbacks和N折交叉验证bucket序列：通过将相似长度的文本放入同一batch来减小padding的多余计算来实现模型训练的加速，在文本分类任务中，能够对RNN网络提速2倍以上（暂时不支持含有Flatten层的网络）callbacks：通过自定义回调器来控制训练流程，目前预设的回调器有提前终止训练，学习率自动变化，更丰富的评估函数等N折交叉验证：支持交叉验证来考验模型的真实能力Classifier & Sequence Labeler：封装类，支持不同的训练任务Application：目前工具箱内封装了基于jieba的名词短语分词器 Chunk_Segmentor (如需模型文件，可以邮件联系我)简单的用法如下：fromnlp_toolkitimportDataset,Classifier,Labelerimportyamlconfig=yaml.load(open('your_config.yaml'))# 分类任务dataset=Dataset(fname='your_data.txt',task_type='classification',mode='train',config=config)text_classifier=Classifier('multi_head_self_att',dataset)trained_model=text_classifier.train()# 序列标注任务dataset=Dataset(fname='your_data.txt',task_type='sequence_labeling',mode='train',config=config)seq_labeler=Labeler('word_rnn',dataset)trained_model=seq_labeler.train()# 预测（以文本分类为例）dataset=Dataset(fname='your_data.txt',task_type='classification',mode='predict',tran_fname='your_transformer.h5')text_classifier=Classifier('bi_lstm_att',dataset)text_classifier.load(weight_fname='your_model_weights.h5',para_fname='your_model_parameters.json')y_pred=text_classifier.predict(dataset.texts)# chunk分词# 第一次import的时候，会自动下载模型和字典数据# 支持单句和多句文本的输入格式，建议以列表的形式传入分词器# 源代码中已略去相关数据的下载路径，有需要的请邮件联系fromnlp_toolkit.chunk_segmentorimportChunk_Segmentorcutter=Chunk_Segmentor()s='这是一个能够输出名词短语的分词器，欢迎试用！'res=[itemforitemincutter.cut([s]*10000)]# 1080ti上耗时8s# 提供两个版本，accurate为精确版，fast为快速版但召回会降低一些，默认精确版cutter=Chunk_Segmentor(mode='accurate')cutter=Chunk_Segmentor(mode='fast')# 是否输出词性， 默认开启cutter.cut(s,pos=False)# 是否将可切分的名词短语切分，默认关闭cutter.cut(s,cut_all=True)# 输出格式（词列表，词性列表，名词短语集合）[(['这','是','一个','能够','输出','名词_短语','的','分词器',',','欢迎','试用','!'],['r','v','mq','v','vn','np','ude1','np','w','v','v','w'],['分词器','名词_短语'])...]更多使用细节，请阅读examples文件夹中的Jupyter Notebook和chunk_segmentor页面的README数据格式文本分类：每一行预先分好词的文件，每一行的格式如下：__label__标签1 __label__标签2 ... 词 词 ... 词\n例如 “__label__neg 公司 目前 地理 位置 不 太 理想 ， 离 城市 中心 较 远点 。”序列标注：每一行预先分好词的文件，支持两种数据格式，每一行的格式如下：词###标签 [TAB] 词###标签 [TAB] ... \n例如 “目前###O\t公司###O\t地理###B-Chunk\t位置###E-Chunk\t不###O\t太###O\t理想\n”或者 CONLL的标准格式词 [TAB] 标签词 [TAB] 标签...词 [TAB] 标签词 [TAB] 标签...例如：目前\tO公司\tO...地理\tB-Chunk位置\tE-Chunk不\tO太\tO理想\tO标签含义（这里以chunk为例）：O：普通词B-Chunk：表示chunk词的开始I-Chunk：表示chunk词的中间E-Chunk：表示chunk词的结束建议：文本序列以短句为主，针对标注实体的任务，最好保证每行数据中有实体词（即非全O的序列）你可以通过以下方式互相转换两种数据格式：fromnlp_toolkit.utilitiesimportconvert_seq_format# here we convert dataset from conll format to basic formatconvert_seq_format(input_file,output_file,'basic')ps: 具体可查看data文件夹中对应的示例数据预测：不同任务每一行均为预先分好词的文本序列支持简单的自己添加数据的方法dataset=Dataset(task_type='classification',mode='train',config=config)# classificationdataset.add({'text':'我 爱 机器 学习','label':'pos'})# sequence labelingdataset.add({'text':'我 爱 机器 学习','label':'O O B-Chunk E-Chunk'})# after you add all your datadataset.fit()配置文件nlp_toolkit通过配置文件来初始化训练任务train: 表示训练过程中的参数，包括batch大小，epoch数量，训练模式等data: 表示数据预处理的参数，包括最大词数和字符数，是否使用词内部字符序列等embed: 词向量，pre表示是否使用预训练词向量剩下的模块对应不同的模型的超参数具体细节可查看仓库根目录下的两个配置文件注释可视化attention权重可视化# only support model bi_lstm_att currently# first you need to get attention_weights from model predictions# you can find the actual usage in examples/sentiment.ipynbtexts='有 能力 的 人 就 有 很多 机会'fromnlp_toolkitimportvisualizationasvsvs.mk_html(texts,attention_weights)有能力的人就有很多机会实体预测结果可视化fromnlp_toolkitimportvisualizationasvsvs.entity_visualization(dataset.texts,y_pred,output_fname='result.html')acc/loss 曲线可视化# after your have trained one model, you will also get a history object, which contains some loss and metrics infofromnlp_toolkitimportvisualizationasvsvs.plot_loss_acc(history,task='sequence_labeling')其他生成词向量小文件fromnlp_toolkit.utilitiesimportgen_small_embeddinggen_small_embedding(vocab_file,embed_file,output_file)模型文本分类双层双向LSTM + Attention 🆗DeepMoji一文中所采用的的模型框架，本仓库中对attention层作了扩展对应配置文件中的名称：bi_lstm_attTransformer🆗采用Transformer中的多头自注意力层来表征文本信息，详细的细节可阅读此文章对应配置文件中的名称：multi_head_self_attTextCNN🆗CNN网络之于文本分类任务的开山之作，在过去几年中经常被用作baseline，详细的细节可阅读此文章对应配置文件中的名称：text_cnnDPCNN🆗在textCNN的基础上，DPCNN使用残差连接、固定feature map数量和1/2池化层等技巧来实现更丰富的文本表示，详细的细节可阅读此文章对应配置文件中的名称：dpcnn
暂时不支持bucket序列化的数据HAN使用attention机制的文档分类模型序列标注WordRNN🆗Baseline模型，文本序列经过双向LSTM后，由CRF层编码作为输出对应配置文件中的名称：word_rnnCharRNN🆗基于汉语的特点，在字符级别的LSTM信息外，加入偏旁部首，分词，Ngram信息InnerChar🆗基于另外一篇论文，扩展了本文的模型，使用bi-lstm或CNN在词内部的char级别进行信息的抽取，然后与原来的词向量进行concat或attention计算对应配置文件中的名称：word_rnn，并设置配置文件data模块中的inner_char为TrueIDCNN🆗膨胀卷积网络，在保持参数量不变的情况下，增大了卷积核的感受野，详细的细节可阅读此文章对应配置文件中的名称：idcnn性能后续加入对中文NLP的标准数据集的测试文本分类测试数据集：公司优缺点评价，二分类，数据规模：95KModel10-fold_f1Model SizeTime per epochBi-LSTM AttentionTransformer7M12sTextCNN96.5710M19sDPCNN93.359M28sHAN序列标注测试数据集：简历工作经历，chunk，数据规模：58KModel10-fold_f1Model SizeTime per epochBaseline(WordRNN)WordRNN + InnerChar3M165sCharRNN(seg+radical)IDCNN2.7M43sps: 模型大小表示为模型的参数量，其中K表示千，M表示百万；测试设备为1080ti+i7-6800KTo-Do列表加入更多SOTA的模型和自定义层下一版本规划：增加抽象类SentenceV2.0规划：切换为tf.estimator和tf.keras的API感谢数据流模块部分代码借鉴于此：https://github.com/Hironsan/anago/序列标注任务的评估函数来源于此：https://github.com/chakki-works/seqevalbucket序列化代码来自：https://github.com/tbennun/keras-bucketed-sequence多头注意力层和位置嵌入层代码来自：https://github.com/bojone/attention联系方式联系人：王奕磊📧 邮箱：stevewyl@163.com微信：Steve_1125