当前位置:   article > 正文

自然语言处理-语料清洗_自然语言处理 语料清洗 实验

自然语言处理 语料清洗 实验

1 实验介绍

1.1 关于本实验

语料清洗是自然语言处理的第一步,对最终结果起到决定性作用。要实验重点讲解了语料的清洗策略,填充缺失值、消除异常值和平滑噪声数据等清洗方法。介绍数据替换、数据映射、数据合并和数据补充等数据转换功能,missingno库用于数据分析前的数据检查,查看数据集完整性。词云用于可视化地显示数据相关信息。

1.2 实验目的

了解语料清洗的基本概念;理解常见清洗策略,掌握缺失值清洗、异常值清洗、重复值清洗等常用语料清洗的方法;掌握数据值的替换、映射、合并、补充等常见操作。

2 认识语料清洗

由于原始文本含有“脏"数据,无法直接用来训练模型,会严重干扰数据分析的结果,因此需要进行清洗,保留有用的数据。“脏”数据是指缺失值、异常值、离群点等数据。语料清洗用于纠正语料数据中不一致的内容,通常会占据数据分析50%~80%的工作量。经过数据清洗的数据,应该满足以下特点。

(1)所有值都是数字。

机器学习算法的所有数据都是数字,需要将非数字值(在类别或文本列中的内容)需要替换为数字标识符。

(2)标识并清除无效值记录。

无效值无法反映实际问题。

(3)识别并消除无关类别。

所有记录都需要使用一致类别。

【任务1】语料清洗

str='''??? 程序员是从事程序开发、维护的专业人员。%%##aba一般将程序员分为程序设计人员和程序编码人员,<boby>但两者的78界限并不非常清楚,软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。'''
import re                                                  #引入正则表达式
pattern =re.compile(r'[^\u4e00-\u9fa5]')                   # 过滤掉数字、符号、字符等特殊字符
chinese_txt =re.sub(pattern,'',str)
print(chinese_txt)
  • 1
  • 2
  • 3
  • 4
  • 5

程序运行结果如下:

程序员是从事程序开发维护的专业人员一般将程序员分为程序设计人员和程序编码人员但两者的界限并不非常清楚特别是在中国软件从业人员分为初级程序员高级程序员系统分析员和项目经理四大类

代码分析如下

str文本中不仅包含中文字符,还包括数字、标签、英文字符、标点等非常规字符,这些都是无意义的信息,与文本内容所要表达的主题没有任何关联。通过正则表达式进行清洗。

3 清洗策略

3.1 一致性检查

一致性检查是根据每个变量的合理取值范围和相互关系,检查数据是否合乎要求,发现超出正常范围的数据。例如,体重出现了负数、年龄超出正常值范围。SPSS、Excel等软件能够自动识别超出范围的变量值。

3.2 格式内容检查

多源的数据往往在格式和内容上存在很多问题,例如,时间、日期、数值、全半角等显示格式不一致等。例如,性别字段,某来源为“男”和“女”,某来源为“0”和“1”,需要进行格式内容检查。

3.3 逻辑检查

通过逻辑推理发现不合理或者相互矛盾的问题数据。例如,“身份证号”和“年龄”两个字段,可以进行相互验证。

4 缺失值清洗

4.1认识缺失值

缺失值是指记录的缺失和记录中某个字段信息的缺失,一股以空白、NaN或其他占位符进行编码。缺失值往往采用删除法和数据填充法进行处理。

删除法:如果某个属性的缺失值过多,可以直接删除整个属性。

数据填充法:使用属性的平均值、中位数、固定值、最近值、最大、最小值等填充。常用的填充方法如下:

填充方法方法描述
平均值根据属性值类型,用该属性取值的平均
中位数根据属性值类型,用该属性取值的中位数填充
固定值将缺失的属性值用一个常量替换
最近值用最接近缺失值的属性值填充
最大、最小值根据属性值类型,最大值、最小值进行填充

4.2 Pandas 处理

Pandas使用浮点值NaN表示缺失值,缺失值的处理有df.fillna()和df.dropna()两个函数。

函数名功能
df.fillna(num)用实数num填充缺失值
df.dropna()删除DataFrame数据中的缺失数据

使用df.fillna()用实数填充缺失值,语法形式如下。

DataFrame.fillna(value=None,method=None,axis=None,inplace=None,limit=None)

