本博客旨在帮助学生自己巩固所学,若能帮得上他人也是荣幸之至
首先以下是借鉴过的几个github库,非常感谢:
https://github.com/apachecn/python_data_analysis_and_mining_action
https://github.com/keefecn/python_practice_of_data_analysis_and_mining
https://github.com/Stormzudi/Python-Data-Mining
https://github.com/Echo9573/DataAnalysisbyPython
1 数据提取案例
data=data[[u'评论']][data[u'品牌']==u'美的']
2 查看表格是否有缺失值等信息
result.info()
3 去除重复数据
data=pd.DataFrame(data[0].unique())
4 编码报错处理
# 必须导入下面这个包,要不然会报错'ascii' codec can't encode characters in position
# Python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
result.to_csv('1_1my_meidi_jd.txt', index = False, header = False) # 将评论提取后保存到txt中,不要索引,不要列名(***)
5 正则表达式使用
data1 = pd.DataFrame(data1[0].str.replace('.*?\d+?\\t', '')) # 使用正则表达式替换掉前缀
data2 = pd.DataFrame(data2[0].str.replace('.*?\d+?\\t', '')) # 使用正则表达式替换掉前缀
6 多行分词
mycut = lambda s: " ".join(jieba.cut(s)) # 自定义简单分词函数
data1 = data1[0].apply(mycut) # 通过广播形式分词,加快速度
data2 = data2[0].apply(mycut) # 通过广播形式分词,加快速度
7 LDA主题模型
#-*- coding: utf-8 -*-
import pandas as pd
#参数初始化
negfile = '../data/meidi_jd_neg_cut.txt'
posfile = '../data/meidi_jd_pos_cut.txt'
stoplist = '../data/stoplist.txt'
neg = pd.read_csv(negfile, encoding = 'utf-8', header = None) #读入数据
pos = pd.read_csv(posfile, encoding = 'utf-8', header = None)
stop = pd.read_csv(stoplist, encoding = 'utf-8', header = None, sep = 'tipdm',engine='python')
#sep设置分割词,由于csv默认以半角逗号为分割词,而该词恰好在停用词表中,因此会导致读取出错
#所以解决办法是手动设置一个不存在的分割词,如tipdm。
stop = [' ', ''] + list(stop[0]) #Pandas自动过滤了空格符,这里手动添加
neg[1] = neg[0].apply(lambda s: s.split(' ')) #定义一个分割函数,然后用apply广播
neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop]) #逐词判断是否停用词,思路同上
pos[1] = pos[0].apply(lambda s: s.split(' '))
pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop])
from gensim import corpora, models
#负面主题分析
neg_dict = corpora.Dictionary(neg[2]) #建立词典
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建立语料库
neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型训练
for i in range(3):
neg_lda.print_topic(i) #输出每个主题
#正面主题分析
pos_dict = corpora.Dictionary(pos[2])
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
for i in range(3):
print(neg_lda.print_topic(i)) #输出每个主题
# 正面主题的,一行为一个主题
0.040*"安装" + 0.029*"不错" + 0.019*"热水器" + 0.018*"加热" + 0.011*"知道" + 0.011*"送货" + 0.010*"使用" + 0.009*"有点" + 0.009*"速度" + 0.007*"买"
0.021*"买" + 0.019*"热水器" + 0.016*"安装" + 0.013*"好" + 0.010*"京东" + 0.009*"东西" + 0.009*"师傅" + 0.007*"n" + 0.007*"知道" + 0.007*"装"
0.053*"安装" + 0.020*"买" + 0.018*"好" + 0.015*"美的" + 0.014*"师傅" + 0.013*"不错" + 0.013*"热水器" + 0.010*"东西" + 0.009*"安装费" + 0.008*"问题"