python +jupyter (python3.5) 实现词云(png)

临渊羡鱼,不如退而结网。我们步步为营,从头开始帮助你用Python做出第一张词云图来。欢迎尝试哦!


需求

在大数据时代,你经常可以在媒体或者网站上看到一些非常漂亮的信息图。

例如这个样子。


或是这个样子的。

python +jupyter (python3.5) 实现词云(png)_第1张图片

看过之后你有什么感觉?想不想自己做一张出来?

如果你的答案是肯定的,我们就不要拖延了,今天就来一步步从零开始做个词云分析图。当然,做为基础的词云图,肯定比不上刚才那两张信息图酷炫。不过不要紧,好的开始是成功的一半嘛。食髓知味,后面你就可以自己升级技能,进入你开挂的成功之路。

网上教你做信息图的教程很多。许多都是利用了专用工具。这些工具好是好,便捷而强大。只是它们功能都太过专一,适用范围有限。今天我们要尝试的,是用通用的编程语言Python来做词云。

Python是一种时下很流行的编程语言。你不仅可以用它做数据分析和可视化,还能用来做网站、爬取数据、做数学题、写脚本替你偷懒……

知道豆瓣吗?它一开始就是用Python写的。

在目前的编程语言热度排序里,Python屈居第四(当然,很多人不同意,所以编程语言的排行榜有许多,你懂的)。但看问题要用发展眼光。随着数据科学的发展,Python有爆发的趋势。早点儿站上风口,很有益处。

如果你之前没有编程基础,没关系。从零开始,意味着我会教你如何安装Python运行环境,一步步完成词云图。希望你不要限于浏览,而是亲自动手尝试一番。到完成的那一步,你不仅可以做出第一张词云图,而且这还将是你的第一个有用的编程作品。

心动了?那咱们就开始吧。


效果展示:


笔者为了实现这玩意可是鼓捣了一天(哈哈!已笑哭,这么菜)


那么笔者(python 小白)就把这填坑之路细细道来


首先我们需要搭建环境  python + pip (只需要看这两个就行)


第一个坑

一. 现象 && 原因

出现如下 Error
ImportError: No module named 'pysqlite2'

查看出错代码时,有下面的信息:

File "$/venv/lib/python3.5/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py"
, line 334, in dbapi
from pysqlite2 import dbapi2 as sqlite

问题原因,可能为 无法打开 pysqlite2 库,因使用 Python3.5 作为开发环境, Python 3.5 默认使用 sqlite3,且可以替代pysqlite2
stackoverflow 上,有人建议使用sqlite3 替换pysqlite2,详见这里 。

展开出错位置代码如下:

    @classmethod
    def dbapi(cls):
        try:
           from pysqlite2 import dbapi2 as sqlite
        except ImportError as e:
            try:
                from sqlite3 import dbapi2 as sqlite  # try 2.5+ stdlib name.
            except ImportError:
                raise e

这里已经对不同版本使用 sqlite做出了处理。所以该问题并不是上述问题产生。

进入 Python3 交互环境后:
import sqlite3
会出现 Error.

原因是编译安装 Python3 时,缺少 sqlite3 依赖。
yum install sqlite-devel   (先安装这玩意 不然python都要重新装)

如果使用tkinter 需要安装

yum install tcl-devel

yum install tk_devel
重新编译安装 Python3 后问题得到解决。


安装python3.5 和pip 安装链接


笔者环境是将安装好的  /usr/local/python/python3/bin/    pip3  以及  python3  已软链接的方式连接到 /usr/bin  目录下

命令 :   ln -s   /usr/local/python/python3/bin/pip3   /usr/bin/pip   

                ln -s   /usr/local/python/python3/bin/python3   /usr/bin/python (可以先进入/usr/bin  执行命令   ll python*    看到 python -> python2  可以将 这个删除  rm -rf  python) 

              这时 python -V 就是 3.5版本

             之后可以升级pip 

             命令  :      pip install --upgrade pip(按照博客的顺序走)

          升级完成之后安装        

         1、安装依赖
         安装开发工具集:
         yum groupinstall 'Development Tools'

         2、安装jupyter
         pip install jupyter(这是安装)    ***    (pip卸载   pip uninstall PackageName 补充知识点)
          ln -s   /usr/local/python/python3/bin/jupyter   /usr/bin/jupyter

         3、安装 wordcloud
         pip install wordcloud

       
         4、在cd  /usr/local/nginx/html/                
             mkdir  ciyun
           
    也可以安装(scripy        *pip install scripy*)
    也可以安装(jieba        *pip install jieba* 中文分词)

