Python pytagcloud 中文分词 生成标签云 系列(一)
转载地址:https://zhuanlan.zhihu.com/p/20432734
工具
Python 2.7 (前几天试了试 Scrapy 所以用的 py2 。血泪的教训告诉我们能用 py3 千万别用 py2 ,编码问题累死人)
jieba 结巴分词 fxsjy/jieba · GitHub
pytagcloud 词云生成 atizo/PyTagCloud · GitHub
安装过程应该没什么坑,不像 Scrapy 光安装都能写一篇出来。自行补充依赖就好。
Step 1 爬虫抓取文本
这个阶段比较简单。虽然我欠了半年的爬虫系列一直没有写,但是抓个贴子标题都不涉及模拟登陆,对入门的人应该问题不大。随便改了一下以前的代码就跑出来了。
# -*- coding: utf-8 -*- import requests
import re
import os
import codecs def get_title(url):
s = requests.session()
h = s.get(url)
html = h.content.decode('utf-8')
#print html qurl = r'<a href="forum.*? class="s xst">(.*?)</a>'
qurllist = re.findall(qurl,html)
#print qurllist for each in qurllist:
f = codecs.open("result.txt", 'a', 'utf-8')
f.write(each+'\n')
print each
#f.flush()
f.close() for i in range(1,1000):
url = 'http://rs.xidian.edu.cn/forum.php?mod=forumdisplay&fid=72&page='+str(i)
get_title(url)
值得注意的还是编码问题,用 py3 的可以忽略。
Step 2 中文分词,提取关键词
jieba 的分词效果还是比较理想的。不过我在统计词频的时候一时没想起什么太好的解决办法,加上编码问题把我烦的够呛。于是偷懒地选择了 jieba 自带的提取关键词并给出权重的功能。
详见 jieba/extract_tags.py at master · fxsjy/jieba · GitHub
import sys
sys.path.append('../') import jieba
import jieba.analyse
from optparse import OptionParser USAGE = "usage: python extract_tags_with_weight.py [file name] -k [top k] -w [with weight=1 or 0]" parser = OptionParser(USAGE)
parser.add_option("-k", dest="topK")
parser.add_option("-w", dest="withWeight")
opt, args = parser.parse_args() if len(args) < 1:
print(USAGE)
sys.exit(1) file_name = args[0] if opt.topK is None:
topK = 10
else:
topK = int(opt.topK) if opt.withWeight is None:
withWeight = False
else:
if int(opt.withWeight) is 1:
withWeight = True
else:
withWeight = False content = open(file_name, 'rb').read() tags = jieba.analyse.extract_tags(content, topK=topK, withWeight=withWeight) if withWeight is True:
for tag in tags:
print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
else:
print(",".join(tags))
需要命令行运行。
先 cd 到目录,然后使用命令
python extract_tags_with_weight.py [file name] -k [top k] -w [with weight=1 or 0]
其中 -k 后输入关键词个数 -w 选择是否显示权重。如图:(具体的文本和结果我后面打包发一下,就不贴了)
说明:
其实标准的过程应该是分词以后统计词频,生成 k-v 的 Python 字典然后交由 pytagcloud 生成词云。由于我也是刚接触分词这块,不太熟悉,统计词频时力不从心,所以直接用了现成的关键词提取。
另外由于生成词云时需要的格式为 Python 字典(k-v),我自己在中间用 Notepad++ 和 Excel 做了一些文本上的预处理,这方面就八仙过海各显神通了。
还有,我使用了默认词典,没有自定义内容(jieba 是可以自定义词典的),所以一些词在提取时出现偏差,比如"新校区"、"老校区"就全部提成了"校区",X号楼只保留下来了"号楼"。另外我没有做词性筛选,导致许多无意义副词出现在结果里,后面生成词云时自己手动去掉了。
Step 3 生成词云
关于 pytagcloud ,搜到的唯一一篇比较有价值的文章就是Python中文标签云之pytagcloud 更多的还是要参考官方示例 atizo/PyTagCloud · GitHub 。我也没把功能全试完,大家可以自己向深处挖掘。
# -*- coding: utf-8 -*-
import codecs
import random
from pytagcloud import create_tag_image, create_html_data, make_tags, \
LAYOUT_HORIZONTAL, LAYOUTS
from pytagcloud.colors import COLOR_SCHEMES
from pytagcloud.lang.counter import get_tag_counts wd = {} fp=codecs.open("rsa.txt", "r",'utf-8'); alllines=fp.readlines(); fp.close(); for eachline in alllines:
line = eachline.split(' ')
#print eachline,
wd[line[0]] = int(line[1])
print wd from operator import itemgetter
swd = sorted(wd.iteritems(), key=itemgetter(1), reverse=True)
tags = make_tags(swd,minsize = 50, maxsize = 240,colors=random.choice(COLOR_SCHEMES.values()))
create_tag_image(tags, 'keyword_tag_cloud4.png', background=(0, 0, 0, 255),
size=(2400, 1000),layout=LAYOUT_HORIZONTAL,
fontname="SimHei")
输出结果如图。
补充:使用 pytagcloud 一定要记得添加中文字体并修改其配置文件,具体方法:
准备一个 ttf 中文字体,如 simhei.ttf ,将其移动到 C:\Users\~\AppData\Roaming\Python\Python27\site-packages\pytagcloud\fonts
并修改该文件夹下的 fonts.json 文件,添加相应的字体记录,如
{
"name": "SimHei",
"ttf": "simhei.ttf",
"web": "none"
},
输出结果还是比较有趣的,不过校外的人可能不熟悉。当然这本身也只是个很入门的东西,算作娱乐吧。
代码部分原创的不多…很多是网上拼拼凑凑找的。但是 pytagcloud 相关的内容搜出来比较少,对中文支持也需要自己修改,有人要自己做的话最好用谷歌搜索,然后参考前几篇文章和官方示例自己尝试。
在此顺便吐槽百度一发,实在难用,百度搜来搜去的结果,远不如谷歌直击要害。当然英语好就更棒了,能直接读文档和看 stackoverflow 。
想要自己尝试的可以用我这次的文档,或者自己抓感兴趣的资料。
http://pan.baidu.com/s/1mhn4mN2
拓展的话,感兴趣的可以多尝试几款分词比较一下。具体的就不推荐了我也不了解,搜一下会有很多,功能很丰富,语义分析,情感倾向,都有,可玩性比较高吧。
另外有另一款 Python 下的词云生成器 amueller/word_cloud · GitHub 留作以后研究吧。另外过程中看文章时发现好多词频统计和标签云是用 R 做的,有机会可以学习一下。
噢对了, pytagcloud 支持直接生成 HTML 网页的标签云,官方 demo 里有,我这边没做,就不展示了。
Python pytagcloud 中文分词 生成标签云 系列(一)的更多相关文章
- python3生成标签云
标签云是现在大数据里面最喜欢使用的一种展现方式,其中在python3下也能实现标签云的效果,贴图如下: -------------------进入正文--------------------- 首先要 ...
- Python word_cloud 样例 标签云系列(三)
转载地址:https://zhuanlan.zhihu.com/p/20436642word_cloud/examples at master · amueller/word_cloud · GitH ...
- Python word_cloud 部分文档翻译 标签云系列(二)
转载地址:https://zhuanlan.zhihu.com/p/20436581上文末尾提到 Python 下还有一款词云生成器.amueller/word_cloud · GitHub 可以直接 ...
- Python3+pdfminer+jieba+wordcloud+matplotlib生成词云(以深圳十三五规划纲要为例)
一.各库功能说明 pdfminer----用于读取pdf文件的内容,python3安装pdfminer3k jieba----用于中文分词 wordcloud----用于生成词云 matplotlib ...
- WordPress彩色背景标签云实现
网上有很多的这种效果,但是却几乎没有什么关于彩色背景标签云的教程,网上讲的基本都是让标签云的字体变成彩色而不是背景,我觉得让字体变成彩色有的标签会看不清楚,而且也没有让背景变成彩色好看.先看看效果: ...
- 使用jieba和wordcloud进行中文分词并生成《悲伤逆流成河》词云
因为词云有利于体现文本信息,所以我就将那天无聊时爬取的<悲伤逆流成河>的评论处理了一下,生成了词云. 关于爬取影评的爬虫大概长这个样子(实际上是没有爬完的): #!/usr/bin/env ...
- NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)
摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...
- Python第三方库jieba(中文分词)入门与进阶(官方文档)
jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...
- Python3.7+jieba(结巴分词)配合Wordcloud2.js来构造网站标签云(关键词集合)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_138 其实很早以前就想搞一套完备的标签云架构了,迫于没有时间(其实就是懒),一直就没有弄出来完整的代码,说到底标签对于网站来说还是 ...
随机推荐
- [salt] jinja模板中变量使用pillar的几种方法
先转载下jinja模板中使用变量的方法,后文主要讲解pillar的变量使用方法 一.jinja模版的使用方法: 1.file状态使用template参数 - template:jinja 2.模版文件 ...
- to_char
to_date(to_char(to_date(#{conds.currentTime,jdbcType=VARCHAR},'YYYY-MM-DD hh24:mi:ss'),'hh24:mi:ss') ...
- Laravel路由除了根目录全报404错误
Route::get('hello',function(){ return 'Hello World!'; }); 在laravel/app/Http/routes.php下添加上面的语句,然后再浏览 ...
- TeamWork#3,Week5,Scrum Meeting 11.13
最近我们根据之前发现的问题, 补充了相关知识,正在努力修复出现的问题,调整程序结构. 成员 已完成 待完成 彭林江 之前没有考虑到网站信息更新导致的程序可变性,正在调整爬虫程序结构 更换爬虫结构 郝倩 ...
- 四则运算<C++>
代码: #include<iostream> #define N 30 using namespace std; void main() { cout<<"***** ...
- 【CS231N】1、图像分类
一.知识点 1. 计算机识别物体面临的困难 视角变化(Viewpoint variation):同一个物体,摄像机可以从多个角度来展现. 大小变化(Scale variation):物体可视的大小通常 ...
- 【CSAPP笔记】11. 存储器层次结构
在没有专门研究存储器系统之前,我们依赖的存储器模型是一个很简单的概念,也就是把它看成一个线性数组,CPU 能在一个常数时间内访问任何一个存储器位置.虽然在研究别的问题时,这是一个有效的模型,但是它不能 ...
- Activity设置背景透明之开发坑
Activity设置背景透明的常规方法 方法一.在Manifest.xml中,直接在需要设置的Activity中添加主题样式: Android:theme="@android:style/T ...
- 安装centos6及安装redhat6后的配置
一.安装centos6 在引导到镜像后,选择: 我选择第二个,使用基本的显卡驱动安装系统 #第一个也是可以选的(安装或升级现有的系统) 之后,与 RHEL5 同样,使用光盘引导安装,系统会提示我们是否 ...
- Delphi函数的out、var等关键字的作用,和使用场景
问题描述 Delphi函数的out.var等关键字的作用,和使用场景 Delphi函数的out.var等关键字的作用,和使用场景,我知道var是作为传值调用,但是像out这个关键字又是什么作用呢? 解 ...