【深度学习、工程实践】深度学习进行情感分析(1)--数据预处理

目录

前言

一、读入所需的工具库

二、读取数据并查看

1.读入数据

2.查看数据

 3.缩放label

三.数据处理

1.去除重复数据

2.去除无用字符

3.使用jieba分词 

 4.去除停用词

 5.去除低频词

6. 将数据信息保存

四.查看保存好的数据

五.精简数据

六.数据可视化

1.统计评分的分布

2.生成评分-数量直方图

 3.统计单词的个数来得到每个句子的长度

4.生成长度统计图


前言

数据链接:https://pan.baidu.com/s/1WHJMObw6kXTdhkWTFW4igg
提取码:wcwe

停用词链接:阿里云盘分享


一、读入所需的工具库

#导入数据处理的基础包
import numpy as np
import pandas as pd
#导入用于计数的包
from collections import Counter
import os
import requests

二、读取数据并查看

        通过pd.read_csv函数读取数据,该函数是用来读取csv格式的文件,将表格数据转化成dataframe格式。dataframe格式的数据在操作时极为方便,由于我们仅需要评论和评分这两列,所以通过索引取出对应的数据。

1.读入数据

#读取数据
#路径是各自数据路径的存放地址
data = pd.read_csv('/root/Jupyter/Data_cleaning/JDcontents_vivo.csv',encoding="gbk")
#输出数据的一些相关信息
print(data.info())
#看数据形状 (行数, 列数)
print(data.shape)
# 列标签 <Index>
print(data.columns)

        数据详情如下所示:

2.查看数据

        校查数据是否有乱码、重复的现象;查看标签是否符合要求。

#观察数据格式,分别查看data的前五条数据和后五条数据
data.head()
data.tail()

 

 3.缩放label

        由于原始label的范围是[1-5],需要将label缩放到[0-4]之间。

#目的是将label的数值 -1 缩放到[0,4]之间
def get_label(label):
    label = label - 1
    return label
data["label"] = data['评分'].apply(get_label)

三.数据处理

1.去除重复数据

        查看数据后发现,数据的“评论”中存在重复现象,所以需要将“评论”一列进行去重处理。去除重复的评论后,由于重复评论的一整行都会被删除,所以会出现列序号索引混乱,需要对索引进行重新排序。

#按评论进行去重,对于重复项,保留第一次出现的值
data = data.drop_duplicates('评论',keep='first')
#会将标签重新从零开始顺序排序,使用参数设置drop=True删除旧的索引序列
data = data.reset_index(drop=True)

2.去除无用字符

# TODO1: 去掉一些无用的字符,自行定一个字符几何,并从文本中去掉
#去除字母数字表情和其它字符
import re
def clear_character(sentence):
    pattern1='[a-zA-Z0-9]'
    pattern2 = re.compile(u'[^\s1234567890::' + '\u4e00-\u9fa5]+')
    pattern3='[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+'
    line1=re.sub(pattern1,'',sentence)   #去除英文字母和数字
    line2=re.sub(pattern2,'',line1)   #去除表情和其他字符
    line3=re.sub(pattern3,'',line2)   #去除去掉残留的冒号及其它符号
    new_sentence=''.join(line3.split()) #去除空白
    return new_sentence
#在["评论"]这一列使用定义的"clear_character"函数
data["comment_processed"]=data['评论'].apply(clear_character)
data.head()

3.使用jieba分词 

# 导入中文分词包jieba, 并用jieba对原始文本做分词
import jieba
from tqdm import tqdm
def comment_cut(content):
    # TODO: 使用结巴完成对每一个comment的分词
#     seg = jieba.lcut(content)
    seg = list(jieba.cut(content.strip()))
    return seg
# 输出进度条
tqdm.pandas(desc='apply')
data['comment_processed'] = data['comment_processed'].progress_apply(comment_cut)
# 观察新的数据的格式
data.head()

 4.去除停用词

        载入停用词表,并将停用词去除。

