本文主要解决如何将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解析器对一个对象进行了解析。
解析观察结果如下:
- 每个案例ID对应着:一个context(法律文本);一个qa(也就是问题集),其中包含了5个问题;一个domain(文本类型)。
- 每个问题对应:一个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的基础环境,如何关闭呢?
- 通过将auto_activate_base参数设置为false实现(要是反悔了就改成true),即
conda config --set auto_activate_base false
- 如果之后还需要进入base环境,则
conda activate base
问题二:如何在anaconda中安装pandas / matplotlib?
- 首先进入想要安装的那个环境,即
conda activate base
- 执行:
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?
- 查看版本信息,选择自己可以使用的版本。
anaconda search -t conda jieba
- 查看具体版本信息。最后一行会出现安装提示。
anaconda show conda-forge/jieba3k
- 按照上一步的提示,复制粘贴进行安装即可。
conda install --channel https://conda.anaconda.org/conda-forge jieba3k
问题五:想要下载某个github项目的其中一个文件,怎么做?
- 安装一个svn。(mac已经有了,我就直接用啦。下载教程自己找去吧。)
- 转变路径:
我需要的文件路径是这样的https://github.com/fighting41love/funNLP/tree/master/data/法律文本
下的txt文件。
那么需要把/tree/master
修改成/trunk
(我哪知道是为啥,所以最终的路由表示如下:https://github.com/fighting41love/funNLP/trunk/data/法律文本
。 - 终端输入
svn checkout https://github.com/fighting41love/funNLP/trunk/data/法律词库
。稍作等待,即可成功。
报错问题总结
问题:SyntaxError: Non-UTF-8 code starting with '\xe5' in file ...
解决:在py文件的第一行加入 #coding:utf-8
。我想原因应该是定义了中文的文本内容。