-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.js
127 lines (114 loc) · 3.58 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
'use strict';
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
var _ = require('lodash');
}
function textRank(V, niter, dampening) {
var d = dampening || 0.85;
var K = niter || 200;
var denom = [];
var ws = [];
function sum(edges) {
var acc = 0.0;
edges.forEach(function (edge) {
acc += edge.weight
});
return acc;
}
function accum(i) {
var sum = 0.0;
V[i].in.forEach(function (v_j) {
var j = v_j.index;
var v_ji = _.find(V[j].out, function (x) {
return x.index == i;
});
sum += (v_ji ? (v_ji.weight / denom[j] * ws[j].score) : 0.);
});
return sum;
}
V.forEach(function (v_j, j) {
denom[j] = sum(v_j.out);
ws[j] = {name: v_j.name, vertex: j, score: Math.random()};
});
for (var k = 0; k < K; ++k) {
for (var i = 0; i < V.length; ++i) {
var acc = accum(i);
ws[i].score = (1 - d) + d * acc;
}
}
ws.sort(function (x, y) {
return (y.score - x.score)
});
return ws;
}
function sentExGraph(sentences) {
function sim(s1, s2) {
return _.intersection(s1, s2).length / (Math.log(s1.length) + Math.log(s2.length));
}
var V = [];
for (var i = 0; i < sentences.length; ++i) {
for (var j = i + 1; j < sentences.length; ++j) {
var score = sim(sentences[i], sentences[j]);
V[i] = V[i] || {name: sentences[i], out: [], in: []};
V[j] = V[j] || {name: sentences[j], out: [], in: []};
// Symmetric
V[i].out.push({index: j, weight: score});
V[i].in.push({index: j, weight: score});
V[j].in.push({index: i, weight: score});
V[j].out.push({index: i, weight: score});
}
}
return V;
}
function keyExGraph(text, win) {
var V = [];
var edges = {};
var sz = text.length;
var winSz = win || 2;
var halfN = winSz / 2.;
var term2idx = {};
var n = 1;
function addIfNotPresent(term) {
if (!term2idx[term]) {
term2idx[term] = n++;
}
return term2idx[term] - 1;
}
for (var i = 0; i < sz; ++i) {
var token = text[i];
if (!token.pos.match(/^[NJ]/) && token.pos !== 'ADJ' && token.pos !== 'CD') {
continue;
}
var minWin = Math.max(0, i - halfN);
var maxWin = Math.min(sz, i + halfN);
for (var j = minWin; j < maxWin; ++j) {
if (i == j) {
continue;
}
var other = text[j];
if (!other.pos.match(/^[NJ]/) && other.pos !== 'ADJ' && other.pos !== 'CD') {
continue;
}
var edge = [token.term, other.term];
edge.sort();
edge = edge.join("____");
edges[edge] = 1;
}
}
for (var e in edges) {
var thisFirst = e.split("____");
i = addIfNotPresent(thisFirst[0]);
j = addIfNotPresent(thisFirst[1]);
V[i] = V[i] || {me: i, name: thisFirst[0], out: [], in: []};
V[j] = V[j] || {me: j, name: thisFirst[1], out: [], in: []};
V[i].out.push({index: j, weight: 1});
V[i].in.push({index: j, weight: 1});
V[j].out.push({index: i, weight: 1});
V[j].in.push({index: i, weight: 1});
}
return V;
}
if (typeof module !== 'undefined' && module.exports) {
module.exports.textRank = textRank;
module.exports.keyExGraph = keyExGraph;
module.exports.sentExGraph = sentExGraph;
}