参数说明如下:

参数说明
value用于填充缺失值的标量值或字典对象
method插值方式
axis数据删除维度:取值0为行;取值1为列
inplace修改调用者对象而不产生副本
limit可以连续填充的最在数量

【任务2】df.fillna()实例

from numpy import nan as NaN
import pandas as pd
df1=pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[8,8,NaN]])  
print("df1:\n{}\n".format(df1))
df2=df1.fillna(100)
print("df2:\n{}\n".format(df2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

程序运行结果如下:

df1:
0 1 2
0 1.0 2.0 3.0
1 NaN NaN 2.0
2 NaN NaN NaN
3 8.0 8.0 NaN

df2:
0 1 2
0 1.0 2.0 3.0
1 100.0 100.0 2.0
2 100.0 100.0 100.0
3 8.0 8.0 100.0

使用df.dropna()删除DataFrame缺失数据所在的行或列,语法形式如下。

DataFrame.dropna(axis=0,how=‘any’,thresh=None,subset=None,inplace=False)

参数说明如下:

参数说明
axis数据删除维度:取值0为行;取值1为列
how{‘any’,‘all’},默认为’any’,表示删除带有nan的行;all表示删除全为nan的行
threshint,保留至少int个非nan行
subset部分标签中删除某些列
inplacebool,是否修改源文件

【任务3】df.dropna()实例

from numpy import nan as NaN
import pandas as pd
df1=pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[8,8,NaN]])  
print("df1:\n{}\n".format(df1))
df2=df1.dropna()
print("df2:\n{}\n".format(df2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
'
运行

程序运行结果如下:

df1:
0 1 2
0 1.0 2.0 3.0
1 NaN NaN 2.0
2 NaN NaN NaN
3 8.0 8.0 NaN

df2:
0 1 2
0 1.0 2.0 3.0

4.3 Sklearn处理

Sklearn中Imputer类或SimpleImputer类用于处理缺失值。其中,Imputer类在preprocessing模块中,而Simplelmputer类在sklearn.impute模块中。

Imputer具体语法如下:

from sklearn.preprocessing import Imputer

imp =Imputer(missing_values=“NaN”,strategy=“mean”)

Simplelmputer具体语法如下:

from sklearn.impute import SimpleImputer

imp =SimpleImputer(missing_values=np.nan,strategy=“mean”)

参数含义如下:

missing_values=np.nan:缺失值是nan。

strategy="mean”:用平均数、中位数等插值方法的数据。

【任务4】sklearn中 imputer 类或SimpleImputer类实例

import pandas as pd
import numpy as np
#from sklearn.preprocessing import Imputer 
from sklearn.impute import SimpleImputer
df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
["L", np.nan, "gray", "class 2", 20],
["XL", 10, "blue", "class 2", 19],
["M", np.nan, "orange", "class 1", 17],
["M", 11, "green", "class 3", np.nan],
["M", 7, "red", "class 1", 22]])
df.columns=["size", "price", "color", "class", "boh"]
print(df)
# 1. 创建Imputer器
#imp =Imputer(missing_values="NaN", strategy="mean" )
imp =SimpleImputer(missing_values=np.nan, strategy="mean")
# 2. 使用fit_transform()函数完成缺失值填充
df["price"]=imp.fit_transform(df[["price"]])
print(df)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

程序运行结果如下:

size price color class boh
0 XXL 8.0 black class 1 22.0
1 L NaN gray class 2 20.0
2 XL 10.0 blue class 2 19.0
3 M NaN orange class 1 17.0
4 M 11.0 green class 3 NaN
5 M 7.0 red class 1 22.0
size price color class boh
0 XXL 8.0 black class 1 22.0
1 L 9.0 gray class 2 20.0
2 XL 10.0 blue class 2 19.0
3 M 9.0 orange class 1 17.0
4 M 11.0 green class 3 NaN
5 M 7.0 red class 1 22.0

5 异常值清洗

异常值双称为离群点或噪声数据,是指特征属性中的个别数值明显偏离其余数据的值。检测异常值往往有散点图、箱线图和3σ法则。

5.1 散点图方法

散点图通过展示两组数据的位置关系,可以展示数据的分布和聚合情况,可以清晰直观地看出哪些值是离群点。Matplotlib、Pandas和Seaborn等都提供散点图绘制方法。

