김지훈

Working : add textrank

added modules : multiset-jaccard, textrank-node, async, mecab-ya
...@@ -56,5 +56,8 @@ app.use(function(err, req, res, next) { ...@@ -56,5 +56,8 @@ app.use(function(err, req, res, next) {
56 }); 56 });
57 }); 57 });
58 58
59 +app.listen(process.env.PORT||3000, function(){
60 + console.log ("Server is running at 3000");
61 +});
59 62
60 module.exports = app; 63 module.exports = app;
......
...@@ -6,13 +6,17 @@ ...@@ -6,13 +6,17 @@
6 "start": "node ./bin/www" 6 "start": "node ./bin/www"
7 }, 7 },
8 "dependencies": { 8 "dependencies": {
9 + "async": "^2.1.2",
9 "body-parser": "~1.15.1", 10 "body-parser": "~1.15.1",
10 "cookie-parser": "~1.4.3", 11 "cookie-parser": "~1.4.3",
11 "debug": "~2.2.0", 12 "debug": "~2.2.0",
12 "express": "~4.13.4", 13 "express": "~4.13.4",
13 "jade": "~1.11.0", 14 "jade": "~1.11.0",
15 + "mecab-ya": "^0.1.1",
14 "morgan": "~1.7.0", 16 "morgan": "~1.7.0",
17 + "multiset-jaccard": "^0.1.1",
15 "node-readability": "^2.2.0", 18 "node-readability": "^2.2.0",
16 - "serve-favicon": "~2.3.0" 19 + "serve-favicon": "~2.3.0",
20 + "textrank-node": "^0.1.9"
17 } 21 }
18 } 22 }
......
1 var express = require('express'); 1 var express = require('express');
2 var router = express.Router(); 2 var router = express.Router();
3 +var read = require('node-readability');
4 +var jaccard = require('multiset-jaccard');
5 +var mecab = require('mecab-ya');
6 +var textrank = require('textrank-node');
7 +var ranker = new textrank();
8 +var async = require('async');
3 9
4 /* GET home page. */ 10 /* GET home page. */
5 router.get('/', function(req, res, next) { 11 router.get('/', function(req, res, next) {
6 - res.render('index', { title: 'Express' }); 12 +
13 + var text = "박근혜 대통령과 새누리당 친박 지도부가 도널드 트럼프의 미국 대통령 당선을 계기로 정국 반전을 꾀하고 있다. 이른바 ‘트럼프 리스크’를 부각하며 내부가 분열하면 난국을 헤쳐갈 수 없다고 바람잡이에 나선 것이다. 박 대통령은 어제 트럼프 당선자와의 통화에서 그의 방한을 요청하며 “만나기를 고대한다”고 말했다. 이정현 새누리당 대표는 박 대통령이 군통수권도 총리에게 넘겨야 한다는 문재인 전 민주당 대표의 발언을 반헌법적인 발상이라고 역공했다. 새누리당은 또 간담회 등을 개최하면서 ‘트럼프 비상체제’를 내세우고 있다. 박 대통령과 친박 지도부가 트럼프 문제를 내세워 위기를 덮으려는 것이다.";
14 +
15 + var sentences = ranker.splitToSentences(text);
16 + var graph = new Array();
17 + // 1st para in async.each() is the array of items
18 + async.each(sentences,
19 + // 2nd param is the function that each item is passed to
20 + function(sentence, callback){
21 + // Call an asynchronous function, often a save() to DB
22 + var sentenceSimilarity = new Array();
23 +
24 + async.each(sentences, function(sentence_2, callback_2) {
25 + mecab.nouns(sentence, function(err, result) {
26 + mecab.nouns(sentence_2, function(err, result_2) {
27 + console.log("result : " , result);
28 + console.log("result2: " , result_2);
29 + var index = jaccard.index(result, result_2);
30 + sentenceSimilarity.push(index);
31 + callback_2();
32 + });
33 + });
34 + },
35 + function(err) {
36 + graph.push(sentenceSimilarity);
37 + callback();
38 + });
39 + },
40 + // 3rd param is the function to call when everything's done
41 + function(err){
42 + // All tasks are done now
43 + var Rank = ranker.getTextRank(graph).probabilityNodes;
44 + var selectedIndex = ranker.getSelectedIndex(Rank, 3);
45 + var result = '';
46 + for(var i = 0; i < 3; i++){
47 + for(var j = 0; j < sentences.length; j++){
48 + if(selectedIndex[i] === j){
49 + result += sentences[j] + ' ';
50 + }
51 + }
52 + }
53 +
54 + return res.render('index', { title: result });
55 + }
56 + );
57 +
58 +
59 +});
60 +
61 +// 다른 요약기에 비해 얼마나 성능 향상이 있었는지 확인하기 위함.
62 +router.get('/read', function(req, res, next) {
63 + read('http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=104&sid2=232&oid=421&aid=0002379859', function(err, article, meta) {
64 +
65 + // Title
66 + console.log(article.title);
67 + // Main Article
68 + console.log(article.content);
69 +
70 + res.json({
71 + title : article.title,
72 + content : article.content
73 + }, function(){
74 + // Close article to clean up jsdom and prevent leaks
75 + article.close();
76 + });
77 +});
7 }); 78 });
8 79
9 module.exports = router; 80 module.exports = router;
......