Day 9: TextBlob——对文本进行情感分析

简介: 又是“30天学习30种新技术”的一天,我打算暂时把JavaScript放一放,然后学下用Python进行文本处理。本文的重点是情感分析。我在几年前就对情感分析产生了兴趣,当时我想写一个分析与电影有关的推的应用。这个应用将帮助我决定是否看某部电影。

编者注:我们发现了比较有趣的系列文章《30天学习30种新技术》,准备翻译,一天一篇更新,年终礼包。下面是第9天的内容。


又是“30天学习30种新技术”的一天,我打算暂时把JavaScript放一放,然后学下用Python进行文本处理。本文的重点是情感分析。我在几年前就对情感分析产生了兴趣,当时我想写一个分析与电影有关的推的应用。这个应用将帮助我决定是否看某部电影。

我 google 了一番,最后发现 [Naive Bayes classifier]( Naive Bayes classifier) 可以解决这个问题。当时我只会Java语言,所以我写了一个定制的实现,用过一段时间这个应用。我太懒了,没有提交代码,所以我的机子挂掉之后,代码和应用丢失了。现在我把我所有的代码都提交到 github,我有大概 200 个公开的仓库 :)

这里我打算介绍下Python的TextBlob。我们首先讲一些基础知识,然后开发一个使用TextBlob API的Flask应用。

image.png

TextBlob是什么?

TextBlob是一个用Python编写的开源的文本处理库。它可以用来执行很多自然语言处理的任务,比如,词性标注,名词性成分提取,情感分析,文本翻译,等等。你可以在官方文档阅读TextBlog的所有特性。


为什么我要关心TextBlob?

我学习TextBlob的原因如下:

  1. 我想开发需要进行文本处理的应用。我们给应用添加文本处理功能之后,应用能更好地理解人们的行为,因而显得更加人性化。文本处理很难做对。TextBlob站在巨人的肩膀上(NTLK),NLTK是创建处理自然语言的Python程序的最佳选择。
  2. 我想学习下如何用 Python 进行文本处理。


安装 TextBlob

开始 TextBlob 之前,我们首先需要安装 Pythonvirtualenv。本文中使用 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 的例子。当用户输入的时候,他将看到他输入的内容是正面的(绿色)、负面的(红色),还是中性的(橙色)。

image.png

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')

defindex():

   return render_template('index.html')

@app.route('/api/v1/sentiment/<message>')

defsentiment(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_template函数。
  2. 从textblob包导入了TextBlob类。
  3. 定义了/index的路由。因此,如果用户向//index发出GET请求,index.html将渲染。
  4. 定义了/api/v1/sentiment/。这是预留位置,其中将包括用户需要运行情感分析的文本。我们创建了一个TextBlob实例,并将其传递给消息。然后我们得到消息的对立性和主体性,然后创建一个json对象并返回该对象。
  5. 最后,我们使用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>

   <metaname="viewport"content="width=device-width, initial-scale=1.0">

   <linkrel="stylesheet"type="text/css"href="static/css/bootstrap.css">

   <styletype="text/css">

   body {

     padding-top:60px;

     padding-bottom: 60px;

   }

 </style>

</head>

<body>

<divclass="navbar navbar-inverse navbar-fixed-top">

     <divclass="container">

       <divclass="navbar-header">

         <buttontype="button"class="navbar-toggle"data-toggle="collapse"data-target=".navbar-collapse">

           <spanclass="icon-bar"></span>

           <spanclass="icon-bar"></span>

           <spanclass="icon-bar"></span>

         </button>

         <aclass="navbar-brand"href="#">Run Sentiment Analysis</a>

       </div>

   </div>

 </div>

<divclass="container">

   <divclass="row">

       <divclass="col-md-6">

           <textareaclass="form-control"rows="3"placeholder="Write your text. Minimum length 10 characters"></textarea>  

       </div>

       <divclass="col-md-6">

           <pid="result"></p>

       </div>

   </div>

</div>

<scripttype="text/javascript"src="static/js/jquery.js"></script>

<scripttype="text/javascript">

   $("textarea").keyup(function(e){

       console.log('keycode '+e.keyCode);

       switch (e.keyCode) {

           case8:  // Backspace

               console.log('backspace'+e);

           case9:  // Tab

               console.log('Tab');

           case13: // Enter

               console.log('Enter');

           case37: // Left

               console.log('Left');

           case38: // Up

               console.log('Up');

           case39: // Right

               console.log('Right');

           case40: // 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);

               } elseif( 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 文件。


部署到云端

部署到云端前,先要完成一些配置工作。

  1. 注册一个OpenShift账号。注册是完全免费的,Red Hat给每个用户三枚免费的Gear,可以用Gear运行你的应用。在写作此文的时候,每个用户能免费使用总共 1.5 GB 内存和 3 GB 硬盘空间。
  2. 安装 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
  3. 使用 rhc 的 setup 命令配置你的 OpenShift 账号。这个命令会帮助你创建一个命名空间,同时将你的ssh公钥上传至 OpenShift 服务器。

输入如下命令即可将应用部署到OpenShift:

; rhccreate-appday9demopython-2.7--from-code

https://github.com/shekhargulati/day9-textblob-demo-openshift.git--timeout180

这个命令将创建应用,设置公开的DNS,创建私有git仓库,最后利用你的Github仓库中的代码来部署应用。应用将被部署到 http://day9demo-{domain-name}.rhcloud.com 。请用你的账户下的域名替换 {domain-name}. 本文中的应用跑在 http://showmesentiments-t20.rhcloud.com/

今天到此为止。多回馈撒~

相关文章
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
自然语言处理生成文本
自然语言处理生成文本
39 4
|
10月前
|
机器学习/深度学习 自然语言处理 数据挖掘
Python数据分析中文本分析的重要技术点,包括文本预处理、特征提取、情感分析
Python数据分析中文本分析的重要技术点,包括文本预处理、特征提取、情感分析
153 1
Python数据分析中文本分析的重要技术点,包括文本预处理、特征提取、情感分析
|
27天前
|
机器学习/深度学习 自然语言处理 算法
使用Python实现简单的文本情感分析
【9月更文挑战第13天】本文将介绍如何使用Python编程语言进行基础的文本情感分析。我们将通过一个简单的例子,展示如何利用自然语言处理库nltk和机器学习库sklearn来实现对文本数据的情感倾向性判断。文章旨在为初学者提供一个入门级的指导,帮助他们理解并实践文本情感分析的基本步骤和方法。
25 6
|
2月前
|
数据采集 机器学习/深度学习 自然语言处理
VLE基于预训练文本
8月更文挑战第21天
|
2月前
|
机器学习/深度学习 自然语言处理 算法
nlp文本提取关键词
8月更文挑战第21天
30 0
|
5月前
|
数据采集 机器学习/深度学习 人工智能
Python实现文本情感分析
Python实现文本情感分析
77 1
|
5月前
|
机器学习/深度学习 自然语言处理 安全
什么是 ChatGPT 生成的文本里所谓的安全词汇
什么是 ChatGPT 生成的文本里所谓的安全词汇
|
5月前
|
存储 机器学习/深度学习 自然语言处理
R语言自然语言处理(NLP):情感分析新闻文本数据
R语言自然语言处理(NLP):情感分析新闻文本数据
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【一起从0开始学习人工智能0x02】字典特征抽取、文本特征抽取、中文文本特征抽取
【一起从0开始学习人工智能0x02】字典特征抽取、文本特征抽取、中文文本特征抽取
79 1
|
机器学习/深度学习 文字识别 计算机视觉
文本识别 CRNN
文本识别 CRNN
296 0