目录
前言
数据链接: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()