Git Product home page Git Product logo

text_annotation's Introduction

Text_Annotation


文本标注

项目介绍

上次研究了一下文本生成,刚好工作上有实体识别的业务需求,就研究了一下文本标注。
特征抽取部分的代码和文本生成没太大区别,LSTM改成了双向,最后一层的逐帧Softmax改成CRF而已。
参考了几篇博文的分析:《CRF序列标注模型几个问题的理解》、《使用RNN解决NLP中序列标注问题的通用优化思路》,在此表示感谢!

模块简介

模块结构

结构很简单,方法在Text_Annotation文件夹内,还有三个简单的demo,分别是分词、词性标注和关系抽取。Text_Annotation文件夹包括:

数据:data文件夹中
小黄鸡聊天记录(导入数据load_chat.py,我上传了部分,完整版来源https://github.com/fateleak/dgk_lost_conv,在此表示感谢!)
若干篇法律法规word文档(导入数据load_docx.py)
创建实体关系(假设只有相邻的名词和动词存在关系,creat_relation.py)

预处理:Data_process.py是个方法,用于载入数据、分词、编码、填充

网络:net文件夹
双向LSTM+CRF,model_crf.py
双向LSTM+Softmax,model_Softmax.py
关系分类器SVM/Logostic/Dense,model_relation.py

训练:train文件夹
实体识别,train_annotation.py
关系抽取,train_relation.py

标注:annotate文件夹
location.py,实体定位、筛选、配对
annotate.py,句向量、实体识别

范例:demo文件夹
annotate_cut.py,用于分词
annotate_pos.py,词性标注
demo_creat_relation.py创建实体对关系数据
demo_creat_relation_mp.py多进程创建实体对关系数据(进程多了会报sess不能创建的错误)
data文件夹,存放自己生成的用于训练关系抽取的数据


一些说明

1.不同于LSTM文本生成,CRF要求数据reshape回[batchsize, max_seq_len, num_tags],所以生成的时候务必保证网络的shape和输入文本的shape一致。

2.分词的话相对标注简单一些,只要BMES基本就够了,实体识别的话标注会复杂一些,每个实体类别的都有BME,例如名词N的标注为NB/NM/NE/NS。测试集如果和训练集存在较大的差异,包括专业领域、句法结构等,训练次数越多效果会越差,可以理解为过拟合严重;反之,则训练的越充分,效果越好,可以理解为完全学会了训练集的标注方法。由于没有标签数据,我用jieba对小黄鸡语料库先分词,转成BMES标签后训练,对于法律领域的分词效果惨不忍睹。用jieba对法律文档做了词性标注,训练名词(n)和动词(v),网上找了一段法律陈述,效果一般。

3.编码过程使用了keras的Tokenizer,他的num_words是包含0的,也就是保留春词语数量实际是num_words-1。不同于分类和生成,标注要注意数据不能在Tokenizer的时候删掉低频词。所以我并没有使用texts_to_sequences,而是手动把排名超过num_words和不在语料库的字编码转为num_words。

4.有时间我会尝试一下逐帧Softmax的效果,理论上每个词的输出是结合了上下文语义,而且从唐诗生成的效果看是完全可以学到上下文的。
抽空完成了用逐帧Softmax做标注,分词倾向于单个字,词性标注会出现嵌套的情况,效果的确要比CRF差一些。

5.一个句子可能对应多个关系,实体配对也依赖一些外部的规则,好像没办法在一个网络同时实现实体识别和关系抽取。分开做的话,关系抽取就必须先用实体识别的网络计算词向量,效率会很低。

6.创建实体对标注数据以及批量处理的时候,由于标注函数最初只为了演示,会反复的载入sess参数并且只处理一条文本,所以速度有点慢。本来想用多进程的(demo_creat_relation_mp.py),但是会报Failed to create session这个错误,不知道什么原因。实际应用中预测多条的时候,可能要进一步优化。另外keras和tensorflow同时使用,必须先运行一下keras的模型,否则keras无法创建计算图。

结果展示

先要train.py进行训练,这时会保存网络参数和预处理参数,annotate.py会导入这些参数用于预测(分词),参考demo.py

CRF的效果

1.语料库中闲聊语句的词汇和句法基本都出现了,效果还可以。



2.语料库中字基本都出现了,但词汇频率很低,句法结构也相差较大,效果一般。



3.语料库中字很多没出现,句法结构基本不同,效果很差,训练次数越多越不准确,会倾向于按照语料库的句法结构去分。



4.针对名词、动词的标注,效果还可以。



5.最终版本:实体识别+关系抽取



Softmax的效果

1.分词倾向于逐个字切分,勉强能看。



2.针对名词、动词的标注,效果低于CRF,勉强能看。



text_annotation's People

Contributors

renjunxiang avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.