在自然语言处理(NLP)领域,数据清洗是一项基础且关键的工作。本文将详细介绍几种常用的数据清洗技术,包括去除HTML标签、URL和电子邮件地址,去除停用词,标准化和拼写检查,聊天词汇转换,以及去除高频和低频词汇。这些技术对于提高文本数据的质量,进而提升NLP任务的性能至关重要。
在从不同网站提取数据时,经常遇到包含HTML标签的文本。这些标签包括标题、正文、段落、加粗等。可以使用正则表达式轻松地从文本中去除这些HTML标签。以下是一个Python代码示例,展示了如何去除文本中的HTML标签:
import re
text = """
“对这条裙子抱有很高的期望,希望15号尺码(通常的尺码)能适合。”
without_html = re.sub(pattern=r"<[^>]*>", repl=' ', string=text)
print(f”{without_html}”)
这段代码首先定义了一个包含HTML标签的字符串,然后使用正则表达式替换掉所有的HTML标签,并将结果打印出来。
在手动从网站、维基百科页面或博客中收集数据时,经常遇到URL链接。有时这些链接是重要的,但有时可能不需要它们。可以使用spaCy库来检测文本中是否包含URL链接,并将其去除。以下是一个Python代码示例,展示了如何检测和去除文本中的URL链接:
import spacy
nlp = spacy.load("en_core_web_sm")
text = '电子邮件地址是 http://abcgmail.com'
doc = nlp(text)
for token in doc:
if token.like_url:
print(token)
这段代码首先加载了spaCy的英文模型,然后定义了一个包含URL链接的字符串。通过遍历文档中的每个token,可以检测到URL链接并将其打印出来。
停用词是自然语言处理中的常用技术。停用词是指在一种语言中经常出现的词,例如“和”、“或”、“但”等。这些词在文本中没有特定的意义,即使从文本中去除它们,也不会降低文本的质量。以下是一个Python代码示例,展示了如何从文本中去除停用词:
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
text = "对这条裙子抱有很高的期望,希望1-5号尺码能适合。"
STOPWORDS = set(stopwords.words('english'))
ans = " ".join([word for word in str(text).split() if word not in STOPWORDS])
ans
这段代码首先下载了NLTK库中的停用词包,然后定义了一个包含停用词的字符串。通过遍历字符串中的每个词,并检查它是否在停用词列表中,可以去除停用词并得到清洗后的文本。
经常遇到格式不正确或拼写错误的数据。为了解决这个问题,可以使用autocorrect库来进行拼写检查。以下是一个Python代码示例,展示了如何对文本进行标准化和拼写检查:
!pip install autocorrect
import itertools
from autocorrect import Speller
text="一个农民会喜欢这种食物"
text_correction = ''.join(''.join(s)[:2] for _, s in itertools.groupby(text))
print("正常文本:{}".format(text_correction))
spell = Speller(lang='en')
ans = spell(text_correction)
print("纠正后的文本:{}".format(ans))
这段代码首先安装了autocorrect库,然后定义了一个包含拼写错误的字符串。通过使用autocorrect库,可以对文本进行拼写检查并纠正错误。
chat_words_str = """
AFAIK=据所知
AFK=离开键盘
ASAP=尽快
ATK=在键盘前
ATM=此刻
A3=随时,随地,随便"""
chat_words_map_dict = {}
chat_words_list = []
for line in chat_words_str.split("\n"):
if line != "":
cw = line.split("=")[0]
cw_expanded = line.split("=")[1]
chat_words_list.append(cw)
chat_words_map_dict[cw] = cw_expanded
chat_words_list = set(chat_words_list)
def chat_words_conversion(text):
new_text = []
for w in text.split():
if w.upper() in chat_words_list:
new_text.append(chat_words_map_dict[w.upper()])
else:
new_text.append(w)
return " ".join(new_text)
chat_words_conversion("一分钟后A3")
import pandas as pd
from collections import Counter
df = pd.read_csv('NLP清洗第二部分.csv')
df[:3]
cnt = Counter()
for text in df["text"].values:
for word in text.split():
cnt[word] += 1
cnt.most_common(10)
FREQWORDS = set([w for (w, wc) in cnt.most_common(10)])
def remove_freqwords(text):
"""自定义函数,用于去除高频词汇"""
return " ".join([word for word in str(text).split() if word not in FREQWORDS])
df["text_wo_stopfreq"] = df["text"].apply(lambda text: remove_freqwords(text))
df.head()