【任务5】散点图方法实例

import numpy  as  np
import pandas as pd

wdf = pd.DataFrame(np.arange(20),columns=['W'])
wdf['Y']=wdf['W']*1.5+2
wdf.iloc[3,1]=128
wdf.iloc[18,1]=150
wdf.plot(kind = 'scatter', x='W',y='Y')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
'
运行
<Axes: xlabel='W', ylabel='Y'>
  • 1

在这里插入图片描述

5.2 箱线图方法

箱线图又称箱形图或盒式图。不同于折线图、柱状图或饼图等传统图表只是数据大小、占比、趋势的呈现,箱线图包含统计学的均值、分位数、极值等统计量,用于分析不同类别数据平均水平差异,展示属性与中位数离散速度,并揭示数据间离散程度、异常值、分布差异等。箱线图是一种基于“五位数”显示数据分布的标准化方法。

“五位数”是指箱形图的5个参数。

(1)下边缘(Q1)表示最小值。

(2)下四分位数(Q2)又称“第一四分位数”,由小到大排列后第25%的数字。

(3)中位数(Q3)又称“第二四分位数”,由小到大排列后第50%的数字。

(4)上四分位数(Q4)又称“第三四分位数”,由小到大排列后第75%的数字。

(5)上边缘(Q5)表示最大值。

箱形图以四分位数和四分位距为基础判断是否是异常值。当数据在箱线图中超过上四分位1.5倍四分位距或下四分位1.5倍距离时,即小于Q1-1.5IQR或大于Q3+1.5IQR的值时被认为是异常值。

【任务6】箱形图实例

import numpy  as  np
import pandas as pd

wdf = pd.DataFrame(np.arange(20),columns=['W'])
wdf['Y']=wdf['W']*1.5+2
wdf.iloc[3,1]=128
wdf.iloc[18,1]=150
import matplotlib.pyplot as plt
plt.boxplot(wdf)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
'
运行

在这里插入图片描述

5.3 3σ法则

对于正态分布数据而言,数值分布在(μ-σ,μ+σ)中的概率为0.6827;在(μ-2σ,μ+2σ)中的概率为0.9545;在(μ-3σ,μ+3σ)中的概率为0.9973(μ为平均值,σ为标准差)。3σ原则,又叫拉依达原则,认为数据的取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的数据是异常值。

【任务7】3σ法则实例

import numpy as np
import pandas as pd
from scipy import stats
# 创建数据
data = [1222, 87, 77, 92, 68, 75, 77, 80, 78, 123, 3, 23, 32]
df = pd.DataFrame(data,columns = ['value'])
# 计算均值
u = df['value'].mean()
# 计算标准差
std = df['value'].std()

#输出结果中第一个为统计量,第二个为P值
#统计量越接近0就越表明数据和标准正态分布拟合的越好
#P值 通常是0.05,表示样本的总体服从正态分布
print(stats.kstest(df,'norm',(u, std)))
# pvalue > 0.05,不拒绝原假设,数据服从正态分布

print('均值为:%.3f,标准差为:%.3f'%(u,std))
print( '------')
# 定义3σ法则识别异常值
# 识别异常值
error = df[np.abs(df['value']-u)>3*std]
# 剔除异常值,保留正常的数据
data_c = df[np.abs(df['value']-u)<= 3*std]
print("输出正常的数据")
print(data_c)
print("输出异常数据")
print(error)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

程序运行结果如下:

KstestResult(statistic=0.9995370512363594, pvalue=8.973421490365488e-44)
均值为:156.692,标准差为:321.639
------
输出正常的数据
    value
1      87
2      77
3      92
4      68
5      75
6      77
7      80
8      78
9     123
10      3
11     23
12     32
输出异常数据
   value
0   1222
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

异常值处理常用方法如下:

(1)删除:直接删除含有异常值的记录

(2)视为缺失值:利用缺失值处理方法

(3)采用平均值修正:用前后两个观测值的平均值修正该异常值

6 重复值清洗

重复值会影响数据分析的准确性,消除重复值的基本思想是“排序和合并”,将数据进行排序后,比较邻近记录是否相似来检测记录是否重复。NumPy和Pandas分别提供重复值的检测和清洗等。

6.1 NumPy处理

NumPy提供unique()函数返回数组元素的唯一值。

【任务8】使用numpy的unique函数去除重复值实例