# 设定停用词并从文本中去掉停用词
# 下载中文停用词表至本地目录下/root/Jupyter/Data_cleaning/stopWord中,下载地址:https://github.com/goto456/stopwords/
if not os.path.exists('/root/Jupyter/Data_cleaning/stopWord.json'):
    stopWord = requests.get("https://raw.githubusercontent.com/goto456/stopwords/master/cn_stopwords.txt")
    with open("/root/Jupyter/Data_cleaning/stopWord.json", "wb") as f:
         f.write(stopWord.content)
# 读取下载的停用词表,并保存在列表中
with open("/root/Jupyter/Data_cleaning/stopWord.json","r",encoding='utf-8') as f:
    stopWords = f.read().split("\n")  
    
# 去除停用词
def rm_stop_word(wordList):
    # your code, remove stop words
    # TODO
    #outstr = ''
    # 去停用词
    #for word in wordList:
       # if word not in stopWords:
           # if word != '\t':
                #outstr += word
                #outstr += " "
    #return outstr
    filtered_words = [word for word in wordList if word not in stopWords]
    return filtered_words
    #return " ".join(filtered_words)
#这行代码中.progress_apply()函数的作用等同于.apply()函数的作用,只是写成.progress_apply()函数才能被tqdm包监控从而输出进度条。
data['comment_processed'] = data['comment_processed'].progress_apply(rm_stop_word)
# 观察新的数据的格式
data.head()

 5.去除低频词

        通过pandas索引循环comment列,将所有词合并到一个列表里。然后通过Counter统计词频数,并将词频小于10的词去除。

# 去除低频词, 去掉词频小于10的单词,并把结果存放在data['comment_processed']里
from collections import Counter
list_set = []
for i in range(len(data)):
    for j in data.iloc[i]['comment_processed']: 
        list_set.extend(j)
        
words_count = Counter(list_set)
 
min_threshold=10
my_dict = {k: v for k, v in words_count.items() if v < min_threshold}
filteredA = Counter(my_dict)
 
# 去除低频词
def rm_low_frequence_word(wordList):
    # your code, remove stop words
    # TODO
    outstr = ''
    for word in wordList:
        if word not in filteredA:
            if word != '\t':
                outstr += word
                outstr += " "
    #filtered_words = [word for word in wordList if word not in filteredA]
    return outstr
                      
#这行代码中.progress_apply()函数的作用等同于.apply()函数的作用,只是写成.progress_apply()函数才能被tqdm包监控从而输出进度条。
data['comment_processed'] = data['comment_processed'].progress_apply(rm_low_frequence_word)
data.head()

6. 将数据信息保存

#index参数设置为False表示不保存行索引,header设置为False表示不保存列索引
data.to_csv("/root/Jupyter/Data_cleaning/Cleaned_data.csv",index=False,header=True,encoding="utf-8")

四.查看保存好的数据

#读取数据
#路径是各自数据路径的存放地址  
data = pd.read_csv('/root/Jupyter/Data_cleaning/Cleaned_data.csv')
#输出数据的一些相关信息
print(data.info())
#看数据形状 (行数, 列数)
print(data.shape)
# 列标签 <Index>
print(data.columns )

五.精简数据

        目前data数据中存在["评论"]、["评分"]、["label"]、["comment_processed"]四列,我们最终需要的数据为["label"]、["comment_processed"]两列,所以需要将["评论"]、["评分"]两列中间变量删掉。

#精简列
data.drop(["评论","评分"],axis=1,inplace=True)
#删除空值
data = data.dropna(axis=0,how='any')
#重新保存
data.to_csv("/root/Jupyter/Data_cleaning/Cleaned_data.csv",index=False,header=True,encoding="utf-8")

六.数据可视化

1.统计评分的分布

#统计评分的分布
data["label"].value_counts()

2.生成评分-数量直方图

#生成评分-数量直方图
import matplotlib.pyplot as plt
data['label'].value_counts().plot(kind='bar')
plt.title('count')
plt.xlabel("category")
#plt.savefig('./category.png')
plt.show()

 

 3.统计单词的个数来得到每个句子的长度

#统计单词的个数来得到每个句子的长度
data['text_len'] = data['comment_processed'].apply(lambda x: len(x.split(' ')))
print(data['text_len'].describe())

4.生成长度统计图

_ = plt.hist(data['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")
#plt.savefig('./text_chart_count.png')
plt.show()

  • 5
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值