22万行文本的短语分割结果应保存为Json还是Txt?

在做一个专业领域的文本探索工程的时候,需要将22万行的原始文本的短语分割结果暂时保存为txt,后续探索步骤装载这个txt继续研究。

短语分割结果中的每个短语有两个属性,一是短语文本,二是该短语的基础属性,如中文、括号内容、非中文,用二维list存储结果会是这样:['电缆', 'ch'], ['ZA-YJV-4*185', 'nonch']

也可以用dict存储为如下的结果:

[{
    'phrase': '电缆',
    'type': 'ch'
},{
    'phrase': 'ZA-YJV-4*185',
    'type': 'nonch'
}]

那么问题来了,是以多维list的方式存储结果,并写入到txt文件中,还是以dict方式存储结果,并写入到json文件中呢?

以dict方式存储并写入到json,最大的好处是后续步骤的代码可以用json.load()直接将txt结果文件解析并装载进来。代码是很清晰简单的:

#构造文本的短语分割结果的dict结构
text_obj = {'org':[[text, 'normal']], 'phrase':[]}

#首先根据 括号 将文本 分割
text_obj['phrase'] = split_texts_by_bracket(text_obj['org'], brack_text_min_len=2)
text_obj['phrase'] = split_texts_by_ch(text_obj['phrase'])

。。。对22万行文本执行以上处理,得到22万个text_obj的list。。。

with open(file_name,'w') as file_obj:
    json.dump(text_obj_list, file_obj, indent=1)

结果。。。。。整个保存为json文件的过程非常慢!!! 大约有10秒钟左右。

而且最为悲催的是,这个json文件用sublime打开的话,也很慢!慢!慢!如果需要对结果进行查询分析,这个慢是不可忍受的。


于是尝试将结果以多维list的方式保存到txt文件中。保存的速度飞快,秒级完成!!!

text_list = [[text, 'normal']]

text_list = split_texts_by_bracket(text_list, brack_text_min_len=2)
text_list = split_texts_by_ch(text_list)

text_list = [[text, 'org']] + text_list

...对22万行文本进行以上处理,得到一个多维list,最外层有22万个item...

txtFile = open( file_name, 'w', encoding='utf-8' )  #a模式为追加
print( "%s"%(val), file=txtFile )

txt结果文件用sublime打开也是非常的快,文本查找分析很流畅

[['教学楼消防动力配电箱JXFAPE', 'org'], ['教学楼消防动力配电箱', 'ch'], ['JXFAPE', 'nonch']]
[['HDPE 雨水管 DN100', 'org'], ['HDPE', 'nonch'], ['雨水管', 'ch'], ['DN100', 'nonch']]
[['法国冬青', 'org'], ['法国冬青', 'ch']]
[['高压熔断器', 'org'], ['高压熔断器', 'ch']]
[['C25 块片石混凝土', 'org'], ['C25', 'nonch'], ['块片石混凝土', 'ch']]

唯一麻烦的是,这样格式的txt解析还原为多维list,需要自己写一段代码来完成:

with open( file_name, 'r', encoding='UTF-8') as load_f:
    text_list = [x.strip() for x in load_f.readlines()]
    
#提取第一层[]里的内容,贪婪模式
new_list = [re.findall(r'\[(.*)\]', x)[0] for x in txt_list]

def extract_l2(x):
    #提取 每一对[]里的内容
    L2 = re.findall(r'\[(.*?)\]', x)
    #去除首尾的 引号
    L2 = [x.strip('\'\"') for x in L2]
    #分割文本 为 元素
    L2 = [re.split(r'[\'\"], [\'\"]', x) for x in L2]
    return(L2)

new_list = list(map(extract_l2, new_list))

最后的结论是 应选择保存为txt文件,自己写txt读取的解析代码,无论是保存还是读取,都要比直接用json格式暂存中间结果,要快得多!多!多!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值