数据

词云分析的对象,是文本。

理论上讲,文本可以是各种语言的。英文、中文、法文、阿拉伯文……

为了简便,我们这里以英文文本为例。你可以随意到网上找一篇英文文章作为分析对象。我特别喜欢英剧"Yes, minister",所以到维基百科上找到了这部剧的介绍词条。

python +jupyter (python3.5) 实现词云(png)_第2张图片

我把其中的正文文字部分拷贝了下来,存储为一个文本文件,叫做yes-minister.txt。

把这个文件挪动到我们的工作目录demo里。

好了,文本数据已经准备好了。开始进入编程的魔幻世界吧!


      运行 jupyter notebook --por=8888
      
第二大坑!!!

       地址问题

       笔者  jupyter notebook  怎么也不成功!!!

       提示笔者 address  有问题  
       此时直接上大招  远程连接jupyter (笔者是linux 阿里云线上 不是虚拟机)

      1、jupyter  notebook --generate-config   (生成jupyter配置文件)

      2、 生成密码 这一步其实用不到,因为不建议使用密码登录,修改配置文件的时候密码建议屏蔽

打开ipython,创建一个密文的密码:

In [1]: from notebook.auth import passwd

In [2]: passwd()

Enter password:

Verify password:

Out[2]: 'sha1:86346e4cdf7a:c57960216df752e8ee5d3b9b8de6941640e15273'

把密文复制下来
'sha1:86346e4cdf7a:c57960216df752e8ee5d3b9b8de6941640e15273'
  

3 修改配置文件

$   vim ~/.jupyter/jupyter_notebook_config.py
进行如下修改:
c.NotebookApp.ip='*'
#c.NotebookApp.password = u'sha1:86346e4cdf7a:c57960216df752e8ee5d3b9b8de6941640e15273'    (自己使用可以不使用密码笔者这里注释掉了)
c.NotebookApp.open_browser = False
c.NotebookApp.port =8888    #随便指定一个端口,使用默认8888也可以

个人建议:屏蔽掉密码那一行,如果不是服务器安装,而只是自己的虚拟机,自己用的虚拟机不需要安全设置

4,启动jupyter notebook

5,远程访问服务器 浏览器建议使用火狐,虚拟机下Linux里默认安装的是火狐浏览器

http://远程服务器ip:8888

6,如果登陆失败,则有可能是服务器防火墙设置的问题,此时最简单的方法是在本地建立一个ssh通道:
在本地终端中输入ssh username@address_of_remote -L127.0.0.1:1234:127.0.0.1:8888
便可以在localhost:1234直接访问远程的jupyter了。 username 一般为root

如果需要可以关闭防火墙,或者iptables -i INPUT -j ACCEPT,

在INPUT链前面加全通策略。


以上只是理想状态  笔者之后又遇到问题  报错大致意思为:不能以root 用户去启动

*************************************



下面开始建立新的用户   ( 新建用户并授权!!!)

1、添加用户
首先用adduser命令添加一个普通用户,命令如下:
#adduser tommy  //添加一个名为tommy的用户
#passwd tommy   //修改密码
Changing password for user tommy.
New UNIX password:     //在这里输入新密码
Retype new UNIX password:  //再次输入新密码
passwd: all authentication tokens updated successfully.
2、赋予root权限
方法一:修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉
## Allows people in group wheel to run all commands
%wheel    ALL=(ALL)    ALL
然后修改用户,使其属于root组(wheel),命令如下:
#usermod -g root tommy
修改完毕,现在可以用tommy帐号登录,然后用命令 su - ,即可获得root权限进行操作。
方法二:修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL
tommy   ALL=(ALL)     ALL
修改完毕,现在可以用tommy帐号登录,然后用命令 su - ,即可获得root权限进行操作。


切换用户后 

输入命令   :     jupyter notebook --port 8888

