-
2020-12-02 10:33:03
一、数据标准化(归一化)
首先,数据标准化处理主要包括数据同趋化处理(中心化处理)和无量纲化处理。
同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。
无量纲化处理主要为了消除不同指标量纲的影响,解决数据的可比性,防止原始特征中量纲差异影响距离运算(比如欧氏距离的运算)。它是缩放单个样本以具有单位范数的过程,这与标准化有着明显的不同。简单来说,标准化是针对特征矩阵的列数据进行无量纲化处理,而归一化是针对数据集的行记录进行处理,使得一行样本所有的特征数据具有统一的标准,是一种单位化的过程。即标准化会改变数据的分布情况,归一化不会,标准化的主要作用是提高迭代速度,降低不同维度之间影响权重不一致的问题。
数据标准化(归一化)的方法有很多种,常用的有"最小-最大标准化"、"Z-score标准化"和"按小数定标标准化"等等。经过标准化处理后,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,可以进行综合测评分析。
这里介绍常用的三种常见的转换方法:
1. 极值法(区间缩放法)
线性比例变换法:正向指标:y = (x)/(max),即新数据=(原数据)/(最大值)。负向指标:y = (min)/(x),即新数据=(最小值)/(原数据)。
极差变换法:正向指标:y = (x- min)/(max - min),即新数据=(原数据-最小值)/(最大值-最小值)。负向指标:y = (max - x)/(max - min),即新数据=(最大值-原数据)/(最大值-最小值)。
使用这种方法的目的包括:
(1)0-1标准化,又称最大值-最小值标准化,核心要义是将原始指标缩放到0~1之间的区间内,但不改变原始数据的分布
(2)对于方差非常小的属性可以增强其稳定性;
(3)维持稀疏矩阵中为0的条目。
2. 比重法
L2正则化:y = x/sqrt(Σx^2),即新数据=(原数据)/sqrt(平方和),被称为L2正则转换。
正则化则是通过范数规则来约束特征属性,通过正则化我们可以降低数据训练处来的模 型的过拟合可能,和机器学习中所讲述的L1、L2正则的效果一样。在进行正则化 操作的过程中,不会改变数据的分布情况,但是会改变数据特征之间的相关特性。
3. 标准化
Z-score:y = (x - mean)/σ,基于原始数据的均值(mean)和标准(standard deviation)进行数据的标准化,经过处理的数据符合标准正态分布,即均值为0,标准差为1。
4.二值化
对于定量数据(特征取值连续),根据给定的阈值将其进行转换,如果大于阈值赋值为1,否则赋值为0;对于定性数据(特征取值离散,也有可能是文本数据),根据给定规则将其进行转换,符合规则的赋值为1,否则赋值为0。
二、特征转换
特征转换主要指将原始数据中的字段数据进行转换操作,从而得到适合进行算法 模型构建的输入数据(数值型数据),在这个过程中主要包括但不限于以下几种数据的处理:文本数据转换为数值型数据、缺省值填充、定性特征属性哑编码、定量特征属性二值化、特征标准化与归一化。
1.文本特征属性转换:机器学习的模型算法均要求输入的数据必须是数值型的,所以对于文本类型的特征属性,需要进行文本数据转换,也就是需要将文本数据转换为数值型数据。常用方式如下:词袋法(BOW/TF)、TF-IDF(Term frequency-inverse document frequency)、HashTF、Word2Vec(主要用于单词的相似性考量)。
2.缺省值填充:缺省值是数据中最常见的一个问题,处理缺省值有很多方式,主要包括以下四个 步骤进行缺省值处理:确定缺省值范围->去除不需要的字段->填充缺省值内容->重新获取数据。
3.哑编码(OneHotEncoder):也称哑变量处理,对于定性的数据(也就是分类的数据),可以采用N位的状态寄存器来对N个状态进行编码,每个状态都有一个独立的寄存器位,并且在任意状态下只有一位有效;是一种常用的将特征数字化的方式。比如有一个特征属性:['male','female'],那么male使用向量[1,0]表示,female使用[0,1]表。
更多相关内容 -
Python 对数据集进行归一化处理并存储为 mat 格式的文件
2021-12-07 14:14:56在做科研工作时,我们不仅从理论角度分析所提 idea 的种种优势,还需要进行大量的实验,得到的实验效果可以进一步地支撑 idea 的优越性,这样更...因此,归一化处理工作尤为重要,我们要将不同量纲的表达式变为无量纲,Python 对数据集进行归一化处理并存储为 mat 格式的文件
0. 导论
在做科研工作时,我们不仅从理论角度分析所提 idea 的种种优势,还需要进行大量的实验,得到的实验效果可以进一步地支撑 idea 的优越性,这样更具有说服力。实验所使用的数据集作为实验的重要组成部分,我们往往需要对拿来的数据集进行数据预处理工作,因为通常使用的数据集是来自各行各业的数据,而一个数据集往往具有多个属性,每个属性的值是否使用的是同一量纲得到的,这往往是个问题,如果不是采用同一个量纲进行评价,得到的属性值放在一起进行运算,是否公正合理?
因此,数据归一化处理工作尤为重要,我们要将不同量纲的表达式变为无量纲,也就是将数据集的属性值变为纯量。Python 的 sklearn 包提供了归一化函数,可以方便地对数据集进行处理。
我们以https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html 上面的数据集 fourclass 为例,对原始数据进行归一化处理。1. 下载数据集
打开数据集网址,点击 fourclass 链接,可以看到数据是在网页页面上展示的,没有提供下载形式,这里的下载需要将数据复制下来保存到 txt 文本文件中。
新建文本文件可以命名为 fourclass.txt.2. 归一化处理
观察我们下载的 fourclass 数据集,可以发现这是一个二维二分类数据集,也就是说只有两个属性,并且它的标签值分为两类。
以第一行数据为例,标签放在第一列,标签值为 +1 和 -1 两种;后两列为属性值,1:167.000000 2:178.000000 表示第一列属性值为 167.000000, 第二列属性值为 178.000000. 我们的目标是将属性值缩放到 (0,1) 之间,标签值放到最后一列。2.1 读入文本
# 可读模式读入文本内容 f = open(r"C:\Users\Desktop\fourclass.txt", 'r') # 将文本内容以多行方式一次性读入 lines = f.readlines() res = [] for i in lines: # 根据每行各个列之间的空格,返回一个每行3列的列表 line = i.split(' ') res.append(line) # res 得到一个由若干行组成的列表
读入之后,可以对列表 res 进行遍历操作,观察 res 存放的数据。
列表 res 的元素类型是列表类型,res 是一个嵌套列表,本质上还是个列表。2.2 处理文本值
处理文本值就是将标签列值为 " +1" 前面的 “+” 去掉,将属性列值前面的 “1:” 和 “2:” 去掉,将最后一列删掉,处理代码如下:
for i in range(len(res)): # 将 "+" 替换掉 res[i][0] = res[i][0].replace('+','') # 对第 i 行,索引为 1 的列,字符串切片,重新赋值给第 i 行第 1 列 res[i][1] = res[i][1][2:] res[i][2] = res[i][2][2:] # 将 res 转换为 numpy 数组类型,取所有行,不取最后一列,也就是剔除掉最后一列 data = np.array(res)[:,:-1]
处理完成之后,再将 data 的内容进行打印出来。
通过观察我们可以发现,属性值和标签值都得到了处理。2.3 使用归一化函数
minMax = MinMaxScaler() # Normalize data data = np.hstack((minMax.fit_transform(data[:, 1:]), data[:, 0].reshape(data.shape[0], 1)))
在归一化时,我们需要使用 MinMaxScaler() 函数,这是一个归一化相关的函数。
其中,minMax.fit_transform(data[:, 1:])
是将 data 数组从第二列开始进行归一化处理,属性值缩放到 (0,1) 之间。data[:, 0].reshape(data.shape[0], 1)
是将标签列单独抽出来,抽出来之后实际为一个一行多列的列表,而我们需要改变它的形状,转换成一列多行。np.hstack()
函数 是将两个数组在水平方向上平铺,目的就是将标签列拼接到属性列后面,放到 data 最后一列。
处理完成之后,可以打印一下 data 的内容。
这就是我们想要的数据,下一就是将数组存放为 mat 格式的文件了。3. 存储为 mat 文件
其实,存储为 mat 格式的文件只需要一行代码就可以完成:
scipy.io.savemat('fourclass.mat', {'data': data})
但是,在存储之前我们还需先观察一下,data 中数据是否为整型或浮点型,因为字符串类型虽然可以存放到 mat 文件中,但是后续用于运算时必然会出现类型错误这样的异常。例如,我们就取第一列元素观察它的类型,观察数据类型的代码段如下:
for i in data: print(type(i[0]))
打印之后,我们发现元素类型都为 numpy.str, 也就是我们通常理解的字符串类型,显然这是不满足要求的。
所以,正确的做法应该是,先将 data 所有元素转换为 浮点型,之后才可以进行存储为 mat 格式的文件。data = data.astype(float) scipy.io.savemat('fourclass.mat', {'data': data})
在存储时,savemat() 函数第一个参数是我们的文件名,第二个参数是一个字典,前面的 ‘data’ 是键,后面的 data 是我们的 numpy 数组。需要注意的是,这个键名非常重要,这决定你后面用 Python 读取生成的 mat 文件如何取值,建议就用 ’data‘ 键名即可,不要自己去定义其他名字。
4 总结
上面我们将每个子过程单独拆开进行处理,主要是为了方便大家理解。整个过程的代码如下:
import numpy as np import scipy.io from sklearn.preprocessing import MinMaxScaler f = open(r"C:\Users\Desktop\fourclass.txt", 'r') lines = f.readlines() res = [] for i in lines: line = i.split(' ') res.append(line) for i in range(len(res)): res[i][0] = res[i][0].replace('+','') res[i][1] = res[i][1][2:] res[i][2] = res[i][2][2:] data = np.array(res)[:,:-1] minMax = MinMaxScaler() # Normalize data data = np.hstack((minMax.fit_transform(data[:, 1:]), data[:, 0].reshape(data.shape[0], 1))) #for i in data: # print(type(i[0])) data = data.astype(float) scipy.io.savemat('fourclass.mat', {'data': data})
运行代码,我们可以看到生成一个 fourclass.mat 格式文件。至此,利用 Python 对数据集进行归一化处理,并存储为 mat 格式的文件操作全部结束,以后可以自己去按照类似的过程去处理数据集。
-
数据标准化 Python代码
2021-01-12 08:09:49importpandasaspdimportnumpyasnpdatafile='../data/normalization_data.xls'#参数初始化data=pd.read_excel(datafile,header=None)#读取数据映射到0 − 100 0-1000−100区间>>>(data-data.min())/(d...import pandas as pd
import numpy as np
datafile = '../data/normalization_data.xls' # 参数初始化
data = pd.read_excel(datafile, header=None) # 读取数据
映射到0 − 100 0-1000−100区间>>> (data - data.min()) / (data.max() - data.min()) * (100 - 0) + 0# 最小-最大规范化
0 1 2 3
0 7.438017 93.729097 92.351974 100.000000
1 61.983471 0.000000 0.000000 85.094067
2 21.487603 11.956522 81.332237 0.000000
3 0.000000 100.000000 100.000000 56.367583
4 100.000000 94.230769 99.671053 80.414858
5 26.446281 83.862876 81.496711 90.931018
6 63.636364 84.698997 78.618421 92.957067
>>> (data - data.mean()) / data.std() # 零-均值规范化
0 1 2 3
0 -0.905383 0.635863 0.464531 0.798149
1 0.604678 -1.587675 -2.193167 0.369390
2 -0.516428 -1.304030 0.147406 -2.078279
3 -1.111301 0.784628 0.684625 -0.456906
4 1.657146 0.647765 0.675159 0.234796
5 -0.379150 0.401807 0.152139 0.537286
6 0.650438 0.421642 0.069308 0.59556
>>> data / 10 ** np.ceil(np.log10(data.abs().max())) # 小数定标规范化
0 1 2 3
0 0.078 0.521 0.602 0.2863
1 0.144 -0.600 -0.521 0.2245
2 0.095 -0.457 0.468 -0.1283
3 0.069 0.596 0.695 0.1054
4 0.190 0.527 0.691 0.2051
5 0.101 0.403 0.470 0.2487
6 0.146 0.413 0.435 0.2571
作者:Atom_QQ2022313691
链接:https://blog.csdn.net/qq_44864262/article/details/107740050
来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
NLP中的预处理:使用Python进行文本归一化
2020-04-21 13:18:53我们在有关词干的文章中讨论了文本归一化。 但是,词干并不是文本归一化中最重要(甚至使用)的任务。 我们还进行了其他一些归一化技术的研究,例如Tokenization,Sentencizing和Lemmatization。 但是,还有其他一些...我们在有关词干的文章中讨论了文本归一化。 但是,词干并不是文本归一化中最重要(甚至使用)的任务。 我们还进行了其他一些归一化技术的研究,例如Tokenization,Sentencizing和Lemmatization。 但是,还有其他一些用于执行此重要预处理步骤的小方法,将在本文中进行讨论。
请记住,没有适用于所有情况的“正确”归一化方法列表。 实际上,随着我们对NLP的深入研究,越来越多的人意识到NLP并不像人们想象的那样具有普遍性。 尽管有许多有趣的通用工具箱和预制管道,但更精确的系统是针对上下文量身定制的系统。
因此,不应将本文归一化的步骤列表作为硬性规则,而应将其作为对某些文章进行文本归一化的准则。 还必须指出的是,在极少数情况下,您可能不想归一化输入-文本中其中更多变化和错误很重要时(例如,考虑测试校正算法)。
了解我们的目标——为什么我们需要文本归一化
让我们从归一化技术的明确定义开始。 自然语言作为一种人力资源,倾向于遵循其创造者随机性的内在本质。 这意味着,当我们“产生”自然语言时,我们会在其上加上随机状态。 计算机不太擅长处理随机性(尽管使用机器学习算法已将随机性的影响降到最低)。
当我们归一化自然语言时,我们会尝试减少其随机性,使其更接近预定义的“标准”。 这有助于减少计算机必须处理的不同信息的数量,从而提高效率。
通过归一化,我们希望使“文本分布”更接近“正态”分布。 当我们归一化自然语言资源时,我们尝试减少其中的随机性
在那篇关于词干的文章中,我提到了归一化试图使事物更接近“正态分布”。 在某种意义上说是正确的,当我们归一化自然语言输入时,我们希望以“良好”和“可预测”的形状使事物“符合预期”,例如遵循正态分布。
除了数学领域之外,我们还可以讨论将归一化数据输入到我们的NLP系统中的好处。
首先,通过减少随机性,我们减少了待处理的输入变量,提高了总体性能并避免了误报(想象一下,如果软件日志行中没有错字,就会触发警告。 )。 对于系统和信息检索任务来说,这是非常正确的(想象一下,如果Google的搜索引擎仅与您键入的单词完全匹配!)。
从某种意义上讲,可以将归一化与“去除尖锐边缘”方法进行比较。
其次,尤其是在讨论机器学习算法时,如果我们使用的是字词袋或TF-IDF字典等简单的旧结构,则归一化会降低输入的维数; 或降低载入数据所需的处理量。
第三,归一化有助于在将输入传递给我们的决策NLP算法之前对其进行处理。 在这种情况下,我们确保我们的输入将在处理之前遵循“合同”。
最后,如果正确完成,归一化对于从自然语言输入中可靠地提取统计数据非常重要-就像在其他领域(例如时间序列分析)一样,归一化是NLP数据科学家/分析师/工程师手中重要的一步。
我们归一化的对象是什么?
这是一个重要的问题。 在进行文本归一化时,我们应该确切地知道我们要标归一什么以及为什么要归一化。 另外,输入数据的特点有助于确定我们将要用来归一化输入的步骤。 我们最感兴趣的是两件事:
- **句子结构:**它总是以标点符号结尾吗? 会出现重复的标点符号吗? 我们是否应该删除所有标点符号? 此外,可以使用更具体的结构(就像主谓宾结构),但很难实现。
- 词汇: 这是需要注意的核心内容之一。 大多数时候,我们希望我们的词汇量尽可能小。 原因是,在NLP中,词汇是我们的主要特征,而当我们在这些词汇中的变化较少时,我们可以更好地实现目标。
实际上,我们可以通过分解成更简单的问题来对这两个方面进行归一化。 以下是最常见的方法:
→删除重复的空格和标点符号。
→去除口音(如果您的数据包含来自“外国”语言的变音符号-这有助于减少与编码类型有关的错误)。
→去除大写字母(通常,使用小写单词可获得更好的结果。但是,在某些情况下,大写字母对于提取信息(例如名称和位置)非常重要)。
→删除或替换特殊字符/表情符号(例如:删除主题标签)。
→替换单词缩写(英语中很常见;例如:“我”→“我是”)。
→将单词数字转换为阿拉伯数字(例如:“二十三”→“ 23”)。
→为特殊符号替换(例如:“ $ 50”→“钱”)。
→缩写标准化(例如:“ US”→“美国” /“美国”,“ btw”→“顺便说一下”)。
→标准化日期格式,社会保险号或其他具有标准格式的数据。
→拼写纠正(可以说一个单词可以用无限方式拼写错误,因此拼写纠正可以通过“更正”来减少词汇变化)–如果您要处理推特,即时消息和电子邮件等开放用户输入的数据,这一点非常重要。
→通过词干去除性别/时间/等级差异。
→将稀有单词替换为更常见的同义词。
→停止定型化(比归一化技术更常见的降维技术)。
在本文中,我将只讨论其中一部分的实现。
如何做归一化工作
要选择我们将要使用的归一化步骤,我们需要一项特定的任务。 对于本文,我们将假设我们要提取3000个#COVIDIOTS主题标签的情绪集,以了解人们对COVID-19流行的看法。
我获得了这些推文,可以这里下载。 我还使用这个名为best-profanity的漂亮工具来审查不好的文字,如果需要,可以将其添加到规范化管道中。 他们也不包含撰写内容的人。
但是,我并没有继续删除每条推文中的姓名或检查任何政治立场等,因为这不是本文的目的,并且可以单独撰写另一篇文章(关于自动审查)。
在这种情况下,我们要执行以下步骤:删除重复的空白和标点符号; 缩写替代; 拼写更正。 另外,我们已经讨论了定形化,下面我们使用它。
在完成代码部分之后,我们将统计分析应用上述归一化步骤的结果。
关于规范化的一件重要事情是函数的顺序很重要。 我们可以说归一化是NLP预处理管道中的管道。 如果我们不谨慎,则可能删除对以后的步骤很重要的信息(例如在定形之前删除停用词)。
我们甚至可以将这些步骤分为两个连续的组:“标记前步骤”(用于修改句子结构的步骤)和“标记后步骤”(仅用于修改单个标记的步骤),以避免重复标记步骤。 但是,为简单起见,我们使用.split()函数。
像生产线一样,归一化步骤的顺序也很重要。
将推文解析为字符串列表之后,就可以开始创建函数了。 顺便说一句,我在列表周围使用了一个名为tqdm的漂亮模块,因此一旦应用归一化过程,我们就会获得漂亮的进度条。 以下是所需的导入:
from symspellpy.symspellpy import SymSpell, Verbosity import pkg_resources import re, string, json import spacy from tqdm import tqdm #Or, for jupyter notebooks: #from tqdm.notebook import tqdm
删除重复的空白和重复的标点符号(和网址):
这一步骤用简单的正则表达式替换完成。 有改进的余地,但是可以满足我们的期望(这样,我们就不会有多种尺寸的标度和感叹号标记)。 我们删除网址,因为这会减少很多我们拥有的不同令牌的数量(我们首先这样做,因为标点替换可能会阻止它)。
def simplify_punctuation_and_whitespace(sentence_list): norm_sents = [] print("Normalizing whitespaces and punctuation") for sentence in tqdm(sentence_list): sent = _replace_urls(sentence) sent = _simplify_punctuation(sentence) sent = _normalize_whitespace(sent) norm_sents.append(sent) return norm_sents def _replace_urls(text): url_regex = r'(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})' text = re.sub(url_regex, "<URL>", text) return text def _simplify_punctuation(text): """ This function simplifies doubled or more complex punctuation. The exception is '...'. """ corrected = str(text) corrected = re.sub(r'([!?,;])\1+', r'\1', corrected) corrected = re.sub(r'\.{2,}', r'...', corrected) return corrected def _normalize_whitespace(text): """ This function normalizes whitespaces, removing duplicates. """ corrected = str(text) corrected = re.sub(r"//t",r"\t", corrected) corrected = re.sub(r"( )\1+",r"\1", corrected) corrected = re.sub(r"(\n)\1+",r"\1", corrected) corrected = re.sub(r"(\r)\1+",r"\1", corrected) corrected = re.sub(r"(\t)\1+",r"\1", corrected) return corrected.strip(" ")
缩写替换
使用维基百科中的缩略词列表,我们遍历句子并用它们的实际单词替换这些缩略词(这需要在标记化之前发生,因为一个标记被分成两部分)。 这有助于以后句子结构的改进。
def normalize_contractions(sentence_list): contraction_list = json.loads(open('english_contractions.json', 'r').read()) norm_sents = [] print("Normalizing contractions") for sentence in tqdm(sentence_list): norm_sents.append(_normalize_contractions_text(sentence, contraction_list)) return norm_sents def _normalize_contractions_text(text, contractions): """ This function normalizes english contractions. """ new_token_list = [] token_list = text.split() for word_pos in range(len(token_list)): word = token_list[word_pos] first_upper = False if word[0].isupper(): first_upper = True if word.lower() in contractions: replacement = contractions[word.lower()] if first_upper: replacement = replacement[0].upper()+replacement[1:] replacement_tokens = replacement.split() if len(replacement_tokens)>1: new_token_list.append(replacement_tokens[0]) new_token_list.append(replacement_tokens[1]) else: new_token_list.append(replacement_tokens[0]) else: new_token_list.append(word) sentence = " ".join(new_token_list).strip(" ") return sentence
拼写矫正
现在,这是一个棘手的问题。 它可能会引起一些不需要的更改(大多数可纠正拼写的词典缺少重要的上下文单词,因此他们将它们视为拼写错误)。 因此,您必须有意识地使用它。 有很多方法可以做到这一点。 我选择使用名为symspellpy的模块,该模块的速度非常快(这很重要!),并且可以很好地完成这项工作。 做到这一点的另一种方法是,训练一个深度学习模型来基于上下文进行拼写校正,但这完全是另一回事了。
def spell_correction(sentence_list): max_edit_distance_dictionary= 3 prefix_length = 4 spellchecker = SymSpell(max_edit_distance_dictionary, prefix_length) dictionary_path = pkg_resources.resource_filename( "symspellpy", "frequency_dictionary_en_82_765.txt") bigram_path = pkg_resources.resource_filename( "symspellpy", "frequency_bigramdictionary_en_243_342.txt") spellchecker.load_dictionary(dictionary_path, term_index=0, count_index=1) spellchecker.load_bigram_dictionary(dictionary_path, term_index=0, count_index=2) norm_sents = [] print("Spell correcting") for sentence in tqdm(sentence_list): norm_sents.append(_spell_correction_text(sentence, spellchecker)) return norm_sents def _spell_correction_text(text, spellchecker): """ This function does very simple spell correction normalization using pyspellchecker module. It works over a tokenized sentence and only the token representations are changed. """ if len(text) < 1: return "" #Spell checker config max_edit_distance_lookup = 2 suggestion_verbosity = Verbosity.TOP # TOP, CLOSEST, ALL #End of Spell checker config token_list = text.split() for word_pos in range(len(token_list)): word = token_list[word_pos] if word is None: token_list[word_pos] = "" continue if not '\n' in word and word not in string.punctuation and not is_numeric(word) and not (word.lower() in spellchecker.words.keys()): suggestions = spellchecker.lookup(word.lower(), suggestion_verbosity, max_edit_distance_lookup) #Checks first uppercase to conserve the case. upperfirst = word[0].isupper() #Checks for correction suggestions. if len(suggestions) > 0: correction = suggestions[0].term replacement = correction #We call our _reduce_exaggerations function if no suggestion is found. Maybe there are repeated chars. else: replacement = _reduce_exaggerations(word) #Takes the case back to the word. if upperfirst: replacement = replacement[0].upper()+replacement[1:] word = replacement token_list[word_pos] = word return " ".join(token_list).strip() def _reduce_exaggerations(text): """ Auxiliary function to help with exxagerated words. Examples: woooooords -> words yaaaaaaaaaaaaaaay -> yay """ correction = str(text) #TODO work on complexity reduction. return re.sub(r'([\w])\1+', r'\1', correction) def is_numeric(text): for char in text: if not (char in "0123456789" or char in ",%.$"): return False return True
合理化
如果您一直关注我的系列文章,那么您已经知道我已经实现了自己的lemmatizer。 但是,为了简单起见,我选择在这里使用传统方法。 它快速而直接,但是您可以使用任何其他所需的工具。 我还决定删除(替换)所有标签。 对于情感分析,我们并不是真的需要它们。
def lemmatize(sentence_list): nlp = spacy.load('en') new_norm=[] print("Lemmatizing Sentences") for sentence in tqdm(sentence_list): new_norm.append(_lemmatize_text(sentence, nlp).strip()) return new_norm def _lemmatize_text(sentence, nlp): sent = "" doc = nlp(sentence) for token in doc: if '@' in token.text: sent+=" @MENTION" elif '#' in token.text: sent+= " #HASHTAG" else: sent+=" "+token.lemma_ return sent
最后,我们将所有步骤加入“pipeline”函数中:
def normalization_pipeline(sentences): print("##############################") print("Starting Normalization Process") sentences = simplify_punctuation_and_whitespace(sentences) sentences = normalize_contractions(sentences) sentences = spell_correction(sentences) sentences = lemmatize(sentences) print("Normalization Process Finished") print("##############################") return sentences
在Google Colab Notebook中运行函数结果
您可能想知道:应用这些任务的结果是什么? 我已经运行了一些计数功能并绘制了一些图表来帮助解释,但我必须清楚一件事:数字表示不是表达文本归一化重要性的最佳方法。
相反,当将文本规范化应用于NLP应用程序时,它可以通过提高效率,准确性和其他相关分数来发挥最佳作用。 我将指出一些可以从统计数据中清楚看到的好处。
首先,我们可以清楚地看到不同令牌总数的减少。 在这种情况下,我们将令牌数量减少了约32%。
将归一化应用于我们的数据后,我们将令牌数量减少了约32%。
Distinct words in unnormalized: 15233–80% of the text correspond to 4053 distinct words. Distinct words in normalized: 10437–80% of the text correspond to 1251 distinct words.
现在,通用令牌的数量出现了更大的差异。 这些令牌包括了所有数据的大约80%。 通常,我们通过大约10–20%的令牌范围构成了文本的80%。
通过应用归一化,我们将最常见的令牌数量减少了69%! 非常多! 这也意味着我们对此数据的任何机器学习技术都将能够更好地推广。
归一化后,最常见的令牌数量减少了69%。
现在,关于文本归一化的一件重要的事是,为了使文本规范化有用,它必须保留默认的自然语言结构。 我们可以通过数据本身看到这一点。 一个例子是,如果做得好,归一化后的句子将不会变得越来越小。
在下面的直方图中显示了这一点,它表明,尽管归一化后我们的1尺寸句子较少,而2尺寸句子较多,但其余分布遵循未归一化数据的结构(请注意,我们的曲线稍微接近正态分布曲线)。
归一化对整体句子结构影响不大。
另一个有助于我们可视化的工具是Boxplot。 它显示了我们的数据如何分布,包括均值,四分位数和离群值。 总而言之,我们希望我们的中线与未规范化数据的中线相同(或接近)。 我们还希望框(大多数数据的分布)保持在相似的位置。 如果我们能够增加数据量的大小,这意味着我们在中位数周围的数据比归一化之前要多(这很好)。 此外,我们要减少离群值。
归一化之后,我们能够增加四分位间距(大多数标记所在的位置)。 我们还保持相同的中线并减少了异常值。 这意味着我们没有破坏我们的文本,但是使它变得不那么复杂)。
结论
我希望在本文中能够解释什么是文本归一化,为什么要这样做以及如何做。
这是几个链接和一个用于进一步研究的文档:
链接:http://mlwiki.org/index.php/Text_Normalization
链接:https://www.aclweb.org/anthology/W18-3902/
作者:Tiago Duque
翻译:孟翔杰
获取本文资源,请关注公众号
-
几种数据预处理方法汇总(标准/中心化、归一化、正则化)+Python代码
2020-10-22 22:00:23数据的标准化(规范化/归一化) 数据标准化是将样本的属性缩放到某个指定的范围。 数据标准化的原因: 某些算法要求样本具有零均值和单位方差; 需要消除样本不同属性具有不同量级时的影响:①数量级的差异将导致... -
【Python数据预处理】 归一化(按列减均值,除方差),标准化(按列缩放到指定范围),正则化(范数)
2018-11-06 08:32:57一、标准化(Z-Score),或者去除均值和方差缩放 公式为:(X-mean)/std 计算时对每个属性/每列分别进行。 将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都... -
如何基于python实现归一化处理
2020-11-28 14:46:22这篇文章主要介绍了如何基于python实现归一化处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下一、定义归一化方法有两种形式,一种是把数变为(0,1)之间的... -
Python小题目10:条件控制之文本归一化处理并写入CSV文件
2021-12-03 22:50:59本章阐述比较简单的归一化处理,主要是利用条件结构与循环结合文件的读取写入 -
Python数据预处理-数据标准化(归一化)及数据特征转换
2019-04-18 10:06:08一、数据标准化(归一化) 首先,数据标准化处理主要包括数据同趋化处理(中心化处理)和无量纲化处理。同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑... -
Python接口与归一化设计
2020-12-01 09:49:191.什么是接口(interface)接口(interface)是面向对象编程语言中接口操作的关键字,功能是把所需成员组合起来,用来装封一定功能的...2.归一化使用接口的意义在于归一化,什么叫归一化:就是只要是基于同一个接口实现... -
Python文本数据分析
2020-11-20 22:38:34但注意,文本分析的目的是否与时态、单复数相关,如果相关,则不可随意进行归一化。 词性标注:为每个分词标注词性,在NLTK库中,nltk.word_tokenize()语句可实现该功能。 停用词:为节省存储空间和提高搜索效率,... -
01 Python数据可视化:时间序列可视化简明教程
2022-01-04 17:47:21时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式。 时间序列数据在数据科学... -
关于python:对熊猫数据框的分位数归一化
2020-12-09 17:58:22简而言之,如何在Python中的大型Pandas数据帧(大约2,000,000行)上应用分位数归一化?PS。 我知道有一个名为rpy2的程序包,可以在R中使用分位数归一化在子进程中运行R。但是事实是,当我使用如下数据集时,R无法计算... -
为什么要进行数据归一化
2021-12-24 01:23:21数据集归一化代码: from sklearn import preprocessing df = pd.read_csv('covtype.csv') x = df[df.columns[:55]] y = df.Cover_Type x_train, x_test, y_train, y_test = train_test_split(x, y , train_size = ... -
python 数据归一化方法
2019-03-15 20:28:55这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、... -
YOLOv5学习实战二:XML文件转化为TXT文件并且归一化用于yolov5训练 python代码
2022-02-25 21:53:40from pathlib import Path import os # 进行归一化操作 def convert(size, box): # size:(原图w,原图h) , box:(xmin,xmax,ymin,ymax) dw = 1./size[0] # 1/w dh = 1./size[1] # 1/h x = (box[0] + box[1])/2.0 # ... -
用python标准化excel数据并保存到excel,csv文件中
2021-05-17 21:23:59用python标准化excel数据并保存到excel 欢迎使用Ma 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的... -
数据从txt文本导入python
2020-11-24 09:05:17机器学习实战 p21源代码:def file2matrix(filename):fr = open(filename)numberOfLines = len(fr.readlines()) #get the number of lines in the filereturnMat = zeros((numberOfLines,3)) #prepare matrix t... -
Python数据分析与数据化运营 第2版
2020-12-10 12:46:05前言第1章 Python和数据化运营11.1 用Python做数据化运营11.1.1 Python是什么11.1.2 数据化运营是什么21.1.3 Python用于数据化运营51.2 数据化运营所需的Python相关工具和组件51.2.1 Python程序61.2.2 ... -
数据可视化——plt:用python画图(一)
2022-01-14 16:21:13从零学习plt,用python画图,让数据随自己心意有意思起来! -
Python数据可视化教程之基础篇
2020-08-27 22:27:14matplotlib python中最基本的作图库就是matplotlib,是一个最基础的Python可视化库,一般都是从matplotlib上手Python数据可视化,然后开始做纵向与横向拓展。 Seaborn 是一个基于matplotlib的高级可视化效果库,... -
Python 基于卷积神经网络(textCnn)对药品或疾病分类(适用于疾病归一化和药品归一化)
2022-03-29 15:20:17文本卷积神经网络进行药品或者疾病分类,也可以用于疾病归一化等等 -
机器学习之数据抽取、特征处理、降维、归一化标准化、处理缺失值的Scikit-Learn代码实现
2020-06-22 12:34:35机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测! 应用场景 很有可能我们看到的新闻是机器人写的! 图像识别 辅助医生进行诊断,对比二张ct的不同 图片艺术化,相当于ps 人脸识别... -
Python数据分析小案例——红楼梦文本分析(一) 文本预处理
2020-12-01 23:34:06本文开始介绍一个简单的数据分析案例,分析红楼梦文本,本文主要内容是将红楼梦文本按照章节获取每一回的标题,字数,段落数并保存到csv中方便后续数据分析红楼梦小说文本可以在这里下载链接:...3xco接下来直接上代码... -
python 中文文本分类
2017-02-06 11:31:21写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养...本文假定,你对python已经有了最基本的掌握。 如果你希望能够 -
Python之继承,接口归一化和抽象
2020-08-06 10:01:34继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类,继承又fenwei单继承和多继承 2、继承与抽象 抽象分成两个层次: 1.将奥巴马和梅西这... -
python数据处理 高清带目录版
2018-03-14 10:02:068.1 数据归一化和标准化 153 8.2 数据存储 154 8.3 找到适合项目的数据清洗方法 156 8.4 数据清洗脚本化 157 8.5 用新数据测试 170 8.6 小结 172 第9 章 数据探索和分析 173 9.1 探索... -
标准化,归一化与训练-测试集数据处理
2021-02-20 12:11:01标准化,归一化与训练-测试集数据处理1. 标准化,归一化的区别数据预处理的归一化手段应该如何应用到训练集,测试集和验证集中?问题:回答1:回答2问题3回答1回答2问题4回答1 1. 标准化,归一化的区别 作者:宝珠... -
机器学习和数据集介绍、数据集划分、特征抽取、归一化
2020-12-04 09:15:57机器学习介绍和数据集...很难明确的定义,简单的来说,机器学习就是利用数学方法和计算机技术通过对历史数据进行分析得到规律(模型),并利用规律对未知数据进行预测。数据集:机器学习是从历史数据获得规律,那这些... -
Python数据分析与应用:从数据获取到可视化
2020-12-23 14:40:56本书采用理论与案例相结合的形式,以Anaconda为主要开发工具,系统、全面地介绍了Python数据分析的相关知识。全书共分为9章,第1章介绍了数据分析的基本概念,以及开发...第7、8章主要介绍了时间序列和文本数据的分...