文本数据预处理指南

在处理大量文本数据时,例如推文,需要在应用任何模型之前进行一些预处理工作。初始文本包含许多噪声和冗余词汇,因此需要进行清洗。文本预处理是清洗和准备文本数据以用于主题建模、文本分类和情感分析等应用的最关键和最重要的阶段。目标是从文本文档数据集中提取出最重要的词汇。为了预处理文本,需要应用一些操作,包括去除非信息性特征,如标点符号、常见词汇如“the”和“a”、数字等。

目录

  • 导入库和数据集
  • 去除链接
  • 去除标点符号
  • 去除数字
  • 去除表情符号
  • 去除停用词
  • 分词
  • 规范化词汇

1. 导入库和数据集

让从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

可以快速注意到文本包含许多冗余和不适当的信息。需要在以下步骤中进行清洗。

2. 去除链接

首先,需要去除所有链接,因为它们没有任何预测意义:

df["clean_text"] = df["text"].apply(lambda s: ' '.join(re.sub("(w+://S+)", " ", s).split())) df[['text','clean_text']].iloc[94807]

从提取的行中,可以轻松看到原始文本和清洗后的文本之间的差异。

3. 去除标点符号

需要删除“?”、“。”和“,”等字符。这可以通过使用re模块的sub()函数来实现。它将正则表达式替换为空白。可能想知道什么是正则表达式。它用于指定一组匹配它的字符串。可以在w3school网站上找到更多关于re库的信息。

df["clean_text"] = df["clean_text"].apply(lambda s: ' '.join(re.sub("[.,!?:;-='..."@#_]", " ", s).split())) df[["text","clean_text"]]

再次比较推文和相应的清洗文本。不再看到任何标点符号。

4. 去除数字

还需要去除文本中的数字字符。它们本身不包含信息。这些字符可以使用replace函数轻松删除。

df["clean_text"].replace('d+', '', regex=True, inplace=True) df[["text","clean_text"]]

5. 去除表情符号

表情符号被去除,因为它们无法被分析。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]

6. 去除停用词

停用词是用于正确构造句子的术语,但没有任何重要见解。这些词包括“为什么”、“什么”、“如何”。因此,这些词比信息更嘈杂。出于这个原因,需要去除它们。幸运的是,不需要手动指定停用词,但它们已经由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的所有行。同时,将所有文本转换为小写。

7. 分词

简单地将文本分割成词汇。换句话说,字符串被转换为一个列表,其中每个元素对应一个单词。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"]]

8. 规范化词汇

最后一步是规范化文本。这意味着什么?希望将一个单词转换为其基本形式。例如,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”。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485