笔者以为 这下大功告成   但是出现了最大坑!!!!


天坑!!!


jupyter 启动报错 Permission denied: '/run/user/0/jupyter'

大致报错

$ jupyter notebook --port 8888
Traceback (most recent call last):
  File "/home/deploy/.virtualenvs/ironbank/bin/jupyter-notebook", line 11, in 
    sys.exit(main())
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/jupyter_core/application.py", line 267, in launch_instance
    return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/traitlets/config/application.py", line 588, in launch_instance
    app.initialize(argv)
  File "", line 2, in initialize
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/traitlets/config/application.py", line 74, in catch_config_error
    return method(app, *args, **kwargs)
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/notebook/notebookapp.py", line 1005, in initialize
    self.init_configurables()
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/notebook/notebookapp.py", line 804, in init_configurables
    connection_dir=self.runtime_dir,
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/traitlets/traitlets.py", line 529, in __get__
    return self.get(obj, cls)
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/traitlets/traitlets.py", line 508, in get
    value = self._validate(obj, dynamic_default())
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/jupyter_core/application.py", line 99, in _runtime_dir_default
    ensure_dir_exists(rd, mode=0o700)
  File "/home/deploy/.virtualenvs/ironbank/local/lib/python2.7/site-packages/ipython_genutils/path.py", line 167, in ensure_dir_exists
    os.makedirs(path, mode=mode)
  File "/home/deploy/.virtualenvs/ironbank/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/run/user/0/jupyter'


解决办法

输入命令:

jupyter --path


显示以下:

config:
    /home/jiahaiyong/.jupyter
    /usr/local/src/python/python3/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /home/jiahaiyong/.local/share/jupyter
    /usr/local/src/python/python3/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /run/user/0/jupyter


看着样子好像是修改 runtime 的设置就可以了


export XDG_RUNTIME_DIR="/home/haiyong/.jupyter"   (我新建立的用户haiyong) 

环境变量配置(上面的只是临时作用)

********************************************************************************************************************************************

$PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接。

  编辑你的 PATH 声明,其格式为:

  PATH=$PATH::::------:

  你可以自己加上指定的路径,中间用冒号隔开。环境变量更改后,在用户下次登陆时生效,如果想立刻生效,则可执行下面的语句:$ source .bash_profile

  需要注意的是,最好不要把当前路径 “./” 放到 PATH 里,这样可能会受到意想不到的攻击。完成后,可以通过 $ echo $PATH 查看当前的搜索路径。这样定制后,就可以避免频繁的启动位于 shell 搜索的路径之外的程序了。

1. 可用 export 命令查看PATH值

[root@localhost u-boot-sh4]# export
declare -x CVS_RSH="ssh"
declare -x DISPLAY=":0.0"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="zh_CN.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/root"
declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/opt/STM/STLinux-2.3/devkit/sources/u-boot/u-boot-sh4"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x TERM="xterm"
declare -x USER="root"
declare -x XAUTHORITY="/root/.xauthkSzH7b"

2. 单独查看PATH环境变量,可用:

[root@localhost u-boot-sh4]#echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

3. 添加PATH环境变量(临时),可用:

[root@localhost u-boot-sh4]#export PATH=/opt/STM/STLinux-2.3/devkit/sh4/bin:$PATH

再次查看:

[root@localhost u-boot-sh4]# echo $PATH
/opt/STM/STLinux-2.3/devkit/sh4/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

说明添加PATH成功。

上述方法的PATH 在终端关闭 后就会消失。

4. 永久添加环境变量(影响当前用户)
#vim ~/.bashrc
export PATH="/opt/STM/STLinux-2.3/devkit/sh4/bin:$PATH"
 
5.永久添加环境变量(影响所有用户)
# vim /etc/profile
在文档最后,添加:
export PATH="/opt/STM/STLinux-2.3/devkit/sh4/bin:$PATH"
保存,退出,然后运行:
#source /etc/profile

不报错则成功。

问题:

1. 做了各实验,在/etc/profile, ~/.profile, ~/.bashrc中加入新PATH,重启都没有效果,只有使用source才可以,ubunt12.04

 找到原因,~/.zshrc导致的,因为在zshrc中直接对PATH重新赋值,而没有继承之前的$PATH,导致启动加载完/etc/profile后,PATH又被重新赋值。

