返回介绍

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

发布于 2025-01-31 20:47:29 字数 9270 浏览 0 评论 0 收藏 0

又是 “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 的原因如下:

  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 的例子。当用户输入的时候,他将看到他输入的内容是正面的(绿色)、负面的(红色),还是中性的(橙色)。


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)

以上的代码做了这些事:

  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>
  <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 文件。

部署到云端

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

  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:

; 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/

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文