[30天学习30种技术] 第九天 这篇博客,我们讨论怎样用一个叫TextBlob的Python包来解决这个问题,先讲一些基础知识再用TextBlob API写个简单的Flask应用。
今天的
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.
<
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
>
<
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