【深度学习&NLP】数据预处理的详细说明(含数据清洗、分词、过滤停用词、实体识别、词性标注、向量化、划分数据集等详细的处理步骤以及一些常用的方法)

目录

一、数据预处理简介

二、进行数据预处理的原因

1、文本中含有不必要的信息和噪声

2、数据可能不一致或者不太规范

3、文本需要标记和分词

4、可能需要词形还原和词干提取 ( 词性标注 )

5、需要将文本向量化处理

三、数据预处理方法介绍及使用样例

1、数据清洗

2、分词

3、停用词过滤

4、词性标注

5、实体识别

6、词向量化


一、数据预处理简介

        在深度学习中,数据预处理是一个重要的步骤。原始训练数据中,由于每一维特征的来源以及度量单位不同,会造成特征值的分布范围差异很大。当计算不同样本之间的欧氏距离时,取值范围大的特征会起到主导作用。因此,对于基于相似度比较的机器学习方法,必须先对样本进行预处理,将各维度特征归一化到同一取值区间,并且消除不同特征之间的相关性,才能获得理想的结果。

        数据预处理还可以通过数据增强来增加训练样本的多样性,提高模型鲁棒性,避免过拟合,例如, 翻转、旋转、平移、缩放、随机裁剪或补零,色彩抖动等 ( 这些都是在CV当中的一些情况 );在NLP的任务中,数据预处理又可以通过以下方式来有效地增加训练数据的多样性,避免模型对训练数据的过拟合,提高模型的泛化能力和鲁棒性,例如,同义词替换、随即插入、随即删除、随即交换、随机扰动等,这些方法还可以缓解NLP中数据量不足的问题,提高模型的性能。

二、进行数据预处理的原因

1、文本中含有不必要的信息和噪声

        文本数据通常包含大量的无关信息和噪声,如标点符号、HTML标记、停用词、缩写、拼写错误、语法错误等。这些信息和噪声会干扰模型的学习和性能,导致模型预测不准确或低效。通过数据预处理,可以去除这些不必要的信息和噪声,使文本数据更加干净和有用。

2、数据可能不一致或者不太规范

        文本数据通常具有多种表现形式和写作风格,如大小写、缩写、单复数、变体词等,在中文中可能存在语义分割的问题,有些词与词之间的界限不清晰、有些词语的多义性和歧义性、还有语法和语义的变化、简体字和繁体字、以及不同民族的文字,所以中文的数据在处理起来可能更加的困难、需要我们更加的小心和细心。这些差异会导致数据不一致和不规范,从而使模型学习变得更加困难。通过数据预处理,可以将文本数据转换为一致和规范的形式,使模型更容易学习和理解。

3、文本需要标记和分词

        在NLP中,将文本数据划分为单个标记或单词是很重要的。这可以帮助我们理解文本的含义和结构,以及构建词汇表和语料库。标记化和分词可以将文本数据转换为可操作的形式,从而为模型学习提供基础。这一步中,对中文的处理也比英文要困难,英文的词都是用空格隔开的,而中文的一句话很多时候都是连起来的,所以在分词、词性标注的时候就更加的不容易,不过现在也有像 jieba 这样的比较优秀的中文分词的工具。

4、可能需要词形还原和词干提取 ( 词性标注 )

        在NLP中,有时候我们需要将单词转换为它们的基本形式,这被称为词形还原和词干提取,在中文的NLP中其实词形还原和词干提取用的比较少 ( 在机器翻译和信息检索需要形态学分析的时候可能会用到 ),一般来说中文更多的是使用分词技术和词性标注技术来处理。这可以帮助我们理解单词的含义和关系,以及减少词汇量。通过数据预处理,可以将文本数据中的单词转换为它们的基本形式,从而提高模型的性能和效果。

5、需要将文本向量化处理

        NLP中的大多数模型需要将文本数据转换为数字特征向量,这可以使它们与其他机器学习算法兼容。向量化可以帮助我们表示文本数据,并为模型学习提供基础。通过数据预处理,可以将文本数据转换为数字特征向量,使其更加适合于机器学习算法。

        NLP中的数据预处理是一个非常重要的步骤,可以帮助我们减少噪声和错误,提高数据的一致性和规范性,转换文本数据为可操作的形式,以及提高模型性能。

