在自然语言处理(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()