Coder Social home page Coder Social logo

llhthinker / bdci2017-minglue Goto Github PK

View Code? Open in Web Editor NEW
118.0 6.0 38.0 91.28 MB

BDCI2017-让AI当法官,决赛第四(4/415)https://www.datafountain.cn/competitions/277/details

Python 60.55% Jupyter Notebook 39.45%
text-classification deep-learning

bdci2017-minglue's Introduction

BDCI2017-MingLue

代码运行环境说明

  • 操作系统:Ubuntu
  • GPU显存:12G
  • CUDA版本:8.0
  • Python版本:3.5
  • 依赖库:
    • numpy 1.13.3
    • gensim 3.1.0
    • jieba 0.39
    • torch 0.2.0

任务说明

  • Task 1: 罚金等级预测

  • Task 2: 法条预测 ​

基本思路

Architecture

分类器

任务1的罚金等级预测可以看作文本多分类问题,任务2的法条预测可以看作文本多标签分类问题

  • 对于多分类问题,可以使用softmax函数作为分类器,最小化交叉熵(Cross Entropy)
  • 对于多标签分类问题,可以one-versus-all策略,具体地,训练时可以使用pytorch中的MultiLabelSoftMarginLoss函数,预测时可以使用sigmoid函数:
    • 若某个标签对应的sigmoid函数的输出值 > 阈值(如0.5):则该标签加入预测的标签集合,否则不加入。

特征提取

  • 传统方法:n-gram + TFIDF + LDA (在实验阶段尝试过,最后没有使用)
  • 深度学习方法 (基于word2vec):
    1. 将所有词(或词频>阈值的词)组成一个词表,得到word2index字典和index2word字典;
    2. 将词映射为index,并且进行padding,然后通过词对应的index对词向量矩阵进行Lookup,得到当前文本对应的word2vec;
    3. 使用FastTextCNN、RNN、RCNN、HAN等模型在word2vec的基础上进行特征提取。

优化思路

  • 预处理
  • 多模型融合: 预测时,将多个模型的预测值的均值作为最终的预测结果
  • 如何解决不均匀分类问题
    • 调整Loss函数中不同标签样本权重
    • 过采样
    • 欠采样 (未采用)
  • 混合要素模型 (未采用)
  • 混合paragraph vector (未采用)
  • Inception in CNN
  • 卷积层个数:单层 vs. 多层 (未尝试)
  • 全连接层个数:单层 vs. 多层 (未尝试)

代码文件夹说明

  • preprocessor: 存放数据预处理相关的代码

    • builddataset.py: 将文本数据转化为索引数值,用于Task 1
    • buildmultidataset.py: 将文本数据转化为索引数值,用于Task 2
    • segtext.py: 分词
    python ./segtext.py -i [input-file-path] -o [output-file-path]
    
    • shuffledata.py: 将文本按行随机打乱
    python ./shuffledata.py -i [input-file-path] -o [output-file-path]
    
    • trainword2vecmodel.py: 根据训练集[train-file]和测试集[test-file]生成[word2vec-model],用于pretrain
    python ./trainword2vecmodel.py --word2vec-model-path [word2vec-model] --train-file [train-file] --test-file [test-file]
    
  • utils: 存放一些工具类的代码

    • calculatescore.py: 计算得分Micro-Averaged F1(Task 1)和Jaccard(Task 2)
    • statisticdata.py: 对数据进行一些统计分析
    • trainhelper.py: 训练需要的一些函数
    • multitrainhelper.py: Task 2训练需要的一些函数
  • models: 各种DL模型代码

    model_id code_file_name model_name
    0 fasttext.py FastText
    1 textcnn.py TextCNN
    2 textrcnn.py TextRCNN
    3 textrnn.py TextRNN
    4 hierarchical.py/ hierarchical_mask.py HAN
    5 cnnwithdoc2vec.py CNNWithDoc2Vec
    6 rcnnwithdoc2vec.py RCNNWithDoc2Vec
    ... ... ...
  • data: 将数据包装成pytorch中的Dataset

    • mingluedata.py: Task 1
    • mingluemultidata.py: Task 2
  • notebooks: 用jupyter notebook做一些实验

  • 主目录: 存放训练和预测运行代码和相关配置代码

    • train.py: Task 1 训练脚本
    python ./train.py --model-id [model_id] --use-element [y/n] --is-save [y/n]
    
    • multitrain.py: Task 2 训练脚本
    python ./multitrain.py --model-id [model_id] --use-element [y/n] --is-save [y/n]
    
    • predict.py: 预测脚本,载入已有模型进行预测并生成json格式的结果文件
    # 注意model_id要和model_path对应的Model保持一致
    python ./predict.py --task1-model-id [model_id] --task1-model-path [model_path] --task2-model-id [model_id] --task2-model-path [model_path]
    
    • predict_task1.py: task1预测脚本,载入已有task1模型进行预测并生成json格式的结果文件
    # 注意model_id要和model_path对应的Model保持一致
    python ./predict_task1.py --task1-model-id [model_id] --task1-model-path [model_path]
    
    • predict_task2.py: task2预测脚本,载入已有task2模型进行预测并生成json格式的结果文件
    # 注意model_id要和model_path对应的Model保持一致
    python ./predict_task2.py --task2-model-id [model_id] --task2-model-path [model_path]
    
    • mix_predict_task1.py: task1模型融合预测脚本,载入针对task1训练后的RCNN和HAN模型进行融合预测并生成json格式的结果文件
    python ./mix_predict_task1.py --rcnn-model-path [RCNN_model_path]  --han-model-path [HAN_model_path]
    
    • mix_predict_task2.py: task2模型融合预测脚本,载入针对task2训练后的RCNN和HAN模型进行融合预测并生成json格式的结果文件
    python ./mix_predict_task2.py --rcnn-model-path [RCNN_model_path]  --han-model-path [HAN_model_path]
    
    • config.py: 配置文件,其中Config类对应Task 1, MultiConfig类对应Task 2

数据文件夹说明

  • corpus: 存放训练数据和测试数据
  • pickles: 存放pickle类型数据,包括:
    • index2word.[*.]pkl
    • word2index.[*.]pkl
    • 保存的模型数据:
      • *.[model_name]表示Task 1的模型文件, 如params.pkl.1511507513.TextCNN
      • *.multi.[model_name]表示Task 2的模型文件,如params.pkl.1511514902.multi.TextCNN
    • ...
  • word2vec: 存放pre-train word embedding相关数据
  • results: 存放预测结果文件(json)

bdci2017-minglue's People

Contributors

llhthinker avatar psubnwell avatar szxspark avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

bdci2017-minglue's Issues

请教个问题

请问DataLoader加载数据后,data和labels都变成了tensor类型的数据,在遍历data和labels时获取不到具体的值,请问怎么解决呢?
image

请问Micro-Averaged-F1, Macro-Averaged-F1怎么分析

hi
对于多分类,这两个概念不是很懂。

宏平均F1平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均F1平等考虑文档集中的每一个文档,所以它的值受到常见类别的影响比较大。

假如数据是不平衡的。
如果Micro-Averaged-F1=0.94,Macro-Averaged-F1=0.96,

可不可以理解:因为数据不平衡,导致Macro-Averaged-F1的值较大?
谢谢。

求指教

楼主你好,我对您的这个project非常感兴趣,也关注到了您是参加那个“让AI当法官”的比赛,对于您的方案,我非常渴望跟您交流,得到指教一二,不知道您方便不?

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.