编者注:我们发明了比较风趣的系列文章《30天进修30种新技术》,预备翻译,一天一篇更新,年末礼包。下面是第9天的内容。
又是“30天进修30种新技术”的一天,我盘算临时把JavaScript放一放,然后学下用Python举行文本处置惩罚。本文的重点是情绪剖析。我在几年前就对情绪剖析产生了兴致,当时我想写一个剖析与影戏有关的推的运用。这个运用将协助我决议是不是看某部影戏。
我 google 了一番,末了发明 [Naive Bayes classifier]( Naive Bayes classifier) 能够处置惩罚这个题目。当时我只会Java言语,所以我写了一个定制的完成,用过一段时间这个运用。我太懒了,没有提交代码,所以我的机子挂掉以后,代码和运用丧失了。如今我把我一切的代码都提交到 github,我有也许 200 个公然的堆栈 :)
这里我盘算引见下Python的TextBlob。我们起首讲一些基础知识,然后开辟一个运用TextBlob API的Flask运用。
TextBlob是什么?
TextBlob是一个用Python编写的开源的文本处置惩罚库。它能够用来实行许多自然言语处置惩罚的使命,比方,词性标注,名词性身分提取,情绪剖析,文本翻译,等等。你能够在官方文档浏览TextBlog的一切特征。
为何我要体贴TextBlob?
我进修TextBlob的缘由以下:
我想开辟须要举行文本处置惩罚的运用。我们给运用增添文本处置惩罚功用以后,运用能更好地舆解人们的行动,因而显得越发人性化。文本处置惩罚很难做对。TextBlob站在伟人的肩膀上(NTLK),NLTK是建立处置惩罚自然言语的Python顺序的最好挑选。
我想进修下如何用 Python 举行文本处置惩罚。
装置 TextBlob
最先 TextBlob 之前,我们起首须要装置 Python 和 virtualenv。本文中运用 Python 2.7。
官方文档里提到了许多装置 TextBlob 的要领。 我们将运用pip install
。给不知道pip
的开辟者,pip
是Python的包管理器。我们能够从官网装置pip。
运转以下敕令能够装置 TextBlob:
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
目次,并经由过程virtualenv
激活Python 2.7,然后装置 textblob 包,末了下载必须的NLTK语料库。
GitHub 堆栈
本日的demo运用的代码可从github获得。
运用
demo运用跑在 OpenShift 上 http://showmesentiments-t20.rhcloud.com/ 它是一个异常简朴的运用 TextBlob 情绪剖析 API 的例子。当用户输入的时刻,他将看到他输入的内容是正面的(绿色)、负面的(赤色),照样中性的(橙色)。
https://www.openshift.com/sites/default/files/images/Sentiment%20Analysis%20Demo.png
我们将开辟一个运用REST API的简朴的Flask运用。假如你不相识Flask,你能够参考我之前写的关于Flask的文章。
接着我们将装置 Flask 框架。起首我们激活 virtualenv
,然后运用 pip 装置 Flask。
. venv/bin/activate
pip install flask
在我之前写的关于 Flask 的文章里已提到,用Flask写基于REST的web效劳相称轻易。在 myapp
目次下建立一个 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_template函数。
- 从textblob包导入了TextBlob类。
- 定义了
/
和index
的路由。因而,假如用户向/
和/index
发出GET要求,index.html
将衬着。 - 定义了
/api/v1/sentiment/
。这是预留位置,其中将包含用户须要运转情绪剖析的文本。我们建立了一个TextBlob实例,并将其传递给音讯。然后我们获得音讯的对立性和主体性,然后建立一个json对象并返回该对象。 - 末了,我们运用
python app.py
敕令启动一个开辟效劳器。我们同时开启了调试Debug=True
。如许当意料之外的状况出现时,浏览器就能够供应一个交互式的调试器。开启调试的另一个优点是,修改文件 以后,效劳会自动从新加载。我们能够让调试器在背景运转,然后继承在我们的运用上事情。这供应了高效的开辟环境。
index()
函数衬着 html 文件。 在 myapp
目次下建立一个名为模板的新文件夹,然后建立index.html
mkdir templates
touch templates/index.html
将下面代码复制到index.html
中。这段代码运用Twitter Bootstrap来增添款式。我们同时运用了jQuery,在keyup
事宜时举行REST挪用。假如键值为退格、制表符、回车、左、右、上、下,那末不举行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>
你能够从我的github 堆栈 中获得 js 和 css 文件。
布置到云端
布置到云端前,先要完成一些设置事情。
注册一个OpenShift账号。注册是完全免费的,Red Hat给每一个用户三枚免费的Gear,能够用Gear运转你的运用。在写作此文的时刻,每一个用户能免费运用统共 1.5 GB 内存和 3 GB 硬盘空间。
装置 rhc客户端东西。
rhc
是ruby gem,因而你的机子上须要装有 ruby 1.8.7以上版本。 只需输入sudo gem install rhc
即可装置 rhc 。假如你已装置过了,确保是最新版。运转sudo gem update rhc
即可晋级。关于设置rhc敕令行东西的详细信息,请参考: https://openshift.redhat.com/community/developers/rhc-client-tools-install运用 rhc 的 setup 敕令设置你的 OpenShift 账号。这个敕令会协助你建立一个定名空间,同时将你的ssh公钥上传至 OpenShift 效劳器。
输入以下敕令即可将运用布置到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 。请用你的账户下的域名替代 {domain-name}
. 本文中的运用跑在 http://showmesentiments-t20.rhcloud.com/
本日到此为止。多回馈撒~
原文 Day 9: TextBlob–Finding Sentiments in Text
翻译 SegmentFault