文本预处理——压缩去词
(1)机械压缩去词的思想
由于文本评论数据质量高低不一,无用的文本数据很多,所以文本去重就可以删掉许多的没意义的评论。但经过文本去重后的评论仍然有很多评论需要处理,比如:“好好好好好好好好好好好”,这种存在连续重复的语句,也是比较常见的无意义文本。这一类语句是需要删除的,但计算机不能自动识别出所有这种类型的语句,若不处理,可能会影响评论情感倾向的判断。因此,需要对语料进行机械压缩去词处理,也就是说要去掉一些连续重复的表达,比如把:“不错不错不错”缩成“不错”。这样不考虑其语义,单纯从句子结构去重,因此称为机械压缩去词。这样处理后依然存在无意义文本,在进行下一步短句删除时进行删除。
(2)机械压缩去词处理的语句结构
机械压缩去词要处理的是语料中有连续重复的部分,一般人制造无意义的连续重复只会在开头或者结尾进行,比如:“好好好好好好好好好好好好好好一下买了三台,2999送了一台,不错”以及“非常满意,好好好好好好好好好好好好好好好好好好好好好好好”等等,而中间的连续重复虽然也有,但是非常少见,而且中间容易有成语的问题,因此只对开头连续重复进行机械压缩去词的处理。
(3)压缩去词流程
文本预处理中,机械压缩去词处理过程的连续累赘重复的判断及压缩规则的阐述:
去词的判断可通过建立两个存放字符的列表来完成,并按照不同情况,将其放入list1或list2列表或触发压缩判断,若得出重复则压缩去除,这样当然就要有相关的放置判断及压缩规则。判断连续重复,以及设定压缩规则的时候,应要考虑到词法结构的问题,综合文字表达特点,设定如下规则:
①如果读入的当前字符与list1的首字符相同,而list2没有放入的国际字符,则将这个字符放入list2中。
解释:因为一般情况下同一个字再次出现时意味着上一个词或是一个语段的结束以及下一个词或下一个语段的开始。
②如果读入的当前字符与list1的首字符相同,而list2也有国际字符,则触发压缩判断,若得出重复,则进行压缩去除,清空第二个列表。
解释:判断连续重复最直接的方法。
③如果读入的当前字符与list1的首字符相同,而list2也有国际字符,则触发压缩判断,若得出不重复,则清空两个列表,把读入的这个字符放入list1第一个位置。
解释:即判断得出两个词是不相同的,都应保留。
④如果读入的当前字符与list1的首字符不相同,触发压缩判断,如果得出重复,且列表所含国际字符数目大于等于 2,则进行压缩去除,清空两个列表,把读入的这个字符放入list1第一个位置。
解释:避免类如“滔滔不绝”这种情况的‘滔’被删除,并可顺带压缩去除另一类连续重复,如:“很满意,很满意,效果好。”。
⑤如果读入的当前字符与list1的首字符不相同,触发压缩判断,若得出不重复,且list2没有放入国际字符,则继续在list1放入国际字符。
解释:没出现重复字就不会有连续重复语料,list2未启用则继续填入list1,直至出现重复情况为止。
⑥如果读入的当前字符与list1的首字符不相同,触发压缩判断,若得出不重复,且list2已放入国际字符,则继续在list2放入国际字符。
⑦读完所有国际字符后,触发压缩判断,对list1以及list2有意义部分进行比较,若得出重复,则进行压缩去除。
解释:由于按照上述规则,在读完所有国际字符后不会再触发压缩判断条件,故为了避免“不错不错”这种情况,补充这一规则。
#-*- coding: utf-8 -*- import codecs inputfile = 'H_KJ300F-JAC2101W_process_1.txt' #评论文件 outputfile = 'H_KJ300F-JAC2101W_process_2.txt' #评论处理后保存路径 f = codecs.open(inputfile ,'r','utf-8') f1=codecs.open(outputfile,'w','utf-8') fileList = f.readlines() f.close() for A_string in fileList: temp1= A_string.strip('\n') #去掉每行最后的换行符'\n' temp2 = temp1.lstrip('\ufeff') temp3= temp2.strip('\r') char_list=list( temp3) list1=[''] list2=[''] del1=[] flag=[''] i=0 while(i<len(char_list)): if (char_list[i]==list1[0]): if (list2==['']): list2[0]=char_list[i] else: if (list1==list2): t=len(list1) m=0 while(m<t): del1.append( i-m-1) m=m+1 list2=[''] list2[0]=char_list[i] else: list1=[''] list2=[''] flag=[''] list1[0]=char_list[i] flag[0]=i else: if (list1==list2)and(list1!=[''])and(list2!=['']): if len(list1)>=2: t=len(list1) m=0 while(m<t): del1.append( i-m-1) m=m+1 list1=[''] list2=[''] list1[0]=char_list[i] flag[0]=i else: if(list2==['']): if(list1==['']): list1[0]=char_list[i] flag[0]=i else: list1.append(char_list[i]) flag.append(i) else: list2.append(char_list[i]) i=i+1 if(i==len(char_list)): if(list1==list2): t=len(list1) m=0 while(m<t): del1.append( i-m-1) m=m+1 m=0 while(m<t): del1.append(flag[m]) m=m+1 a=sorted(del1) t=len(a)-1 while (t>=0): #print(char_list[a[t]]) del char_list[a[t]] t=t-1 str1 = "".join(char_list) str2=str1.strip() #删除两边空格 f1.writelines(str2+'\r\n') f1.close()
存在问题:实现部分重复前缀的删除,无法删除后缀重复。