zoukankan      html  css  js  c++  java
  • [ MRC入门 ] CAIL2019阅读理解之 —— 分析&数据预处理

    本文主要解决如何将CAIL2019阅读理解数据json文件,并对数据内容进行基础分析,然后进行分词等操作。

    数据预处理

    首先引入需要的库吧,以后一定会用到的。

    import torch
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    

    读取文件并分析

    看了很多获胜者的分享,第一步无非都是要先看看数据集的规模,有哪些可能的特征。
    因此我的第一步是读取文件内容,并进行简单的数据分析。

    文件读取

    本小节进行json文件数据读取,然后看看有几个案例。

    
    f = open("../Dataset/small_train_data.json", encoding='utf-8')
    #设置以utf-8解码模式读取文件,encoding参数必须设置,否则默认以gbk模式读取文件,当文件中包含中文时,会报错
    dataset = json.load(f)['data'] #要不要data是看数据集的json格式
    size = len(dataset) #2000
    
    

    现在我们知道,该数据集有2000个法律文本。然后我是使用了json解析器对一个对象进行了解析。
    解析观察结果如下:

    1. 每个案例ID对应着:一个context(法律文本);一个qa(也就是问题集),其中包含了5个问题;一个domain(文本类型)。
    2. 每个问题对应:一个answer(答案的起始位置和具体内容);一个is_impossible(是否可回答),由于有些问题的答案是不能在文中定位找到的,因此会被归类为是不可回答问题,那么它的值就是true的;一个question(具体问题)。

    转换

    由于读取出来的数据集还是json格式的,因此,经过上面的分析之后,我们需要对每个对象进行格式转换成dict,方便之后的处理。
    (本人python技术比较菜,如果有更简便的方法或者哪个地方我错了,欢迎留言,我会改正的,谢谢!)

    变量定义

    '''
    从结构体中分离出: domain context qas 它们在序列上一一对应
    context: 案例内容
    qas: 包含了五个小问题
    domain: 案件类型
    '''
    domain, context, qas = [], [], [] #案件类型,文本内容,问题集合
    context_len, answers_len, question_len, answer_type = [], [], [], [] #各类型文本的长度,及答案的类型
    

    循环读取数据。

    接下来需要对案件类型、案例长度、问题长度、答案类型等做个观察统计,看看文本长短和分布等。

    for item in dataset:
        domain.append(item['domain'])
        paragraphs = item['paragraphs'][0]
        text = paragraphs['context']
        qa = paragraphs['qas']
    
        context_len.append(len(text))
        for q in qa:
            question_len.append(len(q['question']))
            if(q['is_impossible'] == 'false'):
                answers_len.append(len(q['answers'][0]['text']))
                if(q['answers'][0]['text'] == 'YES'):
                    answer_type.append('YES')
                elif(q['answers'][0]['text'] == 'NO'):
                    answer_type.append('NO')
                else:
                    answer_type.append('ELSE')
            else:
                answer_type.append('FALSE')
    
        context.append(text)
        qas.append(qa)
    
    

    这样我们就将各类型数据分类了,并且按顺序一一对应。


    统计元素

    元素个数和种类统计

    这步骤中,实现用Python统计一个列表的元素种类和各个种类的个数。

    #实在对不起 这段俗不可耐的代码
    count_domain = collections.Counter(domain) #Counter({'civil': 1000, 'criminal': 1000})
    count_answer_type = collections.Counter(answer_type) #Counter({'ELSE': 8249, 'YES': 901, 'FALSE': 492, 'N': 358})
    
    

    发现案例的种类是对半分的。其次,是否类问题和是否可回答类类型的问题也都统计出来了。

    查看文本的最大最小长度

    使用max(list)和min(list),查看最大最小的文本长度分别是多少。

    print(min(question_len), max(question_len)) # 4, 114
    #问题和案例长度分别为(1, 427) 和 (151, 1000)
    

    图表显示

    只要做一张问题分布图就好啦,其他的暂时不做了。如果之后有需要的话会再补上的。

    answer_data = list(count_answer_type.values())
    answer_names = list(count_answer_type.keys())
    plt.style.use('fivethirtyeight')
    fig, ax = plt.subplots()
    ax.barh(answer_names, answer_data)
    
    # plt.show()
    

    结果如下:


    数据预处理


    问题汇总

    每次都是等到正式开始的时候才发现这么多小问题没有解决,而且为什么啥工具都没装。

    问题及其解决方案

    问题一:安装conda后,每次启动中断都会自动激活conda的基础环境,如何关闭呢?

    1. 通过将auto_activate_base参数设置为false实现(要是反悔了就改成true),即
      conda config --set auto_activate_base false
    2. 如果之后还需要进入base环境,则
      conda activate base

    问题二:如何在anaconda中安装pandas / matplotlib?

    1. 首先进入想要安装的那个环境,即
      conda activate base
    2. 执行:pip install -i https://pypi.douban.com/simple pandas / pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib

    问题三:如何计算dict中value最大或最小的key,以及前k大的key。

    # c is dict.
    c_most = c.most_common(3) #取前三
    max_key = max(c, key=(lambda x : c[x])) #此时是取最大,如果是最小,max->min。 取的是key
    max_value = max(c, key=(lambda x : x)) #取次数
    

    问题四:如何用conda安装jieba?

    1. 查看版本信息,选择自己可以使用的版本。
      anaconda search -t conda jieba
    2. 查看具体版本信息。最后一行会出现安装提示。
      anaconda show conda-forge/jieba3k
    3. 按照上一步的提示,复制粘贴进行安装即可。
      conda install --channel https://conda.anaconda.org/conda-forge jieba3k

    问题五:想要下载某个github项目的其中一个文件,怎么做?

    1. 安装一个svn。(mac已经有了,我就直接用啦。下载教程自己找去吧。)
    2. 转变路径:
      我需要的文件路径是这样的https://github.com/fighting41love/funNLP/tree/master/data/法律文本 下的txt文件。
      那么需要把/tree/master修改成/trunk(我哪知道是为啥,所以最终的路由表示如下:
      https://github.com/fighting41love/funNLP/trunk/data/法律文本
    3. 终端输入svn checkout https://github.com/fighting41love/funNLP/trunk/data/法律词库。稍作等待,即可成功。

    报错问题总结

    问题SyntaxError: Non-UTF-8 code starting with 'xe5' in file ...
    解决:在py文件的第一行加入 #coding:utf-8。我想原因应该是定义了中文的文本内容。

  • 相关阅读:
    【Unity与Android】02-在Unity导出的Android工程中接入Google AdMob广告
    【Unity与Android】01-Unity与Android交互通信的简易实现
    Unity3D热更新之LuaFramework篇[10]--总结篇
    Unity3D热更新之LuaFramework篇[09]--资源热更新与代码热更新的具体实现
    Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建
    Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本
    Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的
    Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
    Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法
    Unity3d之-使用BMFont制作美术字体
  • 原文地址:https://www.cnblogs.com/recoverableTi/p/12467661.html
Copyright © 2011-2022 走看看