import numpy as np
names=np.array(['红色','蓝色','红色','白色','白色','红色','绿色','红色'])
print('原数组:',names)
print('去重后的数组:',np.unique(names))
  • 1
  • 2
  • 3
  • 4
'
运行

程序运行结果如下:

原数组: [‘红色’ ‘蓝色’ ‘红色’ ‘白色’ ‘白色’ ‘红色’ ‘绿色’ ‘红色’]
去重后的数组: [‘白色’ ‘红色’ ‘绿色’ ‘蓝色’]

6.2 Pandas处理

Pandas提供的df.duplicated和df.drop_duplicates用于和理重复值。其中,df.duplicated用于判断各行是否重复,df.drop_duplicates用于删除重复行,语法形式如下:

DataFrame(Series).drop_duplicates(self,subset=None,keep=‘first’,subset=None,inplace=False)

参数说明如下:

(1)subset:接收string或sequence,表示进行去重的列,默认为全部列。

(2)keep:表示重复时保留第几个数据,first保留第一个,last保留最后一个。

(3)inplace:表示是否在原表上进行操作,默认为False。

【任务9】df.duplicated()实例

import pandas as pd  # 导入Pandas库
#生成异常数据
data1, data2, data3, data4 = ['a', 3], ['b', 2], ['a', 3], ['c', 2]
df = pd.DataFrame([data1, data2, data3, data4], columns=['col1', 'col2'])
print("数据为:\n",df)  # 打印输出

isDuplicated = df.duplicated()    # 判断重复数据记录
print("重复值为:\n",isDuplicated)                      # 打印输出
print("删除数据记录中所有列值相同的记录\n",df.drop_duplicates())           
# 删除数据记录中所有列值相同的记录
print("删除数据记录中col1值相同的记录\n",df.drop_duplicates(['col1']))       
# 删除数据记录中col1值相同的记录
print("删除数据记录中col2值相同的记录\n",df.drop_duplicates(['col2']))       
# 删除数据记录中col2值相同的记录
print("删除数据记录中指定列(col1/col2)值相同的记录\n",df.drop_duplicates(['col1', 'col2']))  
# 删除数据记录中指定列(col1/col2)值相同的记录
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
'
运行

程序运行结果如下:

数据为:
   col1  col2
0    a     3
1    b     2
2    a     3
3    c     2
重复值为:
 0    False
1    False
2     True
3    False
dtype: bool
删除数据记录中所有列值相同的记录
   col1  col2
0    a     3
1    b     2
3    c     2
删除数据记录中col1值相同的记录
   col1  col2
0    a     3
1    b     2
3    c     2
删除数据记录中col2值相同的记录
   col1  col2
0    a     3
1    b     2
删除数据记录中指定列(col1/col2)值相同的记录
   col1  col2
0    a     3
1    b     2
3    c     2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

7 数据转换

Pandas提供数据转换的相关函数如下:

函数名说明
df.replace(a,b)指用b值替换a值
df[‘coll’].map()对指定列进行函数转换,用于Series
pd.merge(df1,df2)用于合并df1和df2,按照共有的列连接
df1.combine_first(df2)用df2的数据补充df1的缺失值

7.1 数据值替换

df.replace(a,b)指用b值替换a值。

【任务10】df.replace()实例

import pandas as pd
#创建数据集
df = pd.DataFrame(
        {  '名称':['产品1','产品2','产品3','产品4','产品5','产品6','产品7','产品8'],
            '数量':['A','0.7','0.8','0.4','0.7','B','0.76','0.28'],
            '金额':['0','0.48','0.33','C','0.74','0','0','0.22'],
            '合计':['D','0.37','0.28','E','0.57','F','0','0.06'], }
        )
#原DataFrame并没有改变,改变的只是一个复制品。
print("df:\n{}\n".format(df))
df1=df.replace('A', 0.1)
print("df1:\n{}\n".format(df1))
#只需要替换某个数据的部分内容
df2=df['名称'].str.replace('产品', 'product')
print("df2:\n{}\n".format(df2))
#如果需要改变原数据,需要添加常用参数 inplace=True,用于替换部分区域
df['合计'].replace({'D':0.11111, 'F':0.22222}, inplace=True)
print("df:\n{}\n".format(df))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
'
运行

程序运行结果如下:

