文本数据清洗(小技巧)

文本数据清洗

※本文是关于英文文本处理,有些技巧在中文中用不到。

入手的数据就是格式化表格的时代已经一去不复返了。曾经有一段寂静的时光,数据是安居与表格中的。今天80%的数据是非结构化的——或者存在于数据仓库里,或者分散在不同的存储设备中。数据就像我们说话一样,一直在产生——从社交媒体中我们进行的每次对话,到从新数据源生成的每个内容。为了对数据的意义有个深入的理解,进而能对数据进行一定程度的处理,很重要的一点就是要知道如何处理数据的非结构化形式。作为来自一个正在飞速增长的决策科学公司的数据科学家,我的面包和黄油都是来自于对非结构化文本信息的整理,以及进一步形成的理解。

image.png

处理文本数据的第一步就是前处理。在数据用于分析之前,这是比较基本的一步。可资利用的文本数据的绝大多数都是高度非结构化,本质上充满噪声。为了获得更好的理解,或者构建更好的算法,使用干净的数据才是根本。例如,社交媒体数据都是高度非结构化的——因为这里交流都是非正式交流——错字,语法错误,俚语,新出的网络用语,并且夹杂着像URL这样我们并不想要的内容等。停止词,表达式等都是我们的敌人。

在本文中,我们讨论的都是可能的噪声因素,以及如何一步步清理它们。我会详细说明一下用python清洗数据的方法。

作为典型的商业问题,假设你对寻找商品感兴趣, 目标:在粉丝中iphone最受欢迎的特征是哪个。你已经抽出了跟iphone相关的客户意见,这里是你的爬虫爬到的推文:

I luv my <3 iphone & you’re awsm apple. DisplayIsAwesome, sooo happppppy  http://www.apple.com”

数据清洗步骤:
这里是你想要的:

1. HTML字符转换

从网页得到的数据通常包含了大量html实体比如< >: &,嵌入在原始数据中。必须去掉这些实体。一种方法是用具体的正则表达式直接删除。另一种方法是用适当的包和模块(比如Python的htmlparser),可以将这些实体转换成标准的html标签。例如<被转换成“<”,&:被转换成“&”

代码片段:

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. 解码数据

这是一个信息转换的过程,将复杂符号转换成简单易于理解的字符。文本数据可能受到不同形式的编码,像是“Latin”,“UTF8”等。因此,为了更好的分析,必须让所有的数据保持标准的编码格式。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. 查找上撇号

为了避免文本中任何单词出现歧义,建议保持其中的正确结构,并遵守上下文无关文法的规则。当使用上撇号的时候,歧义性的机会就增加了。

例如:“it’s is a contraction for it is or it has”。
所有的上撇号都应该转换进标准词汇表。可以用一个包含所有键的查询表来去除歧义性。

代码片段:

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

当数据分析需要在单词水平上被数据驱动的时候,经常出现的词(停止词)应该被移除。可以创建一个长长的停止词列表,也可以用一个预定义的针对该语言的特定库。

5. 移除标点符号

所有的标点符号都要按照优先级处理。比如句号(英文中是点号),逗号,问号是重要的标点,应该被保留,而其他的则需要移除。

6. 移除表情符

文本数据(通常是说话的文字记录)可能包含人类表情符号,比如[laughing], [Crying], [Audience paused]。这些表情通常跟说话内容不相关,因此需要移除。这种情况可以用简单的正则表达式来完成。

7. 拆分黏在一起的词

我们人类在社交论坛上产生的文本数据,本质上是完全非正式的。多数推特都伴随着很多黏着在一块的单词比如RainyDay,PlaingInTheCold等等。这些用简单的规则和正则表达式就可以把它们拆分成正常的形式。

代码片段:

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. 查找俚语

社交媒体上充斥着俚语单词。在制作自由文本(free text)时这些词都应该被转换成标准词。像luv这样的词会被转成love,Helo转成Hello。查找上撇号的相似方式也可以用来将俚语转换成标准词。网上有很多资源,提供了所有可能的俚语的列表。这应该是你的圣杯,你可以将他们作为你的查询字典来转换。

代码片段:

tweet = _slang_loopup(tweet)

输出:

>>  “I love my <3 iphone & you are awesome apple. Display Is Awesome, sooo happppppy  http://www.apple.com”

9 词标准化
有时词不是正确格式。比如“I looooveee you”应该是“I love you”.简单规则和正则表达式可以帮助解决这个状况。

代码片段:

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

文本数据如评论,书评,推特中,URL和链接应该被移除。
最后清洗后的推文:

>>  “I love my iphone & you are awesome apple. Display Is Awesome, so happy!” , <3 ,  

高级数据清洗

1. 语法检查

语法检查主要是基于学习的。用大量正常数据的学习来产生用于语法纠正的模型。有很多在线工具可以用于语法纠正目的。

2. 拼写检查

在自然语言中,会有拼写错误。在自动拼写检查方面,像谷歌和微软等公司已经达到了很好的准确率水平。可以用像Levenshtein距离,字典查找之类的算法或者其他的现成模块和软件包来修正这些拼写错误。

结束语:
希望你觉得这篇文章有用。这里只是些提示和小技巧,是我在处理了大量的文本数据后学到的一些东西。如果你参照上边的步骤来清洗数据,你可以很大程度上提高结果的准确率,或者更深刻的理解数据。可以在评论中分享你的意见或者疑问,我会很高兴参与讨论。

作者:
SHIVAM BANSAL
链接:
https://www.analyticsvidhya.com/blog/2014/11/text-data-cleaning-steps-python/

你可能感兴趣的:(文本数据清洗(小技巧))