使用Node.js创建一个情感分析应用程序

Arvind Ravulavaru
分享

情感分析可以帮助你了解人们对某个话题的看法。我们将要构建的情绪分析应用程序将接受一个关键字,并从Twitter获取匹配的推文。然后,它将通过一个由AFINN支持的情感分析Node模块运行每条推文。该模块将对tweet文本进行评分,最后将显示相关统计数据。

在我们开始之前,您可以看一下演示在这里.您可以从。下载完整的源代码在这里

技术堆栈

这个应用程序是建立在Nodejs.我们将使用表达作为我们的服务器端框架和jQuery用于在客户端进行DOM操作。为了方便起见,我们将使用泥浆发电机命名slush-express(我写的)来为我们搭建一个新的Express应用程序。我们将使用一个轻量级的基于磁盘的DB命名diskDB(也是我写的)来存储结果。

我们会用到Twitter模块与推特互动情绪模块执行分析。

让我们开始吧。

设置App

创建一个名为sentimentAnalysisApp在这里打开一个新的终端/提示符。首先,我们将使用以下命令安装Gulp、Slush和Express生成器。

我要喝冰沙,冰沙快车

一旦上面的模块安装好,我们将使用下面的命令搭建一个新的Express应用程序:

泥浆表达

Slush会让你选择一个视图引擎和一个样式表引擎。答案如下所示。