*****************************************************************************************************************************************************************+

此时再次启动 

进入  目录页 /usr/local/nginx/html/ciyun/

jupyter notebook --port 8888



查看linux


将token 值 当密码登录


浏览器会自动开启,并且显示如下界面。

python +jupyter (python3.5) 实现词云(png)_第3张图片

这就是咱们刚才的劳动成果——安装好的运行环境了。我们还没有编写程序,目录下只有一个刚才生成的文本文件。

打开这个文件,浏览一下内容。

python +jupyter (python3.5) 实现词云(png)_第4张图片

回到Jupyter笔记本的主页面。我们点击New按钮,新建一个笔记本(Notebook)。在Notebooks里面,请选择Python 3选项。  (笔者这里是只有python3)

python +jupyter (python3.5) 实现词云(png)_第5张图片

系统会提示我们输入Notebook的名称。程序代码文件的名称,你可以随便起。但是我建议你起一个有意义的名字,将来好方便查找。由于我们要尝试词云,就叫它wordcloud好了。

python +jupyter (python3.5) 实现词云(png)_第6张图片

然后就出现了一个空白的笔记本,供我们使用了。我们在网页里唯一的代码文本框里,输入以下3条语句。请务必逐字根据示例代码输入,空格数量都不可以有差别。尤其注意第三行,用4个空格,或者1个Tab开始。输入后,按Shift+Enter键,就可以执行了。

filename = "yes-minister.txt"
with open(filename) as f:
 mytext = f.read()

没有任何结果啊。

对,因为我们这里没有任何输出动作,程序只是打开了你的yes-minister.txt文本文件,把里面的内容都读了出来,存储到了一个叫做mytext的变量里面。

然后我们尝试显示mytext的内容。输入以下语句之后,还是得按Shift+Enter键,系统才会实际执行该语句。

mytext

之后的步骤里,也千万不要忘了这一确认执行动作。

显示的结果如下图所示。

python +jupyter (python3.5) 实现词云(png)_第7张图片

嗯,看来mytext变量里存储的文本就是我们从网上摘来的文字。到目前为止,一切正常。

然后我们呼唤(import)词云包,利用mytext中存储的文本内容来制造词云。

from wordcloud import WordCloud
wordcloud = WordCloud().generate(mytext)

这时程序可能会报警。别担心。警告(warning)不影响程序的正常运行。

python +jupyter (python3.5) 实现词云(png)_第8张图片

此时词云分析已经完成了。你没看错,制作词云的核心步骤只需要这2行语句,而且第一条还只是从扩展包里找外援。但是程序并不会给我们显示任何东西。

说好了的词云呢?折腾了这么半天,却啥也没有,你蒙人吗?!

别激动。输入下面4行语句后,就是见证奇迹发生的时刻了。

%pylab inline
import matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")

运行结果如图所示:

python +jupyter (python3.5) 实现词云(png)_第9张图片

不用那么兴奋嘛。

你可以在词云图片上单机鼠标右键,用“图片另存为”功能导出。

python +jupyter (python3.5) 实现词云(png)_第10张图片

通过这张词云图,我们可以看到不同单词和词组出现的频率高低差别。高频词的字体明显更大,而且颜色也很醒目。值得说明的是,最显眼的单词Hacker并不是指黑客,而是指这部剧的主角之一——哈克首相。

包含程序完整代码的ipynb文件,我也分享了出来,你可以从 这里 下载。

希望你在尝试过程中一切顺利。对自己生成的词云图满意吗?如果你不满意,也不要紧,可以挖掘wordcloud软件包的其他高级功能。尝试一下,看自己能不能做出这样的词云图来?

python +jupyter (python3.5) 实现词云(png)_第11张图片



本文大部分是参考  王树义大牛文章

参考  python wordcloud 模块

如果想要达成 上面链接的效果   需要安装scripy 、tkinter 模块

以及在运行python文件头部加入

import matplotlib
matplotlib.use('Agg')
             


pip安装软件时出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*的解决方案

http://blog.csdn.net/u011092188/article/details/64123561



你可能感兴趣的:(Python)