1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 使用Node.js创建情感分析应用程序

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

时间:2022-07-10 21:39:08

相关推荐

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

情绪分析可帮助您了解人们对某个主题的看法。 我们将要构建的情绪分析应用程序将使用一个或多个关键字,并将从Twitter获取匹配的推文。 然后,它将通过AFINN支持的情绪分析节点模块运行每个推文。 该模块将对推文文本进行评分,最后将显示相关统计信息。

在开始之前,您可以在此处查看演示。 您可以从此处下载完整的源代码。

技术栈

该应用程序基于Nodejs构建 。 我们将使用Express作为我们的服务器端框架,并使用jQuery在客户端进行DOM操作。 为使事情变得容易,我们将使用名为slush-express (由我编写)的Slush生成器为我们搭建一个新的Express应用。 我们将使用一个名为diskDB的轻量级基于磁盘的数据库(也由我编写)来存储结果。

我们将使用Twitter模块与Twitter和Sentiment模块进行交互以执行分析。

因此,让我们开始吧。

设置应用

创建一个名为sentimentAnalysisApp的新文件夹,并在此处打开一个新的终端/提示。 首先,我们将使用以下命令安装Gulp,Slush和Express生成器。

npm i -g gulp slush slush-express

安装上述模块后,我们将使用以下命令来搭建新的Express应用程序:

slush express

Slush会要求您选择视图引擎和样式表引擎。 回答如下所示。

[?] Select a View Engine: HTML[?] Select a Stylesheet Engine: CSS

需要花费几分钟才能安装应用程序并安装依赖项。 生成的脚手架文件夹结构如下所示:

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

这是不同文件和文件夹的快速说明。

bin / www–服务器启动和port已在此处配置。 app.js–此处配置了服务器配置,路由和视图引擎。 gulpFile.js–我们项目的任务运行器。 / public–包含分派到UI的静态文件。 / routes–包含应用程序路由。 / views–包含应用程序视图。

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

服务器端开发

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

npm i twitter sentiment --save

接下来,在项目的根目录下创建一个名为logic的新文件夹。 创建两个名为twitterSearch.jssentimentAnalysis.js文件。 这些文件包含分别从Twitter获取推文和执行分析的逻辑。 创建另一个名为db文件夹,该文件夹将存储数据。

接下来,在您喜欢的编辑器中打开routes/index.js。 我们将添加一条新路线POST /search。 用户输入的搜索文本将提交到此终点。 如下所示更新routes/index.js

'use strict';var express = require('express');var router = express.Router();var twitterSearch = require('../logic/twitterSearch');/* GET home page. */router.get('/', function(req, res) {res.render('index');});router.post('/search', function(req, res) {twitterSearch(req.body.search, function (data) {res.json(data);});});module.exports = router;

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

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

//includesvar util = require('util'),twitter = require('twitter'),sentimentAnalysis = require('./sentimentAnalysis'),db = require('diskdb');db = db.connect('db', ['sentiments']);//configvar config = {consumer_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',consumer_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',access_token_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx',access_token_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'};module.exports = function(text, callback) {var twitterClient = new twitter(config);var response = [], dbData = []; // to store the tweets and sentimenttwitterClient.search(text, function(data) {for (var i = 0; i < data.statuses.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应用程序 ,然后单击Create New App。 在下一页上填写表格。 创建应用程序后,我们将生成所需的令牌。 单击“API密钥”选项卡,然后向下滚动到页面底部。 单击“创建我的访问令牌”。 完成此操作后,您将看到一条消息,刷新页面,继续进行操作。 现在,您可以看到一个API密钥,API密钥,Access令牌和Access令牌密钥,并像这样填充config对象:

var config = {consumer_key: 'API key',consumer_secret: 'API secret',access_token_key: 'Access token',access_token_secret: 'Access token secret'};

如果您遇到问题,请参考此讨论 。

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

var sentiment = require('sentiment');module.exports = function(text) {return sentiment(text);};

逻辑很简单。 我们输入推文并返回sentiment对象。 这包装了我们的服务器。 现在,让我们建立客户。

客户端开发

首先创建一个新的文件夹命名为scripts里面public文件夹。 在scripts内部,创建一个名为app.js的新文件,然后在您喜欢的编辑器中将其打开。app.js负责通过Ajax将表单提交到/search端点,并在页面上显示结果。

我们将使用John Resig的JavaScript Micro-Templating库从服务器数据(如果可能的话,使用小型MV *)构建标记。 我已经修改了模板库,以便我们可以使用{{ }}代替<% %>语法。 这样,我们可以将ejs用作服务器端模板以呈现HTML扩展页面。 完整的app.js如下所示。

