最近刚接触python,沉迷爬虫无法自拔,就准备来尝试尝试。虽然代码可能有点乱,我会尽量解释的详细的。
目标:从QQ中导出txt文件的聊天记录,用jieba对聊天记录进行分词,统计每个关键字出现的次数,把关键字以及其对应出现的次数导出到csv格式的文件中。
1.安装jieba
首先要根据python的版本安装jieba库。
win10操作系统,win+R输入cmd出现命令行窗口
输入pip install jieba就可以安装好啦
因为我的电脑之前装过Anaconda3,所以可以在Jupyter Notebook中写代码
2.布置好相关文件
我这里导出的聊天记录文件命名为1.txt。新建python3文件统计关键字用于写python代码
3.分部代码
3.1读取文本中的文件并进行清洗后保存至字符串s中
由于QQ读取到的聊天记录的格式是
2018-04-23 20:48:59 XX网名
聊天记录
我们需要的是聊天记录的内容,所以读取每一行时,如果第一个字符是'2'或者该行没有数据就跳过该行。对聊天记录中的每一行的数据中得符号等进行清洗。将有用的字符挨个保存至字符串中。
fr=open('1.txt','r',encoding='utf-8')
s=""
data={}
for line in fr:
line=line.strip()
if len(line)==0:
continue
if line[0]=='2':
continue
for x in range(0,len(line)):
if line[x] in [' ','\t','\n','。',',','[', ']', '(', ')', ':', '-',
'?', '!', '《', '》', '、', ';', '“', '”', '……','0','1','2','3','4','5','6','7','8','9','=','~','…']:
continue
s+=str(line[x])
print(s)
3.2对字符串s中的内容进行分词
利用jieba进行分词,采用默认模式。
seg_list = jieba.cut(s, cut_all=False, HMM=True)
对分词好的每个关键词进行统计次数,由于长度为1的关键字通常没有意义,所以我们把它清除。用字典类型的data存储对应的关键字和统计次数。
for word in seg_list:
if len(word)>=2:
if not data.__contains__(word):
data[word]=0
data[word]+=1
根据统计次数对字典进行排序,sort以及lambda在python基础里都已经讲过。
data=sorted(data.items(),key=lambda d:d[1],reverse=True)
3.3将关键字以及出现的次数保存到文件中
fw=open('result.csv','w',encoding='utf-8')
fw.write(str(len(data))+'\n')
for item in data:
fw.write(item[0]+','+str(item[1])+'\n')
fw.close()
4.完整代码
import jieba
fr=open('1.txt','r',encoding='utf-8')
s=""
data={}
for line in fr:
line=line.strip()
if len(line)==0:
continue
if line[0]=='2':
continue
for x in range(0,len(line)):
if line[x] in [' ','\t','\n','。',',','[', ']', '(', ')', ':', '-',
'?', '!', '《', '》', '、', ';', '“', '”', '……','0','1','2','3','4','5','6','7','8','9','=','~','…']:
continue
s+=str(line[x])
print(s)
seg_list = jieba.cut(s, cut_all=False, HMM=True)
for word in seg_list:
if len(word)>=2:
if not data.__contains__(word):
data[word]=0
data[word]+=1
data=sorted(data.items(),key=lambda d:d[1],reverse=True)
fw=open('result.csv','w',encoding='utf-8')
fw.write(str(len(data))+'\n')
for item in data:
fw.write(item[0]+','+str(item[1])+'\n')
fr.close()
fw.close()
5.结果显示
