赞
踩
目录
在深度学习中,数据预处理是一个重要的步骤。原始训练数据中,由于每一维特征的来源以及度量单位不同,会造成特征值的分布范围差异很大。当计算不同样本之间的欧氏距离时,取值范围大的特征会起到主导作用。因此,对于基于相似度比较的机器学习方法,必须先对样本进行预处理,将各维度特征归一化到同一取值区间,并且消除不同特征之间的相关性,才能获得理想的结果。
数据预处理还可以通过数据增强来增加训练样本的多样性,提高模型鲁棒性,避免过拟合,例如, 翻转、旋转、平移、缩放、随机裁剪或补零,色彩抖动等 ( 这些都是在CV当中的一些情况 );在NLP的任务中,数据预处理又可以通过以下方式来有效地增加训练数据的多样性,避免模型对训练数据的过拟合,提高模型的泛化能力和鲁棒性,例如,同义词替换、随即插入、随即删除、随即交换、随机扰动等,这些方法还可以缓解NLP中数据量不足的问题,提高模型的性能。
文本数据通常包含大量的无关信息和噪声,如标点符号、HTML标记、停用词、缩写、拼写错误、语法错误等。这些信息和噪声会干扰模型的学习和性能,导致模型预测不准确或低效。通过数据预处理,可以去除这些不必要的信息和噪声,使文本数据更加干净和有用。
文本数据通常具有多种表现形式和写作风格,如大小写、缩写、单复数、变体词等,在中文中可能存在语义分割的问题,有些词与词之间的界限不清晰、有些词语的多义性和歧义性、还有语法和语义的变化、简体字和繁体字、以及不同民族的文字,所以中文的数据在处理起来可能更加的困难、需要我们更加的小心和细心。这些差异会导致数据不一致和不规范,从而使模型学习变得更加困难。通过数据预处理,可以将文本数据转换为一致和规范的形式,使模型更容易学习和理解。
在NLP中,将文本数据划分为单个标记或单词是很重要的。这可以帮助我们理解文本的含义和结构,以及构建词汇表和语料库。标记化和分词可以将文本数据转换为可操作的形式,从而为模型学习提供基础。这一步中,对中文的处理也比英文要困难,英文的词都是用空格隔开的,而中文的一句话很多时候都是连起来的,所以在分词、词性标注的时候就更加的不容易,不过现在也有像 jieba 这样的比较优秀的中文分词的工具。
在NLP中,有时候我们需要将单词转换为它们的基本形式,这被称为词形还原和词干提取,在中文的NLP中其实词形还原和词干提取用的比较少 ( 在机器翻译和信息检索需要形态学分析的时候可能会用到 ),一般来说中文更多的是使用分词技术和词性标注技术来处理。这可以帮助我们理解单词的含义和关系,以及减少词汇量。通过数据预处理,可以将文本数据中的单词转换为它们的基本形式,从而提高模型的性能和效果。
NLP中的大多数模型需要将文本数据转换为数字特征向量,这可以使它们与其他机器学习算法兼容。向量化可以帮助我们表示文本数据,并为模型学习提供基础。通过数据预处理,可以将文本数据转换为数字特征向量,使其更加适合于机器学习算法。
NLP中的数据预处理是一个非常重要的步骤,可以帮助我们减少噪声和错误,提高数据的一致性和规范性,转换文本数据为可操作的形式,以及提高模型性能。
这里我们主要介绍在中文的NLP任务中数据预处理每一步所使用的一些方法。
数据清洗是指去除数据中不需要的内容,例如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 = "<p>这是一个包含HTML标签、数字12 3和特 殊符 号以及空格!@#的文本。</p>"
- clean_text = clean_text(text)
- print(clean_text)
结果如下所示:
这是一个包含HTML标签数字和特殊符号以及空格的文本
中文文本需要先进行分词,将句子分割成单独的词语。中文的分词算法有很多,例如基于规则的算法、基于统计的算法和基于深度学习的算法。其中,基于深度学习的算法如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分词结果: 自然语言 处理 是 人工智能 领域 的 一个 重要 方向 .
停用词是指在文本中频繁出现但对文本意义贡献较小的词语,例如“的”、“了”、“是”等。通常需要将这些词语从文本中去除,以减少处理时间和存储空间,并提高文本处理效率。常用的中文的停用词表又哈工大(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)
结果如下:
杀戮 之中 盛放 亦 黎明 中 花朵
词性标注是指对分词后的词语进行词性标记,例如名词、动词、形容词等。词性标注能够帮助模型更好地理解文本,同时也有助于其他任务,例如命名实体识别和依存句法分析等。词性标注算法包括基于规则的算法、基于统计的算法和基于深度学习的算法。词性标注可以用隐马尔可夫模型中经典的维特比算法来做,也可以用现在用的比较多的神经网络来做,不过说起来都比较冗长,后面有机会可以出一篇专门实现的文章,在这里我们直接展示一下使用 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
读者可自行搜索这些词性所代表的含义。
实体识别是指在文本中自动识别和提取出人名、地名、机构名等具有特定意义的实体。实体识别通常采用基于规则的方法或基于机器学习的方法,例如条件随机场(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']]
将文本转换为向量表示是深度学习中的一个重要步骤,词向量化是将分词后的词语转换为向量表示的过程。常见的词向量化算法有词袋模型(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任务的数据预处理包括数据清洗、分词、停用词过滤、词性标注、实体识别和词向量化等多个步骤,每个步骤都有不同的数据预处理技术可以选择,以后的文章中我可能还会介绍一些不错的方法实现,本篇文章对数据预处理部分就暂时叙述到这里。
本篇文章到此结束,感谢各位读者的阅读!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。