本文主要解决如何将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()

结果如下:

c 中数据分析是什么 clc数据分析_c 中数据分析是什么


数据预处理


问题汇总

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

问题及其解决方案

问题一:安装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。我想原因应该是定义了中文的文本内容。