当前位置:   article > 正文

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

情感分析 数据预处理

目录

前言

一、读入所需的工具库

二、读取数据并查看

1.读入数据

2.查看数据

 3.缩放label

三.数据处理

1.去除重复数据

2.去除无用字符

3.使用jieba分词 

 4.去除停用词

 5.去除低频词

6. 将数据信息保存

四.查看保存好的数据

五.精简数据

六.数据可视化

1.统计评分的分布

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

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

4.生成长度统计图


前言

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

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


一、读入所需的工具库

  1. #导入数据处理的基础包
  2. import numpy as np
  3. import pandas as pd
  4. #导入用于计数的包
  5. from collections import Counter
  6. import os
  7. import requests

二、读取数据并查看

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

1.读入数据

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

        数据详情如下所示:

2.查看数据

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

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

 

 3.缩放label

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

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

三.数据处理

1.去除重复数据

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

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

2.去除无用字符

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

3.使用jieba分词 

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

 4.去除停用词

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

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

 5.去除低频词

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

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

6. 将数据信息保存

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

四.查看保存好的数据

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

五.精简数据

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

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

六.数据可视化

1.统计评分的分布

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

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

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

 

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

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

4.生成长度统计图

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

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

闽ICP备14008679号