前言

今天的30天学习30种技术挑战,我决定先缓缓JavaScript, 学学用Python处理文字。这里我主要关注情感分析。几年前我就对情感分析感兴趣了,当时想写一个程序反应大家在tweets上对一部电影的情感走向,然后发映出电影的情感分析。有了这些信息就可以帮我决定是否有必要看某部电影。

 

谷歌搜索后,发现Naive Bayes classifier可以解决这个问题。当时我只会Java, 花了些时间写了个程序,当时很懒,没有提交代码,机器崩了后,程序和代码都没了。现在我所有的代买都提交到github上,差不多有200个公共仓库了。:)

 

这篇博客,我们讨论怎样用一个叫TextBlob的Python包来解决这个问题,先讲一些基础知识再用TextBlob API写个简单的Flask应用。

python中text如何输入结果 python textblob_html

什么是TextBlob?

TextBlob是用Python写的开源文字处理库。可以用来处理各种自然语言分析比如词类标签,名词短语抽取,情感分析,翻译等等。官网文档有所有支持功能的介绍。

我为什么关注TextBlob?

我决定学习TextBlob的原因:

  1. 我想写的程序需要文字处理。当我们在应用里加文字处理功能时,这个应用更人性化,能更好理解所做所为。文字处理很难真正处理。TextBlob站在巨人NTLK肩上, NTLK为Python程序提供先进平台,处理人类语言数据。
  2. 我想知道Python是怎样处理文字的。

安装TextBlob

在装TextBlob之前,我们需要安装Pythonvirtualenv, 我这里用的Python是2.7的版本。

 

官网文档里有各种安装TextBlob的方法,这里我们用pip install 方式。如果不知道pip的,它是一个Python包管理器。可以从官方网站安装pip. 在你的机器上,运行一下命令。

$ mkdir myapp
$ cd myapp
$ virtualenv venv --python=python2.7
$ . venv/bin/activate
$ pip install textblob

$ curl https://raw.github.com/sloria/TextBlob/master/download_corpora.py | python

 

这个命令会在你本地创建一个myapp路径,然后用Python激活virtualenv,再安装TextBlob包,最后下载必要的NTLK词库。

Github 仓库

今天的代码示例放在github: day9-textblob-demo-openshift.

程序

示例程序运行在OpenShift上http://showmesentiments-t20.rhcloud.com/.用TextBlob情感分析API写的很简单的示例。对于用户类型,可以看到各种信息,赞成(绿色),反对(红色), 中立(橙色).

python中text如何输入结果 python textblob_html_02

我们会写个简单的应用,采用REST API, 如果对Flask不熟,可以参考之前的博客

 

接下来安装Flask框架,要安装Flask框架,需要先激活virtualenv再用pip安装。

$ . venv/bin/activate
$ pip install flask

 

如我之前在Flask博客里面所说,基于Web服务的REST太棒了,在myapp文件夹下新建一个app.py的文件。

$ touch app.py

 

复制下面代码粘贴到app.py文件.

from flask import Flask , jsonify, render_template
from textblob import TextBlob
 
app = Flask(__name__)
 
@app.route('/')
@app.route('/index')
def index():
    return render_template('index.html')
 
@app.route('/api/v1/sentiment/<message>')
def sentiment(message):
    text = TextBlob(message)
    response = {'polarity' : text.polarity , 'subjectivity' : text.subjectivity}
    return jsonify(response)
 
if __name__ == "__main__":
    app.run(debug=True)

 

这段代码做了一下操作:

  1. 从Flask包导入Flask类,jsonify方法和render_tempate方法。
  2. 从textblob包导入TextBlob类。
  3. 定义'/' 和'index' url映射路径,如果用户用GET请求到'/' 或者'/index',index.html都会被加载。
  4. 定义一个'/api/v1/sentiment/'      url映射路径。这是一个占位符,用来显示用户存放情感分析后的文字信息。我们创建了一个TextBlob示例传消息,接着,获取主观和客观信息,然后用json对象返回。
  5. 最后我们用python      app.py命令来启动服务,运行程序。把以上代码复制到app.py里,通过设置Debug=True启动调试。调试模式下,如果出现未知错误,可以在浏览器里交互调试。调试模式的另外一个好处是它可以自动加载更新。我们可以在后台环境开启调试,并保持应用继续工作。这就提供了一个高效率的生产环境。

 

