(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()
存在問題:實現部分重復前綴的刪除,無法刪除后綴重復。
