方法参考:python - 降低python for循环的时间复杂度 - 堆栈内存溢出 (stackoom.com)
朋友们,朋友们,事情是这样的。
这几天博主在处理数据的时候遇到了这样的标注数据:
文章编号 | 内容 | 是否是摘要 | |
1 | A1 | 我 | 0 |
2 | A1 | 是xx | 1 |
.... | ...... | ....... | ....... |
100000 | A1044 | 啊哈 | 0 |
如上面这个表格所示,我们这里共计有100000条数据,我需要根据文章编号提取出每篇文章的内容,并且根据每篇文章的摘要标记(0为非摘要,1为是摘要),将摘要从数据中提取出来。每篇文章都有一篇对应的摘要。
于是,我原来的想法是这样的:
1.已知这批数据中共有1044篇文章,那么我上来就是一个for循环,将所有文章编号为A1至A1044的文章挑选出来。
2.然后结合后面的摘要label,分割出每篇文章的内容与摘要。
这样看来是个很简单的任务,好,那么我们只需要进行 1044*100000 ≈ 一亿次 循环就可以得到结果了,是不是很简单?
我真是¥#¥%#¥%#¥%*&(*&(&**&%* (广东粗口)
那么,为了不那么麻烦,我决定使用bool运算减少时间复杂度:
我们要做的事情其实很简单,首先先选择两个条件:
m1 = data['doc_id']+data['para_class'] == id_list[i] m2 = data['abstract_type']==1
第一个条件是检查内容是否属于同一篇文章。
而第二个条件是检查这一内容token是否是摘要。
m1与m2是这一dataframe中每个元素对应于该条件的bool值索引。
那么如何使用这两个条件呢?也很简单:
contents = data['content'][m1].values abstracts = data['content'][(m1 & m2)].values
通过上面两行代码,我们就找到了dataframe中符合条件的值,并存入到了两个不同的列表中。
通过测试,计算的时间复杂度对比原来弱智又粗暴的for循环降低了不止一点。
下面贴上原代码与新代码的对比:
原代码:
import pandas as pd data = pd.read_excel(r'C:\Users\1.xlsx') print(data.head()) id_list = [] #初始化文章id列表 content_list = [] #初始化文章内容列表 abstract_list = [] #初始化摘要内容列表 ''' 接下来的思路是这样的: 先从总的数据中提取出一个id列表; id列表相同的,归到文章内容中 id列表相同,且摘要标记为1的,划到摘要内容中 ''' #首先构造id列表 for i in range(len(data)): if data['doc_id'][i]+data['para_class'][i] not in id_list: id_list.append(data['doc_id'][i]+data['para_class'][i]) for i in range(len(id_list)): #对id列表中的每一个id,我们都去对它构造文章内容,以及摘要内容,大工程,嗯 contents='' abstracts='' for j in range(len(data)): if data['doc_id'][j] == id_list[i]: try: contents += data['content'][j] except: pass if data['abstract_type'][j] == 1: try: abstracts += data['content'][j] except: pass content_list.append(contents) abstract_list.append(abstracts) df = pd.DataFrame({'abstract':abstract_list, 'content':content_list}) df.to_excel('Abstract_to_Article.xlsx', index=False)
改进后的代码:
import pandas as pd data = pd.read_excel(r'C:\Users\c1.xlsx') print(data.head()) id_list = [] #初始化文章id列表 content_list = [] #初始化文章内容列表 abstract_list = [] #初始化摘要内容列表 ''' 接下来的思路是这样的: 先从总的数据中提取出一个id列表; id列表相同的,归到文章内容中 id列表相同,且摘要标记为1的,划到摘要内容中 ''' #首先构造id列表 for i in range(len(data)): if data['doc_id'][i]+data['para_class'][i] not in id_list: id_list.append(data['doc_id'][i]+data['para_class'][i]) for i in range(len(id_list)): #对id列表中的每一个id,我们都去对它构造文章内容,以及摘要内容,大工程,嗯 contents='' abstracts='' for j in range(len(data)): if data['doc_id'][j]+data['para_class'][j] == id_list[i]: try: contents += data['content'][j] except: pass if data['abstract_type'][j] == 1: try: abstracts += data['content'][j] except: pass content_list.append(contents) abstract_list.append(abstracts)
标签:复杂度,摘要,list,dataframe,列表,content,bool,data,id From: https://www.cnblogs.com/LAKan/p/16474888.html