Index()方法会加载html文件,在myapp路径下新建一个templates的文件夹,再建一个index.html的文件。

$ mkdir templates
$ touch templates/index.html

 

复制内容到index.html,用Twitter Boostrap添加格式,用jQuery使REST调用keyup事件。当键是backspace, tab, enter, left, right, up, down时不使用REST.

<html>
<head>
    <title>Do sentiment analysis on the text</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="static/css/bootstrap.css">
    <style type="text/css">
    body {
      padding-top:60px;
      padding-bottom: 60px;
    }
  </style>
</head>
<body>
 
<div class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">Run Sentiment Analysis</a>
        </div>
 
    </div>
  </div>
 
<div class="container">
    <div class="row">
        <div class="col-md-6">
            <textarea class="form-control" rows="3" placeholder="Write your text. Minimum length 10 characters"></textarea>   
        </div>
        <div class="col-md-6">
            <p id="result"></p>
        </div>
    </div>
 
</div>
 
 
<script type="text/javascript" src="static/js/jquery.js"></script>
<script type="text/javascript">
    $("textarea").keyup(function(e){
        console.log('keycode '+e.keyCode);
        switch (e.keyCode) {
            case 8:  // Backspace
                console.log('backspace'+e);
            case 9:  // Tab
                console.log('Tab');
            case 13: // Enter
                console.log('Enter');
            case 37: // Left
                console.log('Left');
            case 38: // Up
                console.log('Up');
            case 39: // Right
                console.log('Right');
            case 40: // Down
                console.log('Down');
            break;
 
            default:
            var input = $('textarea').val();
            $('#result').removeClass("alert alert-warning");
            $('#result').removeClass("alert alert-danger");
            $('#result').removeClass("alert alert-success");
            if (input.length > 10){
 
            $.get('/api/v1/sentiment/'+input,function(result){
 
                if(result.polarity < 0.0){
 
                    $('#result').addClass("alert alert-danger")   .text(input);
                } else if( result.polarity >= 0.0 && result.polarity <= 0.5){
                    $('#result').addClass("alert alert-warning").text(input);
                }else{
                    $('#result').addClass("alert alert-success").text(input);
                }
 
            })
        }
    }
 
 
    });
 
</script>
</body>
</html>

 

你可以从我的git上复制js 和css文件。

发布到云上

在发布之前,先准备几步。

  1. OpenShift      Account上注册。 OpenShift完全免费,红帽给每个用户免费提供了3个Gears来运行程序。目前,这个资源分配合计有每人1.5GB内存,3GB磁盘空间。
  2. 在本机安装rhc 客户端工具,rhc是ruby gem包,所以你需要安装1.8.7或以上版本的ruby。安装rhc,输入 
sudo gem install rhc

 

          如果已经安装了,确保是最新的,要更新rhc,输入

sudo gem update rhc

 

          想了解rhc command-line 工具,更多帮助参考https://openshift.redhat.com/community/developers/rhc-client-tools-install。

  1. 用rhc 安装命令安装OpenShift. 执行命令可以帮你创建空间,上传ssh 密钥到OpenShift服务器。

安装之后,我们可以运行以下命令来创建程序。

$ rhc create-app day9demo python-2.7 --from-code https://github.com/shekhargulati/day9-textblob-demo-openshift.git --timeout 180

 

它会执行所有从创建程序,到设置公共DNS, 到创建git私有仓库,最后用Github仓库的代码发布应用。程序运行在http://day9demo-{domain-name}.rhcloud.com. 替换你自己的域名。这