Python格式化解析不规则txt文本并转为dataframe

很多时候我们拿到的文本文件都是格式不规范的,甚至是相当不规范的。。所以我们想要把不规范的文本文件变成规范的表格式,便于后续的模型训练和分析,在本篇文章中,主要的难点是从文本文件提取key-value的工作。

Step-0:数据示例

比如我们需要把如下数据中的key和value分别提取出来,并将相同key的值放在一列:

qid=157238221 isAdopted=1 qTags= qTime=2010-06-03 19:47 giveScore=200 askerid=188349317 askerGrade=5 askerGoodRate=48 askerAnswerNumber=44 askerName=cribberbd aid=467956656 isBest=1 ahasComment=0 aTime=2010-06-04 16:54 aCon=参看:a href="http:baike.baidu.comview1678662.htm?fr=ala0_1_1" target="_blank"http:baike.baidu.comview1678662.htm?fr=ala0_1_1a answerid=169837710 answerName= answerCareField= answerGrade= answerGoodRate= answerNum= answerIsMaster= answerIsFamous= aid=467569408 isBest= ahasComment=0 aTime=2010-06-03 20:09 aCon= will always love you下载地址a href="http:mp3.baidu.comm?f=ms&rn=&tn=baidump3&ct=134217728&word=I+will+always+love+you&lm=-1" target="_blank"http:mp3.baidu.comm?f=ms&rn=&tn=baidump3&ct=134217728&word=I+will+always+love+you&lm=-1a answerid=129235439 answerName=唯念潇湘 answerCareField= answerGrade=5 answerGoodRate=40 answerNum=46 answerIsMaster=0 answerIsFamous=0 aid=467584335 isBest= ahasComment=0 aTime=2010-06-03 20:35 aCon=是i will always love you= = answerid=12422236 answerName=qizi86 answerCareField=电视" answerGrade=18 answerGoodRate=36 answerNum=13266 answerIsMaster=0 answerIsFamous=0 aid=467849272 isBest= ahasComment=0 aTime=2010-06-04 13:17 aCon=长风镖局》 answerid=194560318 answerName=水滴里的火花 answerCareField= answerGrade=2 answerGoodRate=19 answerNum=5 answerIsMaster=0 answerIsFamous=0 aid=470025197 isBest= ahasComment=0 aTime=2010-06-08 17:27 aCon=长风镖局》 answerid=192636431 answerName=346317740 answerCareField=校园生活 answerGrade=5 answerGoodRate=14 answerNum=17 answerIsMaster=0 answerIsFamous=0

Step-1:数据载入:

没什么可说的,直接with open,需要注意的是原始文档当中有特殊字符,因此需要加上忽略错误with open(filename,encoding='utf-8',errors='ignore') as f:

另外由于原始文件特别大,为了避免内存直接爆掉,采用了循环逐行读取的f.readline()。

Step-2:格式化:

进入重头戏格式化,分析数据发现不同的keyvalue对是用空格分割的,但是许多内容中本身就有空格。。。坑爹啊这不是。。。看来直接用空格分割不靠谱。。。

后来尝试了分割成list,用list组成dataframe,不过分完才发现,每条记录的key个数并不相同,所以这样做也会出问题。

最后发现key、value之间是用=号分割的,因此采用正则来提取pattern,但是提取出来才发现,许多文本中也含有“=”这个特殊字符,做到这我已经想不出别的招来了= =,所以决定给“=”前后正则加上限制,只有大小写英文小写开头小写结束(分析不完整的参数key字典发现的规则)的才勉强算是正常的key,后面通过key传非空的比例来决定key的取舍,异常的key的值空率放在大样本上应该是接近百分百的。。

最后话不多说,放代码吧:

def load_data(filename,n):

    with open(filename,encoding='utf-8',errors='ignore') as f:

    #f=open('QACorpusData',encoding='utf-8',errors='ignore')

        #确定正则匹配模式

        pattern= re.compile(r'[a-z]{1,}[a-zA-Z]{1,}[a-z]{1,}=[^=]{0,} |[a-z]{1,}[a-zA-Z]{1,}[a-z]{1,}=[^=]{0,}')

        #循环文件中每一行

        kv_data_Q=[]

        kv_data_A=[]

        #for each_line in f:

        for k in range(0,n):

            #将Question和Answer分开分别建表

            each_line= f.readline()

            line=each_line.strip().split('\t')

            for i in range(0,len(line)):

                ss=pattern.findall(line[i])

                #print(ss)

                #print(len(ss))

                data=[]

                #取出key-value并分割

                for i in ss:

                    tmp=i.strip().split('=')

                    data.append(tmp)

                #转换为dict类型

                data_dict=dict(data)

                #增加Q&A分类

                if 'qid' in data_dict.keys():

                    #data_dict['type']='Q'

                    qid=data_dict['qid']

                    #append到Qusetion表

                    kv_data_Q.append(data_dict)

                else:

                    data_dict['qid']=qid

                    #data_dict['type']='A'

                    kv_data_A.append(data_dict)

                    #append到Answer表

        df_Q=pd.DataFrame.from_dict(kv_data_Q)

        df_A=pd.DataFrame.from_dict(kv_data_A)

        return df_Q,df_A

    #f.close()

Step-3:去除误识别:

通过列的空值比例去除误识别,代码如下:

#考察各列的空值个数

def empty_count(df):

    n=len(df)#数据集记录数

    empty_cnt = pd.DataFrame(columns=['columns_name', 'normal', 'null','empty'])

    for c in df.columns:

        n_cnt=sum(df[c].isnull())#判断是否为NaN

        e_cnt=sum(df[c].apply(lambda x: True if x ==''  else False))#判断是否为空字符

        empty_cnt=empty_cnt.append({'columns_name':c,'normal':(n-n_cnt-e_cnt)/n,'null':n_cnt/n,'empty':e_cnt/n},ignore_index=True)

    return empty_cnt

    #print(empty_cnt)

#删除异常的列   

def del_cols(df):

    df_ec=empty_count(df)

    for col in df_ec[df_ec.null>=0.9].columns_name:

        df.drop(col,axis=1,inplace=True)

for df_deal in [df_Q_Cheat,df_A_Cheat,df_Q_Normal,df_A_Normal]:

    del_cols(df_deal)

    print(df_deal,'check!')


空值判断效果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,027评论 0 2
  • 南院花开阅读 272评论 0 1
  • 明天就要回扬州了,妹妹非要缠着我们玩捉迷藏,没办法我只好再陪她玩一次捉迷藏,都快十二点了,她还玩的正高兴,在阿姨训...
    车在州阅读 577评论 0 2