df:
名称 数量 金额 合计
0 产品1 A 0 D
1 产品2 0.7 0.48 0.37
2 产品3 0.8 0.33 0.28
3 产品4 0.4 C E
4 产品5 0.7 0.74 0.57
5 产品6 B 0 F
6 产品7 0.76 0 0
7 产品8 0.28 0.22 0.06

df1:
名称 数量 金额 合计
0 产品1 0.1 0 D
1 产品2 0.7 0.48 0.37
2 产品3 0.8 0.33 0.28
3 产品4 0.4 C E
4 产品5 0.7 0.74 0.57
5 产品6 B 0 F
6 产品7 0.76 0 0
7 产品8 0.28 0.22 0.06

df2:
0 product1
1 product2
2 product3
3 product4
4 product5
5 product6
6 product7
7 product8
Name: 名称, dtype: object

df:
名称 数量 金额 合计
0 产品1 A 0 0.11111
1 产品2 0.7 0.48 0.37
2 产品3 0.8 0.33 0.28
3 产品4 0.4 C E
4 产品5 0.7 0.74 0.57
5 产品6 B 0 0.22222
6 产品7 0.76 0 0
7 产品8 0.28 0.22 0.06

7.2 数据值映射

df[‘coll’].map()对指定列进行函数转换,用于Series

【任务11】df[].map实例

import pandas as pd
import numpy as np
data ={'姓名':['周元哲','潘婧','詹涛','王颖','李震'],'性别':['1','0','0','0','1']}
df = pd.DataFrame(data)
df['成绩']=[98,87,32,67,77]
print(df)
def grade(x):
    if x>=90:
        return '优秀'
    elif x>=80:
        return '良好'
    elif x>=70:
        return '中等'
    elif x>=60:
        return '及格'
    else:
        return '不及格'
df['等级']=df['成绩'].map(grade)        
print(df)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
'
运行

程序运行结果如下:

姓名 性别 成绩
0 周元哲 1 98
1 潘婧 0 87
2 詹涛 0 32
3 王颖 0 67
4 李震 1 77
姓名 性别 成绩 等级
0 周元哲 1 98 优秀
1 潘婧 0 87 良好
2 詹涛 0 32 不及格
3 王颖 0 67 及格
4 李震 1 77 中等

7.3 数据值合并

pd.merge(df1,df2) 用于合并df1和df2,按照共有的列连接,语法形式如下:

pd.merge(left,right,how=‘inner’,no=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True)

参数如下:

left:拼接的左侧DataFrame对象。

right:拼接的右侧DataFrame对象。

on:要加人的列或索引级别名称。

left_on:左侧DataFrame中的列。

right_on:右侧DataFrame中的列。

left_index:使用左侧DataFrame中的索引(行标签)作为边接键。

right_index:使用右侧DataFrame中的索引(行标签)作为边接键。

how:取值(‘left’,‘right’,‘outer’,‘inner’),默认为inner。inner表示取交集,outer表示取并集。

sort:按字典顺序通过连接键对结果DataFrame进行排序。

【任务12】pd.merge(df1,df2)实例

import pandas as pd
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(left, right, on='key')
# on参数传递的key作为连接键
print("left:\n{}\n".format(left))
print("right:\n{}\n".format(right))
print("merge:\n{}\n".format(result))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
'
运行

程序运行结果如下:

left:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3

right:
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
3 K3 C3 D3

merge:
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3

7.4 数据值补充

df1.combine_first(df2)用df2的数据补充df1的缺失值。

【任务13】df1.combine_first(df2)实例

from numpy import nan as NaN
import numpy as np
import pandas as pd
a=pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index=['f','e','d','c','b','a'])
b=pd.Series([1,np.nan,3,4,5,np.nan],index=['f','e','d','c','b','a'])
print(a)
print(b)
c=b.combine_first(a)
print(c)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
'
运行

程序运行结果如下:

f NaN
e 2.5
d NaN
c 3.5
b 4.5
a NaN
dtype: float64
f 1.0
e NaN
d 3.0
c 4.0
b 5.0
a NaN
dtype: float64
f 1.0
e 2.5
d 3.0
c 4.0
b 5.0
a NaN
dtype: float64

8 Missingno库

8.1 认识Missingno库

Missingno库用于缺失数据的可视化,便于快速直观地分析数据集的完整性。

