在处理大量文本数据时,例如推文,需要在应用任何模型之前进行一些预处理工作。初始文本包含许多噪声和冗余词汇,因此需要进行清洗。文本预处理是清洗和准备文本数据以用于主题建模、文本分类和情感分析等应用的最关键和最重要的阶段。目标是从文本文档数据集中提取出最重要的词汇。为了预处理文本,需要应用一些操作,包括去除非信息性特征,如标点符号、常见词汇如“the”和“a”、数字等。
让从Kaggle导入库和数据集,该数据集包含了使用Twitter API从2020年7月收集的推文。应用了一个过滤器:只提取带有#covid19的推文。可以通过打印信息轻松查看数据集的字段:
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
import re
df = pd.read_csv('../input/covid19-tweets/covid19_tweets.csv')
df.info()
大多数列在这篇文章中不会被使用。只对文本字段感兴趣。
df.text
可以快速注意到文本包含许多冗余和不适当的信息。需要在以下步骤中进行清洗。
首先,需要去除所有链接,因为它们没有任何预测意义:
df["clean_text"] = df["text"].apply(lambda s: ' '.join(re.sub("(w+://S+)", " ", s).split()))
df[['text','clean_text']].iloc[94807]
从提取的行中,可以轻松看到原始文本和清洗后的文本之间的差异。
需要删除“?”、“。”和“,”等字符。这可以通过使用re模块的sub()函数来实现。它将正则表达式替换为空白。可能想知道什么是正则表达式。它用于指定一组匹配它的字符串。可以在w3school网站上找到更多关于re库的信息。
df["clean_text"] = df["clean_text"].apply(lambda s: ' '.join(re.sub("[.,!?:;-='..."@#_]", " ", s).split()))
df[["text","clean_text"]]
再次比较推文和相应的清洗文本。不再看到任何标点符号。
还需要去除文本中的数字字符。它们本身不包含信息。这些字符可以使用replace函数轻松删除。
df["clean_text"].replace('d+', '', regex=True, inplace=True)
df[["text","clean_text"]]
表情符号被去除,因为它们无法被分析。apply函数采用deEmojify函数,该函数应用于数据框的每一行。在函数中,首先使用ASCII编码对字符串进行编码,然后对其进行解码。通过这种方式,能够删除表情符号。
def deEmojify(inputString):
return inputString.encode('ascii', 'ignore').decode('ascii')
df["clean_text"] = df["clean_text"].apply(lambda s: deEmojify(s))
df[['text','clean_text']].iloc[12]
停用词是用于正确构造句子的术语,但没有任何重要见解。这些词包括“为什么”、“什么”、“如何”。因此,这些词比信息更嘈杂。出于这个原因,需要去除它们。幸运的是,不需要手动指定停用词,但它们已经由nltk模块提供。
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
stop = set(stopwords.words('english'))
print(stop)
def rem_en(input_txt):
words = input_txt.lower().split()
noise_free_words = [word for word in words if word not in stop]
noise_free_text = " ".join(noise_free_words)
return noise_free_text
df["clean_text"] = df["clean_text"].apply(lambda s: rem_en(s))
df[["text","clean_text"]]
apply函数采用rem_en函数,该函数应用于数据框df的所有行。同时,将所有文本转换为小写。
简单地将文本分割成词汇。换句话说,字符串被转换为一个列表,其中每个元素对应一个单词。nltk模块提供了tokenize函数来对推文进行分词。
from nltk.tokenize import RegexpTokenizer
tokeniser = RegexpTokenizer(r'w+')
df["clean_text"] = df["clean_text"].apply(lambda x: tokeniser.tokenize(x))
df[["text","clean_text"]]
最后一步是规范化文本。这意味着什么?希望将一个单词转换为其基本形式。例如,playing、plays和play对计算机来说可能看起来不同,但它们是同一件事。需要产生这些词的根形式。nltk模块在这个时候也扮演了重要的角色。它提供了WordNetLemmatizer函数,该函数使用一个名为WordNet的数据库查找单词的引理。
from nltk.stem import WordNetLemmatizer
lemmatiser = WordNetLemmatizer()
df["clean_text"] = df["clean_text"].apply(lambda tokens: [lemmatiser.lemmatize(token, pos='v') for token in tokens])
df[["text","clean_text"]]
从输出中,可以检查最终的文本。像“smelled”和“nominating”这样的词被转换为它们对应的根形式,“smell”和“nominate”。