python简单实现天猫手机评论标签提取--自然语言处理
2017-08-21 11:55
399 查看
作为国产机的脑残粉,这次试试用自然语言处理的方法简单的提取手机评论的标签。大概步骤:
爬取手机的10万条评论文本
结巴中文分词,提取前20个频率高的名词+形容词
结巴分词,去停用词,制作语料库
gensim自然语言处理库的word2vec,训练语料库,计算各个名词和形容词之间的相似度,得出前20相似度最高的组合短语
1.爬取手机的10万条评论文本
天猫的评论数据并非直接在评论页中网页点击右键“查看网页源代码”,你会发现这样是不能直接获取到评论文本的,因为天猫的评论数据是异步存储在一个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()
我获取的评论文本是这样的,挺顺利的,分部分去爬取比较不容易被反爬虫
2.结巴中文分词提取关键词
建议认真读读官网,挺容易上手的–结巴分词官网#!/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',提取名词
这是关键词的截图
其中‘棒棒’识别成了名词哈!后期我们可以制定结巴分词的词库进行纠正。这也是结巴分词的功能之一。
3.制作语料库
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的训练效果
4.深度学习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
出来的结果是这样的,还不错,虽然有几个组合是比较奇怪哈哈
总结:
由于时间问题,我只处理1万条评论文本后期可增加评论文本,越大越好!
分词时候可以添加自己的库,比如说‘荣耀8’应该为同一个词,而不应该分为‘荣耀’和‘8’;再比如说,可以设置‘棒棒’应该识别为形容词,而不是名词哈。
后面可以增加同义词分析,‘成色不错’和‘外观很好’应该为同一类等等。
这次主要心得还是jieba和word2vec的功能确实很强大!
这次是试试手,肯定会有更好的办法,希望大家再指教指教,文中如有错误请提出,写得比较匆忙。
相关文章推荐
- hadoop, 用java 和 python 实现 worldcount 简单单词提取累加小程序
- Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说
- python实现超简单的视频对象提取功能
- 正则提取出HTML正文(剔除标签内容)python实现
- Pexpect简单的测试——一个 expect的python实现
- [python]有限状态机(FSM)简单实现
- [python]有限状态机(FSM)简单实现
- 郭克华手机编程教学视频----我的练习源码(6)实战:实现一个简单的监听程序
- linux下简单的自适应CPU利用率的控制(Python实现)
- Python源码剖析[15] —— 最简单的Python实现:Small Python
- JSTL 标签循环列表补齐最简单实现,还有最简单的我无语!
- 最简单的Python singleton模式实现
- [python]有限状态机(FSM)简单实现
- 用于网页判断的智能代理技术的简单实现------------基于python实现(网络爬虫)
- python设置检查点简单实现
- WebTrack 在 python bottle framework中的简单实现
- Openlaszlo实现简单的标签菜单
- python中如何简单的实现decorator模式--由django admin源码所得体会
- 转载:[python]有限状态机(FSM)简单实现
- JSTL 标签循环列表补齐最简单实现,还有最简单的我无语!