三、数据预处理方法介绍及使用样例

        这里我们主要介绍在中文的NLP任务中数据预处理每一步所使用的一些方法。

1、数据清洗

        数据清洗是指去除数据中不需要的内容,例如HTML标签、数字、特殊符号等。这可以通过正则表达式、字符串匹配和过滤等技术实现。

例:

import re

def clean_text(sentence):
    # 过滤HTML标签
    sentence = re.sub(r'<.*?>', '', sentence)

    # 过滤数字
    sentence = re.sub(r'\d+', '', sentence)

    # 过滤特殊符号
    sentence = re.sub(r'[^\w\s]', '', sentence)

    # 过滤空格
    sentence = sentence.replace(' ', '')

    return sentence

text = "

这是一个包含HTML标签、数字12 3和特 殊符 号以及空格!@#的文本。

" clean_text = clean_text(text) print(clean_text)

        结果如下所示:

这是一个包含HTML标签数字和特殊符号以及空格的文本

2、分词

        中文文本需要先进行分词,将句子分割成单独的词语。中文的分词算法有很多,例如基于规则的算法、基于统计的算法和基于深度学习的算法。其中,基于深度学习的算法如BERT、LSTM等,能够更好地处理语义信息。可能在你做的很多实际的项目中,你经常会直接使用现有的分词工具,在这里我们就介绍一下分词工具的使用,至于完整实现一个分词的算法可能在后续的文章中会单独出一篇,内容应该比较多和细,所以在这里就不展开说了,下面我们给出一些现在用的比较多的分词工具的使用 ( 这里作者主要介绍一下中文的分词工具,英文的用的比较多的应该是NLTK )。

例:

text = "自然语言处理是人工智能领域的一个重要方向。"

# 使用jieba分词
import jieba
seg_list = jieba.cut(text)
print("jieba分词结果:", " ".join(seg_list))

# 使用THULAC分词
import thulac
thu = thulac.thulac()
seg_list = thu.cut(text)
print("THULAC分词结果:", " ".join([item[0] for item in seg_list]))

# 使用HanLP分词
from pyhanlp import HanLP
seg_list = HanLP.segment(text)
print("HanLP分词结果:", " ".join([term.word for term in seg_list]))

# 使用LTP分词
from ltp import LTP
ltp = LTP()
seg, _ = ltp.seg([text])
print("LTP分词结果:", " ".join(seg[0]))

        结果如下所示:

jieba分词结果: 自然语言 处理 是 人工智能 领域 的 一个 重要 方向 。
THULAC分词结果: 自然语言 处理 是 人工智能 领域 的 一 个 重要 方向 。
HanLP分词结果: 自然语言 处理 是 人工智能 领域 的 一个 重要 方向 。
LTP分词结果: 自然语言 处理 是 人工智能 领域 的 一个 重要 方向 .

3、停用词过滤

        停用词是指在文本中频繁出现但对文本意义贡献较小的词语,例如“的”、“了”、“是”等。通常需要将这些词语从文本中去除,以减少处理时间和存储空间,并提高文本处理效率。常用的中文的停用词表又哈工大(HIT)停用词表、百度(baidu)停用词表、川大机器智能实验室停用词表(SCU)以及中文停用词表(CN)等。下面就是这几个常用的中文停用词表的下载仓库地址:

GitHub - goto456/stopwords: 中文常用停用词表(哈工大停用词表、百度停用词表等)

        下面我给出一个使用哈工大停用词表去停用词的示例:

例:

import jieba

# 加载停用词表
with open('hit_stopwords.txt', 'r', encoding='utf-8') as f:
    stopwords = [line.strip() for line in f.readlines()]

# 定义去停用词函数
def remove_stopwords(text):
    seg_list = jieba.cut(text)
    filtered_list = [word for word in seg_list if word not in stopwords]
    return ' '.join(filtered_list)