$(document).ready(function() {// handle the form submit$('#searchText').on('keypress', function(e) {if (e.which == 13 || e.keyCode == 13) {if ($(this).val().trim().length > 0) {// initiate an Ajax call to send the datafireAJAX($(this).val().trim());}}});function fireAJAX(text) {$.ajax({type: 'POST',url: '/search',data: {search: text},beforeSend: function(xhr) {$('.tweet-results').html('');$('.results').show();enableState();},success: parseData,error: oops});}function 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: '/' + t.user.screen_name + '/status/' + t.id_str,tweet: t.text,score: s.score ? s.score : '--',comparative: parative ? parative : '--',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 - / - 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 JavaScriptstr.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 userreturn data ? fn(data) : fn;};})();

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

<!DOCTYPE html><html><head><title>Sentiment Analysis App</title><link rel='stylesheet' href='/stylesheets/style.css' /></head><body><h1>Sentiment Analysis App</h1><hr/><input type="text" id="searchText" placeholder="Enter the text you would like to see the analysis for and hit return"><div class="results"><h3>Results</h3><lable class="loading">Loading.. Please wait</lable><br/><lable class="error">Oops.. Something went wrong</lable><br/></div><section class="tweet-results"></section><script src="///jquery-1.11.0.min.js"></script><script type="text/javascript" src="scripts/app.js"></script><script type="text/html" id="tweet_tmpl"><article><div class="left"><img src="{{=imgSrc}}"><p>{{=tweet}}<a href="{{=tweetLink}}" target="_blank">Link</a></p></div><div class="right"><table><tr><td>Score</td><td>{{=score}}</td></tr><tr><td>Comparative</td><td>{{=comparative}}</td></tr><tr><td>Favorited</td><td>{{=favorited}}</td></tr><tr><td>Retweeted</td><td>{{=retweet}}</td></tr><tr><td>Words Matched</td><td>{{=wordsMatched}}</td></tr><tr><td>Positive Words</td><td>{{=positiveWords}}</td></tr><tr><td>Negative Words</td><td>{{=negativeWords}}</td></tr></table></div></article></script></body></html>

在这里,我们指的是jQuery和app.js我们还创建了一个模板(tweet_tmpl),该模板将用于显示结果。 最后,打开stylesheets/style.css并添加以下类。

body {padding: 50px;font: 14px"Lucida Grande", Helvetica, Arial, sans-serif;background: #eee;}a {color: #00B7FF;}input {width: 98%;padding: 9px;font-size: 17px;}.results {display: none;}.error {color: red;display: none;}.tweet-results {width: 100%;overflow: hidden;padding-right: 18px;}.left {float: left;width: 39%;}.right {float: right;width: 55%;border-left: 1px dashed;padding-left: 21px;}article {background: #fff;display: block;padding: 18px;border: 1px solid #eee;margin-top: 21px;margin-bottom: 21px;overflow: hidden;box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);-moz-box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);-webkit-box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);}article img {width: 64px;float: left;margin:0 5px 0 0;}.right table {width: 100%;}.right table, .right table td {border: 1px solid;}.right table td {width: 50%;}

就是这样,我们完成了开发工作。 让我们运行该应用程序并进行测试。 返回终端,运行gulp命令以启动服务器。 导航到http://localhost:3000/,您应该看到搜索栏。 输入“ This is Awesome”,然后按回车键,您应该看到类似以下内容:

此处,Score是与AFINN来源相匹配的推文中存在的每个单词的分数总和。Comparative等于score/total wordsWords Matched显示处理过程中推文中有多少个单词与AFINN单词匹配。Positive Words是匹配的肯定词,Negative Words是匹配的否定词。 这些数据应为您提供足够的信息,以便您做出决定并了解情绪。

清除搜索栏,然后输入sad broken并点击回车。 您的结果应如下所示:

简单容易吧? 现在,您可以搜索一些单词,看看结果如何。

训练数据

您现在必须已经注意到,并非所有推文都返回结果。 这是因为,如果tweet中的所有单词都与AFINN单词都不匹配,则分数将为0。例如:

如果您想解决此问题,可以训练情感模块。 在名为training.jslogic文件夹中创建一个新文件,并添加以下代码。

module.exports = {directives: 4,angular: 5,code: 3,scope: 3};

在这里,我们正在训练模块以将上述分数用于所提到的单词。 接下来,像这样更新logic/sentimentAnalysis.js

var sentiment = require('sentiment');var trainedData = require('./training.js');module.exports = function(text) {return sentiment(text, trainedData);}

训练后,结果将如下所示:

这是一项非常强大的技术,因此请确保为关键字分配正确的值,否则可能会看到没有意义的结果。 有关更多信息,请参考AFINN 。

创建一个RESTful服务

您可以构建一个实时仪表板,以显示鸣叫和结果。 您可以运行一个异步作业,该作业将不时访问Twitter API,获取数据并使用diskDB保存。 然后,您可以将此文件公开为RESTful端点。 将以下代码添加到routes/index.js

router.get('/data', function(req, res) {res.json(require('diskdb').connect('db', ['sentiments']).sentiments.find());});

现在,当您访问http://localhost:3000/data您可以看到到目前为止保存的完整数据。 这里有一个现场示例。

整合社交媒体

与Twitter类似,您可以集成Facebook , Google+和其他社交媒体数据。 您需要做的就是将您要分析的文本传递给logic/sentimentAnalysis.js,您可以看到它的分数。

结论

我希望您对如何使用此应用程序进行情感分析有一个基本的了解。 谢谢阅读! 请发表评论。

From: /creating-sentiment-analysis-application-using-node-js/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。