Missingno库加载命令如下:

import missingno as msno #加载Missingno

Missingno具下以下功能。

(1)快速直观地显示数据,方法如下:

msno,matrix(data,labels=True)

无效矩阵的数据显示用于查看每个变量的缺失情况。

(2)列的无效可视化

利用条形图可以直观地看出每个变量缺失的比例和数量情况,方法如下:

msno.bar(data)

(3)热图相关性显示

热图相关性显示用于说明变量之间是否相互影响,方法如下:

msno.heatmap(data)

(4)树形图显示

树形图使用层次聚类算法将无效性变量彼此相加,方法如下:

msno.dendrogram(data)

8.2 missingno实例

【任务14】missingno实例

import warnings
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
import missingno as msno
import matplotlib.pyplot as plt
from itertools import product
# 忽略警告信息
warnings.filterwarnings('ignore')
# 定义一个函数,生成带有随机NaN值的合成数据
def getData():
    X1, y1 = make_classification(
        n_samples=1000,
        n_features=10,
        n_classes=2,
        n_clusters_per_class=1,
        random_state=0
    )
    for i, j in product(range(X1.shape[0]), range(X1.shape[1])):
        # 如果随机数大于等于0.8,就在随机位置产生NaN值
        if np.random.random() >= 0.8:
            xloc = np.random.randint(0, 10)
            X1[i, xloc] = np.nan
    return X1, y1

# 生成合成数据
x, y = getData()
# 将生成的数据转换为 pandas DataFrame
df_columns = ['x%s' % i for i in range(x.shape[1])]
df = pd.DataFrame(x, columns=df_columns)
df['label'] = y
# 使用 missingno 和 matplotlib 可视化缺失值
msno.matrix(df)
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

在这里插入图片描述

9 词云

9.1认识词云

word_cloud(词云),也叫作文字云,通过对文本中出现频率较高的关键词进行视觉上的突出,直观和艺术地展示文本中词语的重要性,使得读者一眼便能领略文本的主旨。word_cloud依赖于Numpy与Pillow,安装命令如下。

pip install pillow

pip install wordcloud

WordCloud以词语为基本单位,根据文本中词语出现的频率等参数绘制词云的形状尺寸和颜色等,生成词云的过程如下。

步骤1:使用Pandas读取数据并转换为列表。

步骤2:对列表数据使用分词工具jieba进行中文分词。

步骤3:使用WordCloud设置词云图片的属性、掩码和停止词等对象参数,加载词云文本,生成词云图像,保存输出词云文件。

WordCloud常规方法如下:

(1)w=wordcloud.WordCloud(<参数>):配置对象参数

(2)w.generate(txt):向WordCloud对象w中加载文本txt

(3)w.to_file(filename):将词云输出为图像文件,.png或.jpg

word_cloud提供了大量参数用来控制图像的生成效果,参数如下:

属性名示例说明
background_colorbackground_color=‘white’指定背景色,可以使用十六进制颜色
widthwidth=600图像长度,默认400px
heightheight=400图像高度,默认200px
marginmargin=20词与词之间的间距,默认2px
scalescale=0.5缩放比例,对图像整体进行缩放,默认为1
prefer_horizontalprefer_horizontal=0.9词在水平方向上出现的颜率,默认为0.9
stopwordsstopwords=set(‘dog’)设置要过滤的词,以字符串或者集合作为接收参数,如不设置将使用默认的停止词词库
relative_scalingrelative_scaling=1词频与字体大小关联性,默认为5,值越小,变化越明显

9.2 word_cloud实例

【任务15】word_cloud实例

from wordcloud import WordCloud
import matplotlib.pyplot as plt

text ="cat fish cat cat cat cat cat cat dog dog cat dog"
wordcloud =WordCloud(
            font_path="simhei.ttf",    #设置输出词云的字体
            max_font_size=500,      #设置字体的大小,默认200
            #background_color='white',
            width=1000,height=400,
            scale=2,#设置图的词密度
            random_state=50,   # random.Random用来生成随机颜色
            ).generate(text)            #generate()根据文本生成词云


#wordcloud.to_file("d:/print.png")
plt.imshow(wordcloud,interpolation="none")
plt.axis("off")#关闭x,y轴刻度
plt.savefig('./print.jpg')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/875443
推荐阅读
相关标签
  

闽ICP备14008679号