赞
踩
作为国产机的脑残粉,这次试试用自然语言处理的方法简单的提取手机评论的标签。大概步骤:
天猫的评论数据并非直接在评论页中网页点击右键“查看网页源代码”,你会发现这样是不能直接获取到评论文本的,因为天猫的评论数据是异步存储在一个JS连接里面的。
具体操作可以参考原文的–[通过Python抓取天猫评论数据]
我的操作可简化,只需要文本就好,不需要时间、型号什么的。
直接贴代码:
#!/usr/bin/python
#-*-coding:utf-8-*-
# 导入所需的开发模块
import requests
import re
from bs4 import BeautifulSoup,NavigableString
import time
import random
# 创建循环链接
urls = []
for i in list(range(0,6000)):
urls.append('https://rate.tmall.com/list_detail_rate.htm?itemId=534715680661&spuId=649678568&sellerId=1114511827&order=3¤tPage=%s'%i)
#伪装浏览器
homepage = 'https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-15291748836.71.6de0f6b7FVqGYN&id=534715680661&rn=923b06965813887ae5b9b07a6f062f3e&abbucket=2&sku_properties=10004:653780895;5919063:6536025'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0'}
cookies = requests.get(homepage,headers=headers).cookies
ratecontent = []
# 循环抓取数据
for url in urls:
# content=(requests.get(url).text)
r = requests.get(url,headers=headers,cookies=cookies).text
ratecontent.extend(re.findall(re.compile('"rateContent":"(.*?)","rateDate"'),r)) #正则化提取评论内容
print(url)
time.sleep(random.uniform(3,8))
file =open('荣耀8天猫评论.csv','w')
for i in ratecontent:
file.write(i+'\n')
file.close()
我获取的评论文本是这样的,挺顺利的,分部分去爬取比较不容易被反爬虫
建议认真读读官网,挺容易上手的–结巴分词官网
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import jieba
import jieba.analyse
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) #设置日志
content = open('/mnt/share/jieba_test/荣耀8天猫评论.csv','rb').read()
tagsA = jieba.analyse.extract_tags(content, topK=20,allowPOS='a') #allowPOS是选择提取的词性,a是形容词
tagsN = jieba.analyse.extract_tags(content, topK=20, allowPOS='n') #allowPOS='n',提取名词
这是关键词的截图
其中‘棒棒’识别成了名词哈!后期我们可以制定结巴分词的词库进行纠正。这也是结巴分词的功能之一。
import pandas as pd
import numpy as np
import logging
import codecs
words=jieba.lcut(content,cut_all=False) #分词,精确模式
#去停用词,先自己网上找中文停用词,制作好“停用词表.txt”
stopwords = []
for word in open("/mnt/share/jieba_test/stopword.txt", "r"):
stopwords.append(word.strip())
stayed_line = ""
for word in words:
if word not in stopwords:
stayed_line += word + " "
#保存预料
file=open('/mnt/share/jieba_test/corpus.txt','wb')
file.write(stayed_line.encode("utf-8"))
file.close()
分词后的语料是这样的,分词很重要!非常影响word2vec的训练效果
word2vec官网:https://code.google.com/p/word2vec/
word2vec的使用,Python,利用gensim模块。
语料不大,普通配置的电脑都可以,一两分钟的事情。
直接上代码:
from gensim.models import word2vec
sentences = word2vec.Text8Corpus('/mnt/share/jieba_test/corpus.txt') # 加载刚刚制作好的语料
model = word2vec.Word2Vec(sentences, size=200) # 默认window=5
commit_index=pd.DataFrame(columns=['commit','similarity'],index=np.arange(100))
index=0
for i in tagsN:
for j in tagsA:
commit_index.loc[index,:]=[i+j,model.similarity(i,j)]
index+=1
comit_index_final=commit_index.sort(columns='similarity',ascending=False)
comit_index_final.index=commit_index.index
出来的结果是这样的,还不错,虽然有几个组合是比较奇怪哈哈
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。