文本數(shù)據(jù)清洗
※本文是關(guān)于英文文本處理,有些技巧在中文中用不到雷则。
入手的數(shù)據(jù)就是格式化表格的時(shí)代已經(jīng)一去不復(fù)返了仰楚。曾經(jīng)有一段寂靜的時(shí)光抗蠢,數(shù)據(jù)是安居與表格中的褒繁。今天80%的數(shù)據(jù)是非結(jié)構(gòu)化的——或者存在于數(shù)據(jù)倉(cāng)庫(kù)里亦鳞,或者分散在不同的存儲(chǔ)設(shè)備中。數(shù)據(jù)就像我們說(shuō)話一樣棒坏,一直在產(chǎn)生——從社交媒體中我們進(jìn)行的每次對(duì)話蚜迅,到從新數(shù)據(jù)源生成的每個(gè)內(nèi)容。為了對(duì)數(shù)據(jù)的意義有個(gè)深入的理解俊抵,進(jìn)而能對(duì)數(shù)據(jù)進(jìn)行一定程度的處理,很重要的一點(diǎn)就是要知道如何處理數(shù)據(jù)的非結(jié)構(gòu)化形式坐梯。作為來(lái)自一個(gè)正在飛速增長(zhǎng)的決策科學(xué)公司的數(shù)據(jù)科學(xué)家徽诲,我的面包和黃油都是來(lái)自于對(duì)非結(jié)構(gòu)化文本信息的整理,以及進(jìn)一步形成的理解吵血。
處理文本數(shù)據(jù)的第一步就是前處理谎替。在數(shù)據(jù)用于分析之前,這是比較基本的一步蹋辅∏幔可資利用的文本數(shù)據(jù)的絕大多數(shù)都是高度非結(jié)構(gòu)化,本質(zhì)上充滿噪聲侦另。為了獲得更好的理解秩命,或者構(gòu)建更好的算法尉共,使用干凈的數(shù)據(jù)才是根本。例如弃锐,社交媒體數(shù)據(jù)都是高度非結(jié)構(gòu)化的——因?yàn)檫@里交流都是非正式交流——錯(cuò)字袄友,語(yǔ)法錯(cuò)誤,俚語(yǔ)霹菊,新出的網(wǎng)絡(luò)用語(yǔ)剧蚣,并且夾雜著像URL這樣我們并不想要的內(nèi)容等。停止詞旋廷,表達(dá)式等都是我們的敵人鸠按。
在本文中,我們討論的都是可能的噪聲因素饶碘,以及如何一步步清理它們目尖。我會(huì)詳細(xì)說(shuō)明一下用python清洗數(shù)據(jù)的方法。
作為典型的商業(yè)問(wèn)題熊镣,假設(shè)你對(duì)尋找商品感興趣卑雁, 目標(biāo):在粉絲中iphone最受歡迎的特征是哪個(gè)。你已經(jīng)抽出了跟iphone相關(guān)的客戶意見绪囱,這里是你的爬蟲爬到的推文:
I luv my <3 iphone & you’re awsm apple. DisplayIsAwesome, sooo happppppy http://www.apple.com”
數(shù)據(jù)清洗步驟:
這里是你想要的:
1. HTML字符轉(zhuǎn)換
從網(wǎng)頁(yè)得到的數(shù)據(jù)通常包含了大量html實(shí)體比如< >: &测蹲,嵌入在原始數(shù)據(jù)中。必須去掉這些實(shí)體鬼吵。一種方法是用具體的正則表達(dá)式直接刪除扣甲。另一種方法是用適當(dāng)?shù)陌湍K(比如Python的htmlparser),可以將這些實(shí)體轉(zhuǎn)換成標(biāo)準(zhǔn)的html標(biāo)簽齿椅。例如<被轉(zhuǎn)換成“<”琉挖,&:被轉(zhuǎn)換成“&”
代碼片段:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
tweet = html_parser.unescape(original_tweet)
輸出:
>> “I luv my <3 iphone & you’re awsm apple. DisplayIsAwesome, sooo happppppy http://www.apple.com”
2. 解碼數(shù)據(jù)
這是一個(gè)信息轉(zhuǎn)換的過(guò)程,將復(fù)雜符號(hào)轉(zhuǎn)換成簡(jiǎn)單易于理解的字符涣脚。文本數(shù)據(jù)可能受到不同形式的編碼示辈,像是“Latin”,“UTF8”等遣蚀。因此矾麻,為了更好的分析,必須讓所有的數(shù)據(jù)保持標(biāo)準(zhǔn)的編碼格式芭梯。UTF-8編碼是被廣泛接受的編碼形式险耀,推薦使用。
代碼片段:
tweet = original_tweet.decode("utf8").encode("ascii","ignore")
輸出:
>> “I luv my <3 iphone & you’re awsm apple. DisplayIsAwesome, sooo happppppy http://www.apple.com”
3. 查找上撇號(hào)
為了避免文本中任何單詞出現(xiàn)歧義玖喘,建議保持其中的正確結(jié)構(gòu)甩牺,并遵守上下文無(wú)關(guān)文法的規(guī)則。當(dāng)使用上撇號(hào)的時(shí)候累奈,歧義性的機(jī)會(huì)就增加了贬派。
例如:“it’s is a contraction for it is or it has”急但。
所有的上撇號(hào)都應(yīng)該轉(zhuǎn)換進(jìn)標(biāo)準(zhǔn)詞匯表≡海可以用一個(gè)包含所有鍵的查詢表來(lái)去除歧義性羊始。
代碼片段:
APPOSTOPHES = {"'s" : " is", "'re" : " are", ...} ## Need a huge dictionary
words = tweet.split()
reformed = [APPOSTOPHES[word] if word in APPOSTOPHES else word for word in words]
reformed = " ".join(reformed)
輸出:
>> “I luv my <3 iphone & you are awsm apple. DisplayIsAwesome, sooo happppppy![image.png](https://upload-images.jianshu.io/upload_images/7960141-2bcc1071b7718225.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
http://www.apple.com”
4. 移除Stop word
當(dāng)數(shù)據(jù)分析需要在單詞水平上被數(shù)據(jù)驅(qū)動(dòng)的時(shí)候,經(jīng)常出現(xiàn)的詞(停止詞)應(yīng)該被移除查描⊥晃可以創(chuàng)建一個(gè)長(zhǎng)長(zhǎng)的停止詞列表,也可以用一個(gè)預(yù)定義的針對(duì)該語(yǔ)言的特定庫(kù)冬三。
5. 移除標(biāo)點(diǎn)符號(hào)
所有的標(biāo)點(diǎn)符號(hào)都要按照優(yōu)先級(jí)處理匀油。比如句號(hào)(英文中是點(diǎn)號(hào)),逗號(hào)勾笆,問(wèn)號(hào)是重要的標(biāo)點(diǎn)敌蚜,應(yīng)該被保留,而其他的則需要移除窝爪。
6. 移除表情符
文本數(shù)據(jù)(通常是說(shuō)話的文字記錄)可能包含人類表情符號(hào)弛车,比如[laughing], [Crying], [Audience paused]。這些表情通常跟說(shuō)話內(nèi)容不相關(guān)蒲每,因此需要移除纷跛。這種情況可以用簡(jiǎn)單的正則表達(dá)式來(lái)完成。
7. 拆分黏在一起的詞
我們?nèi)祟愒谏缃徽搲袭a(chǎn)生的文本數(shù)據(jù)邀杏,本質(zhì)上是完全非正式的贫奠。多數(shù)推特都伴隨著很多黏著在一塊的單詞比如RainyDay,PlaingInTheCold等等望蜡。這些用簡(jiǎn)單的規(guī)則和正則表達(dá)式就可以把它們拆分成正常的形式唤崭。
代碼片段:
cleaned = " ".join(re.findall('[A-Z][^A-Z]*', original_tweet))
輸出:
>> “I luv my <3 iphone & you are awsm apple. Display Is Awesome, sooo happppppy http://www.apple.com”
8. 查找俚語(yǔ)
社交媒體上充斥著俚語(yǔ)單詞。在制作自由文本(free text)時(shí)這些詞都應(yīng)該被轉(zhuǎn)換成標(biāo)準(zhǔn)詞脖律。像luv這樣的詞會(huì)被轉(zhuǎn)成love谢肾,Helo轉(zhuǎn)成Hello。查找上撇號(hào)的相似方式也可以用來(lái)將俚語(yǔ)轉(zhuǎn)換成標(biāo)準(zhǔn)詞小泉。網(wǎng)上有很多資源勒叠,提供了所有可能的俚語(yǔ)的列表。這應(yīng)該是你的圣杯膏孟,你可以將他們作為你的查詢字典來(lái)轉(zhuǎn)換。
代碼片段:
tweet = _slang_loopup(tweet)
輸出:
>> “I love my <3 iphone & you are awesome apple. Display Is Awesome, sooo happppppy http://www.apple.com”
9 詞標(biāo)準(zhǔn)化
有時(shí)詞不是正確格式拌汇。比如“I looooveee you”應(yīng)該是“I love you”.簡(jiǎn)單規(guī)則和正則表達(dá)式可以幫助解決這個(gè)狀況柒桑。
代碼片段:
tweet = ''.join(''.join(s)[:2] for _, s in itertools.groupby(tweet))
輸出:
>> “I love my <3 iphone & you are awesome apple. Display Is Awesome, so happy http://www.apple.com”
10.去除URL
文本數(shù)據(jù)如評(píng)論,書評(píng)噪舀,推特中魁淳,URL和鏈接應(yīng)該被移除飘诗。
最后清洗后的推文:
>> “I love my iphone & you are awesome apple. Display Is Awesome, so happy!” , <3 ,
高級(jí)數(shù)據(jù)清洗
1. 語(yǔ)法檢查
語(yǔ)法檢查主要是基于學(xué)習(xí)的。用大量正常數(shù)據(jù)的學(xué)習(xí)來(lái)產(chǎn)生用于語(yǔ)法糾正的模型界逛。有很多在線工具可以用于語(yǔ)法糾正目的昆稿。
2. 拼寫檢查
在自然語(yǔ)言中,會(huì)有拼寫錯(cuò)誤息拜。在自動(dòng)拼寫檢查方面溉潭,像谷歌和微軟等公司已經(jīng)達(dá)到了很好的準(zhǔn)確率水平∩倨郏可以用像Levenshtein距離喳瓣,字典查找之類的算法或者其他的現(xiàn)成模塊和軟件包來(lái)修正這些拼寫錯(cuò)誤。
結(jié)束語(yǔ):
希望你覺得這篇文章有用赞别。這里只是些提示和小技巧畏陕,是我在處理了大量的文本數(shù)據(jù)后學(xué)到的一些東西。如果你參照上邊的步驟來(lái)清洗數(shù)據(jù)仿滔,你可以很大程度上提高結(jié)果的準(zhǔn)確率惠毁,或者更深刻的理解數(shù)據(jù)∑橐常可以在評(píng)論中分享你的意見或者疑問(wèn)鞠绰,我會(huì)很高興參與討論。
作者:
SHIVAM BANSAL
鏈接:
https://www.analyticsvidhya.com/blog/2014/11/text-data-cleaning-steps-python/