text = "我与杀戮之中盛放,亦如黎明中的花朵。"
filtered_text = remove_stopwords(text)
print(filtered_text)

结果如下:

杀戮 之中 盛放 亦 黎明 中 花朵

4、词性标注

        词性标注是指对分词后的词语进行词性标记,例如名词、动词、形容词等。词性标注能够帮助模型更好地理解文本,同时也有助于其他任务,例如命名实体识别和依存句法分析等。词性标注算法包括基于规则的算法、基于统计的算法和基于深度学习的算法。词性标注可以用隐马尔可夫模型中经典的维特比算法来做,也可以用现在用的比较多的神经网络来做,不过说起来都比较冗长,后面有机会可以出一篇专门实现的文章,在这里我们直接展示一下使用 jieba 分词工具来进行词性标注:

例:

import jieba.posseg as pseg

text = "云日明松雪,溪山进晚风。"
result = pseg.cut(text)

for word, tag in result:
    print(word, tag)

结果如下:

云日明 nr
松雪 nr
, x
溪山 ns
进 v
晚风 n
。 x

        读者可自行搜索这些词性所代表的含义。

5、实体识别

        实体识别是指在文本中自动识别和提取出人名、地名、机构名等具有特定意义的实体。实体识别通常采用基于规则的方法或基于机器学习的方法,例如条件随机场(CRF)和循环神经网络(RNN)等。本文章只展示使用现有的工具进行命名实体识别的方法,有很多工具可以用来进行命名实体识别。一些较为成熟的中文命名实体识别(NER)工具包括 LTP(语言技术平台),PyHanlp,Lac 等。底层的实现,有时间再单独做。

例:

from LAC import LAC

lac = LAC(mode='lac')
text = "杨超越在1998年7月31日出生于江苏省盐城市大丰区。"
result = lac.run(text)
print(result)

结果如下:

[['杨超越', '在', '1998年', '7月31日出生于', '江苏省', '盐城市', '大丰区', '。'], ['PER', 'p', 'TIME', 'v', 'LOC', 'LOC', 'LOC', 'w']]

6、词向量化

        将文本转换为向量表示是深度学习中的一个重要步骤,词向量化是将分词后的词语转换为向量表示的过程。常见的词向量化算法有词袋模型(Bag-of-words, BoW)、word2vec、GloVe、TDF-IDF等。

        TF-IDF(词频-逆文档频率)是一种常用的文本特征提取方法,它用于衡量单词在文档集合中的重要性。TF-IDF 是由两部分组成的:词频(TF)和逆文档频率(IDF)。词频(TF)表示单词在文档中出现的频率。它通常通过将单词在文档中出现的次数除以文档的总单词数来计算。词频越高,说明单词在文档中越重要。逆文档频率(IDF)表示单词在文档集合中的普遍重要性。它通常通过将文档集合的总文档数除以包含该单词的文档数,然后取对数来计算。逆文档频率越高,说明单词在文档集合中越重要。TF-IDF 值是通过将词频和逆文档频率相乘来计算的。TF-IDF 值越高,说明单词在文档中越重要。下面是直接使用sklearn来进行TDF-IDF向量化的例子:

例:

from sklearn.feature_extraction.text import TfidfVectorizer

# 准备数据
corpus = ['赵六 王五', '张三 李四']

# 创建 TfidfVectorizer 对象
vectorizer = TfidfVectorizer()

# 计算 TF-IDF 值
tfidf = vectorizer.fit_transform(corpus)

# 输出结果
print(tfidf.toarray())

结果如下:

[[0.         0.         0.70710678 0.70710678]
 [0.70710678 0.70710678 0.         0.        ]]

        

        中文NLP任务的数据预处理包括数据清洗、分词、停用词过滤、词性标注、实体识别和词向量化等多个步骤,每个步骤都有不同的数据预处理技术可以选择,以后的文章中我可能还会介绍一些不错的方法实现,本篇文章对数据预处理部分就暂时叙述到这里。

本篇文章到此结束,感谢各位读者的阅读!

你可能感兴趣的:(深度学习,人工智能)