前提:大概手上有一百多万条文本数据以及对应的关键词(包括抽象关键词)。要把其中的抽象关键词过滤掉,这样清洗以后的样本可以用于关键词标注模型。数据太多,想要脚本控制并行处理,需要拆分数据,但数据本身是json格式存储的,没法用split直接拆分。
一. split拆分文件
使用split命令
split --lines 50000 xxx.txt xxx/xxx_
后检查文件夹无任何新文件生成,拆分失败。
二. 安装json解析器jq
jq 可以对json数据进行分片、过滤、映射以及转换。
sudo apt-get install jq
三. jq使用
- 不改变输入,仅将其输出
jq or jq '.'
如果输入是文件:
cat xxx.txt | jq
or
cat xxx.txt | jq '.'
- 取出所有元素
jq ".[]" or jq -c -M ".[]"
- 利用管道以及split对jq解析出的json进行拆分
拆分成小文件,每个文件最大行数为2(-l 2),文件位于temp目录下,前缀为temp_,后缀长度为3(-a 3)
下面这个命令可以达到同样效果
jq -cM --argjson sublen '2' 'range(0; length; $sublen) as $i | .[$i:$i+$sublen]' xxx/xxx.txt | split -l 2 -da 3 - temp/temp_
但无论哪一个命令, 从生成的文件内容来看,
json数组确实被成功按要求拆分了
,但是文件内容里却不是有效的JSON数组格式
- 利用filter过滤将拆分结果转换为json数组
虽然显示在命令行了,但是其实
并没有生成文件
,也就是输出的结果并没有保存到文件中 - List item
失败的尝试
下面的命令执行后失败了,只生成了一个空的文件
使用python时注意
- 情形一
如果文件是json数组格式,那么读取方式为:
with open(file, 'r') as fp:
news = json.load(fp)
for content in news:
for phrase in content:
print(phrase)
- 情形2
由于上述5失败,我还是采取的3的命令,这个时候使用python读取文件就需要注意了,警惕坑点
(如果是入3中输出的格式):
news = open(file, 'r').readlines()
count = len(news)
for i in range(count):
text = json.loads(news[i])
for phrase in text:
print(phrase)
也就是说,如果文件是json数组格式,假设里面的内容是数组的数组,那么json.load进来后for循环就可以正常访问数组以及数组里面的数组。但是第二种情形,需要使用json.loads(news[i])将json字符串转换为List
。