自然语言处理概述数据预处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自然语言处理概述数据预处理相关的知识,希望对你有一定的参考价值。

【自然语言处理概述】数据预处理


(文章目录)


一、前沿

(一)、任务描述

在处理自然语言处理领域的任务时,有些新闻数据集中每条数据都是一个单独的文件。对海量数据文件进行空间占用、类型等分析十分必要,可加深用户对数据的了解,进而在处理数据时合理分配资源。


(二)、环境配置

本次实验平台为百度AI Studio,Python版本为Python3.7,下面介绍如何通过Python编程方式实现“海量”文件的遍历。


二、代码部分

(一)、数据准备


import os
import time
import pandas as pd
from zipfile import ZipFile

pd.set_option(display.max_columns, None)
pd.set_option(display.max_rows, 200)
import matplotlib as mpl
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import font_manager
from matplotlib.ticker import FormatStrFormatter
# root = os.path.dirname(os.getcwd())
data_path = .
with ZipFile(data/data24164/lendingclub.zip) as z:
    z.extractall()
def read_data(path):
    """
    :params path: str 存放着数据集的文件夹路径
    
    :return data: list 存着多个数据集 [df1, df2, ...]
    """
    data = []
    for f in os.listdir(path):
        if f[-3:] != zip:
            continue
        df = pd.read_csv(os.path.join(data_path, f),
             compression=zip, low_memory=False, skiprows=1)[:-2]  # 不要最后2行数据

        data.append(df)
        print(读取, :6d个样本, 个特征.format(f, df.shape[0], df.shape[1]))
    return data
data = read_data(data_path)

输出结果如下图1所示:

data = pd.concat(data).reset_index(drop=True)

(二)、lending club 数据集

loan_status(贷款状态):

  • Current
  • Fully Paid (全部偿还)
  • Charged Off (冲销,投资人有损失)
  • Default 违约
  • In Grace Period(在宽限期)
  • Late (16-30 days)(延期16-30天)
  • Late (31-120 days)(延期31-120天)

状态Current(贷款还款中),不能确定是否违约,所以这部分数据不是有效数据,应该去掉

https://www.lendingclub.com/info/demand-and-credit-profile.action


import os
 
"""
通过给定目录,统计所有的不同子文件类型及占用内存
"""
size_dict = 
type_dict = 
def get_size_type(path):
    
    files = os.listdir(path)
    for filename in files:
        temp_path = os.path.join(path, filename)
        if os.path.isdir(temp_path):
            # 递归调用函数,实现深度文件名解析
            get_size_type(temp_path)     
        elif os.path.isfile(temp_path):
            # 获取文件后缀
            type_name=os.path.splitext(temp_path)[1]   
            #无后缀名的文件
            if not type_name:
                type_dict.setdefault("None", 0)
                type_dict["None"] += 1
                size_dict.setdefault("None", 0)
                size_dict["None"] += os.path.getsize(temp_path)
            # 有后缀的文件
            else:
                type_dict.setdefault(type_name, 0)
                type_dict[type_name] += 1
                size_dict.setdefault(type_name, 0)
                # 获取文件大小
                size_dict[type_name] += os.path.getsize(temp_path)  
    

剔除Current, In Grace Period, Issued, Fully Paid是好账,其他的作为坏账。


data.groupby(loan_status).size()

输出结果如下图2所示:

# 1是坏账 0 是好账 -1表示需要剔除的数据
loan_status_dict = "Fully Paid": 0,
                    "Charged Off": 1,
                    "Late (31-120 days)": 1,
                    "Late (16-30 days)": 1,
                    "Default": 1,
                    "Current": -1,
                    "In Grace Period": -1,
                    "Issued": -1
data["loan_status"] = data["loan_status"].map(loan_status_dict)
# 删掉
data = data[data["loan_status"]!=-1]

(三)、缺失值处理

total_misval = data.isna().sum().sort_values(ascending=False) # 缺失值个数从高到低
total_misval = total_misval[total_misval != 0] # 删除没有缺失值的特征
per_misval = total_misval / total_misval.max()  # 百分比形式
# 绘制缺失值占比情况图
def draw_per_misval():
    f, ax = plt.subplots(figsize=(10, 10),dpi=100)
    sns.set_style("whitegrid")
    
    # 只显示缺失值占比大于10%的
    sns.barplot(per_misval[per_misval>0.1]*100, 
                per_misval[per_misval>0.1].index, 
                ax=ax,
                palette="GnBu_r")
    
    ax.xaxis.set_major_formatter(FormatStrFormatter("%2.f%%")) # 格式化字符串
    ax.set_title("missing value")
    plt.show()
draw_per_misval()

输出结果如下图3所示:


# 获得缺失值占比大于threshold的特征,删掉该特征
def drop_misval_ft(data, threshold, per_misval):
    misval_ft = per_misval[per_misval > threshold].index
    data.drop(misval_ft, axis=1, inplace=True)
    print("删掉了个特征".format(len(misval_ft)))
    return data

# 对于缺失值比例小于threshold的特征,删除含有这些特征的缺失值的样本:
def drop_samples(data, threshold, per_misval):
    features = per_misval[per_misval < threshold].index

    print("当前共有个样本".format(data.shape[0]))
    data.dropna(subset=features, inplace=True) 
    print("删除完毕,当前共有个样本".format(data.shape[0]))
    return data
data = drop_misval_ft(data, 0.15, per_misval)
data = drop_samples(data, 0.05, per_misval)
data["il_util"].fillna(0,inplace=True) # 0填补空缺值
data["mths_since_recent_inq"].fillna(0,inplace=True) # 0填补空缺值
data.drop("emp_title",axis=1,inplace=True)
emp_length_dict = "10+ years": 10, "2 years": 2, "< 1 year": 0.5, "3 years": 3, "1 year": 1, "5 years": 5,
                   "4 years": 4, "6 years": 6, "7 years": 7, "8 years": 8, "9 years": 9
data["emp_length"] = data["emp_length"].map(emp_length_dict)
data["emp_length"].fillna(value=0, inplace=True)

(四)、去噪

# 删除取值频率过高的特征
def drop_high_freq_features(df, freq_limit):
    high_freq_features = []
    for feature in df.columns:
        n = df.shape[0] # 总样本数
        most_ft_val = df[feature].value_counts().max() # 某特征取值频率最大的
        per = most_ft_val/n # 频率占比
        if per >freq_limit:
            high_freq_features.append(feature)
    
    df.drop(high_freq_features,axis=1,inplace=True) # 删除取值高频特征
    print("删掉了个特征".format(len(high_freq_features)))
    print("还剩个特征".format(df.shape[1]))
    return df
data = drop_high_freq_features(data, freq_limit=0.95)
# 日期调一下,去除月份,只保留年份
data.issue_d = data.issue_d.apply(lambda x:x[-4:])

三、总结

本系列文章内容为根据清华社出版的《自然语言处理实践》所作的相关笔记和感悟,其中代码均为基于百度飞桨开发,若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!

最后,引用本次活动的一句话,来作为文章的结语~( ̄▽ ̄~)~:

【**学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。**】

以上是关于自然语言处理概述数据预处理的主要内容,如果未能解决你的问题,请参考以下文章

python处理excel填补日期空缺值

自然语言处理概述数据预处理

Flink 概述 基本架构

自然语言处理(NLP)知识整理及概述(一)

自然语言处理NLP概述

Hive--对空值和NULL的处理