[?选择一个视图引擎:HTML [?选择样式表引擎:CSS

slush将花费几分钟时间构建应用程序并安装依赖项。生成的脚手架文件夹结构如下所示:

sentimentAnalysisApp├──Gulpfile.js├──app.js├──bin│├──www├──bower。Json├──package。Json├──public──stylesheets│├──style.css├──routes│├──index.js│├──users.js├──views├──index.html├──index.html

下面是对不同文件和文件夹的快速解释。

  • bin / www—服务器启动和港口在这里配置。
  • app.js—服务器配置、路由和视图引擎都在这里配置。
  • gulpFile.js-我们项目的任务运行人。
  • /公共-由分配到UI的静态文件组成。
  • /路线—由应用路由组成。
  • /观点—由应用程序视图组成。

可以通过执行该命令运行应用程序狼吞虎咽地吃.这将在端口3000上启动Express服务器。导航到http://localhost:3000您可以看到示例主页。

服务器端开发

首先,我们将使用以下命令安装应用级依赖项:

NPM I推特情绪——保存

接下来,创建一个名为逻辑在项目的根本。创建两个名为twitterSearch.js而且sentimentAnalysis.js.这些文件由分别从Twitter获取推文和执行分析的逻辑组成。创建另一个名为db,用于存储数据。

接下来,打开路线/ index.js在你最喜欢的编辑器中。我们会增加一条新路线,POST /搜索.用户输入的搜索文本将被提交到此端点。更新路线/ index.js如下图所示。

使用严格的;Var express = require('express');var router = express.Router();var twitterSearch = require('../logic/twitterSearch');/* GET主页。* /路由器。Get ('/', function(req, res) {res.render('index');});路由器。post('/search', function(req, res) {twitterSearch(req.body。搜索,函数(数据){res.json(数据); }); }); module.exports = router;

twitterSearch ()函数将接收搜索词并从Twitter获取匹配的推文。然后,这些推文将被输入情绪分析模块,结果将作为回调返回。简单,是吧?

接下来,打开逻辑/ twitterSearch.js并添加以下代码。

//包含var util = require('util'), twitter = require('twitter'), sentimentAnalysis = require('./sentimentAnalysis'), db = require('diskdb');Db = Db。连接(“数据库”,['情绪']);//config var config = {consumer_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', consumer_secret: ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ', access_token_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx ', access_token_secret: ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx '};模块。exports =函数(文本,回调){var twitterClient =新的twitter(配置);var response = [], dbData = [];//存储tweets和情感twitterClient。搜索(text, function(data) {for (var I = 0;I < data.status .length;i++) {var resp = {}; resp.tweet = data.statuses[i]; resp.sentiment = sentimentAnalysis(data.statuses[i].text); dbData.push({ tweet: resp.tweet.text, score: resp.sentiment.score }); response.push(resp); }; db.sentiments.save(dbData); callback(response); }); }

为了获取推文,我们首先需要在Twitter上注册一个新的应用程序。然后,我们将生成在发出请求时使用的所需的键和令牌。

导航到Twitter的应用程序点击创建新应用.填下一页的表格。一旦创建了应用程序,我们将生成所需的令牌。点击API密钥选项卡,并向下滚动到页面底部。点击这里创建我的访问令牌.完成此操作后,您将看到一条刷新页面的消息,继续执行该操作。现在你可以看到API密匙API的秘密访问令牌,访问令牌秘密填满配置像这样的对象:

var config = {consumer_key: 'API key', consumer_secret: 'API secret', access_token_key: '访问令牌',access_token_secret: '访问令牌秘密'};

如遇到问题,请参考这个讨论

接下来,打开逻辑/ sentimentAnalysis.js并添加以下代码。

Var情绪=要求('情绪');模块。Exports =函数(文本){返回情绪(文本);};

逻辑很简单。我们接收推文文本并返回情绪对象。这就完成了我们的服务器。现在,让我们构建客户机。

客户端开发

首先创建一个名为脚本公共文件夹中。内部脚本,创建一个名为app.js然后在你最喜欢的编辑器中打开。app.js负责通过Ajax将表单提交到/搜索端点并在页面上显示结果。

我们要用约翰·瑞西格的JavaScript Micro-Templating用于从服务器数据构建标记的库(如果可以的话,一个小规模的MV*).我已经修改了模板库,以便我们可以使用{{}}而不是< % % >语法。这样我们就可以用ejs作为我们的服务器端模板来渲染HTML扩展页面。完成的app.js如下所示。

$(document).ready(function(){//处理提交$('#searchText')的表单。(键盘按键,功能(e){如果(e.which = = 13 | | e.keyCode = = 13) {if($(这).val () .trim()。长度> 0){//发起Ajax调用来发送数据fireAJAX($(this).val().trim());}}});函数fireAJAX(文本){$。ajax({type: 'POST', url: '/search', data: {search: text}, beforeSend: function(xhr) {$('.tweet-results').html(");$ (' .results '),告诉();enableState ();},成功:parseData,错误:oops});}函数parseData(data) {disableState();Var HTML = "; for (var i = 0; i < data.length; i++) { var s = data[i].sentiment, t = data[i].tweet; var _o = { imgSrc: t.user.profile_image_url, tweetLink: 'http://twitter.com/' + t.user.screen_name + '/status/' + t.id_str, tweet: t.text, score: s.score ? s.score : '--', comparative: s.comparative ? s.comparative : '--', favorited: t.favorite_count ? t.favorite_count : 0, retweet: t.retweet_count ? t.retweet_count : 0, wordsMatched: s.words && s.words.length ? s.words : '--', positiveWords: s.positive && s.positive.length ? s.positive : '--', negativeWords: s.negative && s.negative.length ? s.negative : '--' }; html += tmpl('tweet_tmpl', _o); }; $('.tweet-results').html(html); } function oops(data) { $('.error').show(); disableState(); } function disableState() { $('.loading').hide(); $('#searchText').prop('disabled', false); } function enableState() { $('.loading').show(); $('#searchText').prop('disabled', true); } }); // Simple JavaScript Templating // John Resig - http://ejohn.org/ - MIT Licensed (function() { var cache = {}; this.tmpl = function tmpl(str, data) { // Figure out if we're getting a template, or if we need to // load the template - and be sure to cache the result. var fn = !/\W/.test(str) ? cache[str] = cache[str] || tmpl(document.getElementById(str).innerHTML) : // Generate a reusable function that will serve as a template // generator (and which will be cached). new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" + // Introduce the data as local variables using with(){} "with(obj){p.push('" + // Convert the template into pure JavaScript str .replace(/[\r\t\n]/g, " ") .split("{{").join("\t") // modified .replace(/((^|\}\})[^\t]*)'/g, "$1\r") // modified .replace(/\t=(.*?)}}/g, "',$1,'") // modified .split("\t").join("');") .split("}}").join("p.push('") // modified .split("\r").join("\\'") + "');}return p.join('');"); // Provide some basic currying to the user return data ? fn(data) : fn; }; })();

接下来,打开视图/ index . html并添加以下代码。

<!DOCTYPE html>   情感分析App
    

情感分析App


results

< label class="loading"> loading ..请等待
Oops..出问题了