前言
今天的30天學習30種技術挑戰,我決定先緩緩JavaScript, 學學用Python處理文字。這里我主要關注情感分析。幾年前我就對情感分析感興趣了,當時想寫一個程序反應大家在tweets上對一部電影的情感走向,然后發映出電影的情感分析。有了這些信息就可以幫我決定是否有必要看某部電影。
谷歌搜索后,發現Naive Bayes classifier可以解決這個問題。當時我只會Java, 花了些時間寫了個程序,當時很懶,沒有提交代碼,機器崩了后,程序和代碼都沒了。現在我所有的代買都提交到github上,差不多有200個公共倉庫了。:)
這篇博客,我們討論怎樣用一個叫TextBlob的Python包來解決這個問題,先講一些基礎知識再用TextBlob API寫個簡單的Flask應用。
什么是TextBlob?
TextBlob是用Python寫的開源文字處理庫。可以用來處理各種自然語言分析比如詞類標簽,名詞短語抽取,情感分析,翻譯等等。官網文檔有所有支持功能的介紹。
我為什么關注TextBlob?
我決定學習TextBlob的原因:
- 我想寫的程序需要文字處理。當我們在應用里加文字處理功能時,這個應用更人性化,能更好理解所做所為。文字處理很難真正處理。TextBlob站在巨人NTLK肩上, NTLK為Python程序提供先進平台,處理人類語言數據。
- 我想知道Python是怎樣處理文字的。
安裝TextBlob
在裝TextBlob之前,我們需要安裝Python和virtualenv, 我這里用的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寫的很簡單的示例。對於用戶類型,可以看到各種信息,贊成(綠色),反對(紅色), 中立(橙色).
我們會寫個簡單的應用,采用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)
這段代碼做了一下操作:
- 從Flask包導入Flask類,jsonify方法和render_tempate方法。
- 從textblob包導入TextBlob類。
- 定義'/' 和'index' url映射路徑,如果用戶用GET請求到'/' 或者'/index',index.html都會被加載。
- 定義一個'/api/v1/sentiment/' url映射路徑。這是一個占位符,用來顯示用戶存放情感分析后的文字信息。我們創建了一個TextBlob示例傳消息,接着,獲取主觀和客觀信息,然后用json對象返回。
- 最后我們用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文件。
發布到雲上
在發布之前,先准備幾步。
-
在OpenShift Account上注冊。 OpenShift完全免費,紅帽給每個用戶免費提供了3個Gears來運行程序。目前,這個資源分配合計有每人1.5GB內存,3GB磁盤空間。
-
在本機安裝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。
-
用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