在数据科学领域,文本数据的清洗和预处理是构建模型前的重要步骤。文本数据的清洗依赖于数据的类型,尤其是当数据为文本形式时,清洗工作显得尤为关键。本文将探讨文本数据清洗的不同技术,并提供相应的Python代码示例。
文本清洗是一个任务驱动的过程,需要明确最终目标,并在清洗前对数据进行审查,以确定可以达到的效果。初步探索数据时,可能会注意到文本中存在许多拼写错误、数字和标点符号、表情符号、用户名、链接,以及非英语文本和连字符或缩写词。这些问题都需要在文本清洗过程中得到妥善处理。
本文将介绍几种常见的文本数据清洗方法,并展示如何使用Python代码来实现这些方法。这些方法包括将文本转换为小写、去除标点符号、移除数字、消除多余空格、替换重复的标点符号、去除表情符号、去除表情图标以及展开缩写词。
在某些情况下,如分词和向量化处理前,将文本转换为小写是必要的。但需注意,如果进行情感分析,将文本转换为小写可能会丢失单词的实际含义,例如大写可能表示愤怒等。
text = "I had such high hopes for this dress 15 size or (my usual size) to work for me."
ans = text.lower()
print(ans)
去除标点符号有助于平等对待每段文本。例如,去除标点后,“data”和“data!”将被视为相同。需要注意的是,去除标点可能会使某些缩写词失去意义,如“don’t”变为“dont”。
import string
text = "I had such high hopes! for this dress size or (my usual size) to work for me."
PUNCT_TO_REMOVE = string.punctuation
ans = text.translate(str.maketrans('', '', PUNCT_TO_REMOVE))
print(ans)
在某些情况下,数字可能并不包含重要信息,因此移除数字可能是更好的选择。例如,在情感分析中,数字没有特定含义,但在命名实体识别或词性标注任务中,需要谨慎使用移除数字的技术。
ans = ''.join([i for i in text if not i.isdigit()])
print(ans)
消除多余空格不仅可以节省存储空间,还可以使数据更加清晰。
ans = " ".join(text.split())
print(ans)
使用正则表达式可以更快、更容易地编写代码。去除重复的标点符号非常有用,因为如果一个词中包含多个标点符号,它们并不包含重要信息。
import re
text1 = "I had such... high hopes for this dress!!!!"
ans = re.sub(r'(!)\1+', '', text1)
print(ans)
def remove_emoji(string):
emoji_pattern = re.compile("["
u"U0001F600-U0001F64F" # emoticons
u"U0001F300-U0001F5FF" # symbols & pictographs
u"U0001F680-U0001F6FF" # transport & map symbols
u"U0001F1E0-U0001F1FF" # flags (iOS)
u"U00002702-U000027B0"
u"U000024C2-U0001F251"
"]+", flags=re.UNICODE)
return emoji_pattern.sub(r'', string)
print(remove_emoji("game is on 🔥🔥"))
EMOTICONS = {
u":‑)":"Happy face or smiley",
u":)":"Happy face or smiley",
# ... 其他表情图标
}
text = 'I had such high hopes for this dress 15 size really wanted it to work for me :-)'
ans = re.compile(u'(' + u'|'.join(k for k in EMOTICONS) + u')')
ans = ans.sub(r'',text)
print(ans)
import contractions
text = "She'd like to know how I'd do that!"
print(contractions.fix(text))