在做一个专业领域的文本探索工程的时候,需要将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格式暂存中间结果,要快得多!多!多!