赞
踩
目录
数据链接: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格式的数据在操作时极为方便,由于我们仅需要评论和评分这两列,所以通过索引取出对应的数据。
- #读取数据
- #路径是各自数据路径的存放地址
- data = pd.read_csv('/root/Jupyter/Data_cleaning/JDcontents_vivo.csv',encoding="gbk")
- #输出数据的一些相关信息
- print(data.info())
- #看数据形状 (行数, 列数)
- print(data.shape)
- # 列标签 <Index>
- print(data.columns)
数据详情如下所示:
校查数据是否有乱码、重复的现象;查看标签是否符合要求。
- #观察数据格式,分别查看data的前五条数据和后五条数据
- data.head()
- data.tail()
由于原始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)
查看数据后发现,数据的“评论”中存在重复现象,所以需要将“评论”一列进行去重处理。去除重复的评论后,由于重复评论的一整行都会被删除,所以会出现列序号索引混乱,需要对索引进行重新排序。
- #按评论进行去重,对于重复项,保留第一次出现的值
- data = data.drop_duplicates('评论',keep='first')
- #会将标签重新从零开始顺序排序,使用参数设置drop=True删除旧的索引序列
- data = data.reset_index(drop=True)
- # 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()
- # 导入中文分词包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()
载入停用词表,并将停用词去除。
- # 设定停用词并从文本中去掉停用词
- # 下载中文停用词表至本地目录下/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()
通过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()
- #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")
- #统计评分的分布
- data["label"].value_counts()
- #生成评分-数量直方图
- import matplotlib.pyplot as plt
- data['label'].value_counts().plot(kind='bar')
- plt.title('count')
- plt.xlabel("category")
- #plt.savefig('./category.png')
- plt.show()
- #统计单词的个数来得到每个句子的长度
- data['text_len'] = data['comment_processed'].apply(lambda x: len(x.split(' ')))
- print(data['text_len'].describe())
- _ = 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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。