[譯] 第九天:TextBlob - 發現字里行間的情感


前言

今天的30天學習30種技術挑戰,我決定先緩緩JavaScript, 學學用Python處理文字。這里我主要關注情感分析。幾年前我就對情感分析感興趣了,當時想寫一個程序反應大家在tweets上對一部電影的情感走向,然后發映出電影的情感分析。有了這些信息就可以幫我決定是否有必要看某部電影。

 

谷歌搜索后,發現Naive Bayes classifier可以解決這個問題。當時我只會Java, 花了些時間寫了個程序,當時很懶,沒有提交代碼,機器崩了后,程序和代碼都沒了。現在我所有的代買都提交到github上,差不多有200個公共倉庫了。:)

 

這篇博客,我們討論怎樣用一個叫TextBlobPython包來解決這個問題,先講一些基礎知識再用TextBlob API寫個簡單的Flask應用。

什么是TextBlob?

TextBlob是用Python寫的開源文字處理庫。可以用來處理各種自然語言分析比如詞類標簽,名詞短語抽取,情感分析,翻譯等等。官網文檔有所有支持功能的介紹。

我為什么關注TextBlob?

我決定學習TextBlob的原因:

  1. 我想寫的程序需要文字處理。當我們在應用里加文字處理功能時,這個應用更人性化,能更好理解所做所為。文字處理很難真正處理。TextBlob站在巨人NTLK肩上, NTLKPython程序提供先進平台,處理人類語言數據。
  2. 我想知道Python是怎樣處理文字的。

安裝TextBlob

在裝TextBlob之前,我們需要安裝Pythonvirtualenv, 我這里用的Python2.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寫的很簡單的示例。對於用戶類型,可以看到各種信息,贊成(綠色),反對(紅色), 中立(橙色).

我們會寫個簡單的應用,采用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. 替換你自己的域名。這個程序運行在http://showmesentiments-t20.rhcloud.com/.

 

這就是今天的內容,繼續給反饋吧。

 

原文:https://www.openshift.com/blogs/day-9-textblob-finding-sentiments-in-text


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM