PageRanking in gulpfile and hasCredential instead of attendee

This commit is contained in:
Ruben van de Ven 2020-03-24 21:27:14 +01:00
parent 4045f05121
commit 88ab656328
13 changed files with 1624 additions and 1462 deletions

View file

@ -2,11 +2,18 @@
RewriteEngine On RewriteEngine On
RewriteRule "^2018/data-flaneur$" "index.html" RewriteRule "^2018/data-flaneur$" "index.html"
RewriteRule "^2018/digital-cultures$" "index.html" RewriteRule "^2018/digital-cultures$" "index.html"
RewriteRule "^2020/acts-of-collection-and-omission$" "index.html"
RewriteRule "^article/choose-how-you-feel-you-have-seven-options$" "index.html" RewriteRule "^article/choose-how-you-feel-you-have-seven-options$" "index.html"
RewriteRule "^assets/video/guerilla_project.mp4$" "index.html" RewriteRule "^assets/video/guerilla_project.mp4$" "index.html"
RewriteRule "^choose-how-you-feel-you-have-seven-options$" "index.html"
RewriteRule "^degree/avm$" "index.html"
RewriteRule "^degree/cddc$" "index.html"
RewriteRule "^degree/mechanical-engineering$" "index.html"
RewriteRule "^degree/media-design$" "index.html"
RewriteRule "^emotionhero$" "index.html" RewriteRule "^emotionhero$" "index.html"
RewriteRule "^event/2018/yama-ichi$" "index.html" RewriteRule "^event/2018/yama-ichi$" "index.html"
RewriteRule "^event/2019/ccu-presentation$" "index.html" RewriteRule "^event/2019/ccu-presentation$" "index.html"
RewriteRule "^event/cqrrelations$" "index.html"
RewriteRule "^event/creativity-and-cognition$" "index.html" RewriteRule "^event/creativity-and-cognition$" "index.html"
RewriteRule "^exercises-in-overfitting$" "index.html" RewriteRule "^exercises-in-overfitting$" "index.html"
RewriteRule "^exercises-in-overfitting/image/1$" "index.html" RewriteRule "^exercises-in-overfitting/image/1$" "index.html"
@ -43,6 +50,7 @@ RewriteRule "^mvp3$" "index.html"
RewriteRule "^mvp3/image/1$" "index.html" RewriteRule "^mvp3/image/1$" "index.html"
RewriteRule "^mvps$" "index.html" RewriteRule "^mvps$" "index.html"
RewriteRule "^organisation/ccu$" "index.html" RewriteRule "^organisation/ccu$" "index.html"
RewriteRule "^organisation/constant$" "index.html"
RewriteRule "^organisation/nsvp$" "index.html" RewriteRule "^organisation/nsvp$" "index.html"
RewriteRule "^organisation/setup$" "index.html" RewriteRule "^organisation/setup$" "index.html"
RewriteRule "^organisation/v2_$" "index.html" RewriteRule "^organisation/v2_$" "index.html"
@ -53,9 +61,11 @@ RewriteRule "^person/joseph-huot$" "index.html"
RewriteRule "^person/merijn-van-moll$" "index.html" RewriteRule "^person/merijn-van-moll$" "index.html"
RewriteRule "^person/mikel-folgerts$" "index.html" RewriteRule "^person/mikel-folgerts$" "index.html"
RewriteRule "^person/ward-goes$" "index.html" RewriteRule "^person/ward-goes$" "index.html"
RewriteRule "^pillow-talk$" "index.html"
RewriteRule "^place/in4art$" "index.html" RewriteRule "^place/in4art$" "index.html"
RewriteRule "^place/q21$" "index.html" RewriteRule "^place/q21$" "index.html"
RewriteRule "^plottingdata$" "index.html" RewriteRule "^plottingdata$" "index.html"
RewriteRule "^residency/q21$" "index.html"
RewriteRule "^residency/summer-sessions$" "index.html" RewriteRule "^residency/summer-sessions$" "index.html"
RewriteRule "^samawati/video$" "index.html" RewriteRule "^samawati/video$" "index.html"
RewriteRule "^spectacular-spectator-mood-meter$" "index.html" RewriteRule "^spectacular-spectator-mood-meter$" "index.html"
@ -73,6 +83,7 @@ RewriteRule "^@type/Event$" "index.html"
RewriteRule "^@type/Report$" "index.html" RewriteRule "^@type/Report$" "index.html"
RewriteRule "^@type/VideoObject$" "index.html" RewriteRule "^@type/VideoObject$" "index.html"
RewriteRule "^@type/MediaObject$" "index.html" RewriteRule "^@type/MediaObject$" "index.html"
RewriteRule "^@type/EducationalOccupationalCredential$" "index.html"
RewriteRule "^@type/ExhibitionEvent$" "index.html" RewriteRule "^@type/ExhibitionEvent$" "index.html"
RewriteRule "^@type/ImageObject$" "index.html" RewriteRule "^@type/ImageObject$" "index.html"
RewriteRule "^@type/Festival$" "index.html" RewriteRule "^@type/Festival$" "index.html"
@ -83,5 +94,6 @@ RewriteRule "^@type/Person$" "index.html"
RewriteRule "^@type/EventVenue$" "index.html" RewriteRule "^@type/EventVenue$" "index.html"
RewriteRule "^@type/Museum$" "index.html" RewriteRule "^@type/Museum$" "index.html"
RewriteRule "^@type/PerformingGroup$" "index.html" RewriteRule "^@type/PerformingGroup$" "index.html"
RewriteRule "^@type/VisualArtsEvent$" "index.html"
RewriteRule "^@type/CollegeOrUniversity$" "index.html" RewriteRule "^@type/CollegeOrUniversity$" "index.html"
RewriteRule "^@type/WebSite$" "index.html" RewriteRule "^@type/WebSite$" "index.html"

View file

@ -6,7 +6,7 @@ body {
font-family: "DDINRegular", helvetica, sans-serif; font-family: "DDINRegular", helvetica, sans-serif;
font-weight: light; font-weight: light;
height: 100vh; height: 100vh;
background: black; background: #222;
font-size: 12pt; } font-size: 12pt; }
a, a:link, a:visited { a, a:link, a:visited {
@ -162,7 +162,7 @@ text {
width: 0; } width: 0; }
#nodeDetails .nodeType { #nodeDetails .nodeType {
font-size: 80%; font-size: 80%;
text-transform: uppercase; font-variant-caps: small-caps;
color: #999; color: #999;
margin-left: 10px; } margin-left: 10px; }
#nodeDetails .nodeType:hover { #nodeDetails .nodeType:hover {
@ -201,7 +201,8 @@ text {
width: 170px; width: 170px;
font-weight: bold; font-weight: bold;
min-height: 25px; min-height: 25px;
clear: both; } clear: both;
word-wrap: anywhere; }
#nodeDetails dd { #nodeDetails dd {
min-height: 30px; min-height: 30px;
margin-top: 5px; } margin-top: 5px; }

View file

@ -45,7 +45,7 @@ function getNodeYear(n) {
return n['https://schema.org/datePublished'].substr(0, 4); return n['https://schema.org/datePublished'].substr(0, 4);
} }
if (typeof n['https://schema.org/startDate'] !== 'undefined') { if (typeof n['https://schema.org/startDate'] !== 'undefined') {
console.log(n['https://schema.org/startDate']); // console.log(n['https://schema.org/startDate']);
return n['https://schema.org/startDate'].substr(0, 4); return n['https://schema.org/startDate'].substr(0, 4);
} }
if (typeof n['https://schema.org/endDate'] !== 'undefined') { if (typeof n['https://schema.org/endDate'] !== 'undefined') {
@ -125,10 +125,24 @@ var graph;
var nodeMap = {}; var nodeMap = {};
var linkMap = {}; var linkMap = {};
var breadcrumbs = {}; var breadcrumbs = {};
var weights = {};
// load the flattened jsonld file // load the flattened jsonld file
var requestPromise = fetch('/assets/js/rubenvandeven.jsonld').then(function (r) { var requestPromise = fetch('/assets/js/rubenvandeven.jsonld').then(function (r) {
return r.json(); return r.json();
}).then(function (data) { });
var rankingPromise = fetch('/assets/js/ranking.json').then(function (r) {
return r.json();
});
Promise.all([requestPromise, rankingPromise]).then(function (values) {
if (values[0].hasOwnProperty('@graph')) {
data = values[0];
weights = values[1];
} else {
data = values[1];
weights = values[0];
}
graph = jsonLdToGraph(data['@graph']); graph = jsonLdToGraph(data['@graph']);
// create a map of nodes by id. // create a map of nodes by id.
for (var i in graph.nodes) { for (var i in graph.nodes) {
@ -199,8 +213,7 @@ var firstNodeId = "https://rubenvandeven.com/";
function getSizeForNode(node) { function getSizeForNode(node) {
if (node.hasOwnProperty('https://schema.org/thumbnailUrl')) return nodeSize; if (node.hasOwnProperty('https://schema.org/thumbnailUrl')) return nodeSize;
//if(weights[node['@id']]) if (weights[node['@id']]) return nodeSize * weights[node['@id']];
// return nodeSize * weights[node['@id']];
if (node['@id'] == firstNodeId) return nodeSize * 1.2; if (node['@id'] == firstNodeId) return nodeSize * 1.2;
// everynode has at least one link. these should equal 1 // everynode has at least one link. these should equal 1
return nodeSize * (.7 + Math.min(20, linkMap[node['@id']].length) / 40); return nodeSize * (.7 + Math.min(20, linkMap[node['@id']].length) / 40);
@ -534,7 +547,7 @@ function startGraph(graph) {
deselectNode(); deselectNode();
if (updateHistory) { if (updateHistory) {
// TODO: working // TODO: working
console.log(types[0], getDisplayAttr(types[0]), types.map(getDisplayAttr)); // console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr));
history.pushState({ types: types }, "", "/@type/" + types.map(getDisplayAttr).join("+")); history.pushState({ types: types }, "", "/@type/" + types.map(getDisplayAttr).join("+"));
} else { } else {
history.replaceState({ types: types }, "", "/@type/" + types.map(getDisplayAttr).join("+")); history.replaceState({ types: types }, "", "/@type/" + types.map(getDisplayAttr).join("+"));
@ -729,11 +742,17 @@ function startGraph(graph) {
} }
} }
// relationships / links in <dl> // relationships / links incomming <dl>
for (var _attr in relDown) { for (var _attr in relDown) {
var attrEl = document.createElement("dt"); var attrEl = document.createElement("dt");
attrEl.innerHTML = getDisplayAttr(_attr); attrEl.innerHTML = getDisplayAttr(_attr);
relsEl.appendChild(attrEl); relsEl.appendChild(attrEl);
// highest pagerank first:
relDown[_attr].sort(function (a, b) {
return weights[b['@id']] - weights[a['@id']];
});
for (var _i2 in relDown[_attr]) { for (var _i2 in relDown[_attr]) {
var rel = relDown[_attr][_i2]; var rel = relDown[_attr][_i2];
relsEl.appendChild(createRelationshipEl(rel)); relsEl.appendChild(createRelationshipEl(rel));
@ -752,10 +771,17 @@ function startGraph(graph) {
} }
} }
// relationships / links outgoing <dl>
for (var _attr2 in relUp) { for (var _attr2 in relUp) {
var _attrEl = document.createElement("dt"); var _attrEl = document.createElement("dt");
_attrEl.innerHTML = getDisplayAttr(_attr2); _attrEl.innerHTML = getDisplayAttr(_attr2);
relsEl.appendChild(_attrEl); relsEl.appendChild(_attrEl);
// highest pagerank first:
relUp[_attr2].sort(function (a, b) {
return weights[b['@id']] - weights[a['@id']];
});
for (var _i3 in relUp[_attr2]) { for (var _i3 in relUp[_attr2]) {
var _rel = relUp[_attr2][_i3]; var _rel = relUp[_attr2][_i3];
relsEl.appendChild(createRelationshipEl(_rel, _i3)); relsEl.appendChild(createRelationshipEl(_rel, _i3));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
assets/js/ranking.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -10,6 +10,7 @@ var browserSync = require('browser-sync');
var jsonld = require('jsonld'); var jsonld = require('jsonld');
var source = require('vinyl-source-stream'); var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer'); var buffer = require('vinyl-buffer');
var exec = require('child_process').exec;
var through = require('through2') var through = require('through2')
@ -106,21 +107,39 @@ function createHtaccessFromFlattenedJsonld(flattened) {
require('fs').writeFileSync('.htaccess', contentLines.join("\n")+"\n"+Object.values(typeLines).join("\n") + "\n"); require('fs').writeFileSync('.htaccess', contentLines.join("\n")+"\n"+Object.values(typeLines).join("\n") + "\n");
} }
gulp.task('jsonld', function(){ function createPagerankFromFlattenedJsonld(done){
exec('ranking/venv/bin/python ranking/jsonld_ranking.py -i assets/js/rubenvandeven.jsonld -o assets/js/ranking.json', function (err, stdout, stderr) {
if(stdout)
console.log(stdout);
if(stderr)
console.error(stderr);
done(err);
});
}
gulp.task('flattenJsonld', function() {
return gulp.src(paths.data.src) return gulp.src(paths.data.src)
.pipe(through.obj(function (file, enc, callback) { .pipe(through.obj(function (file, enc, callback) {
let data = JSON.parse(file.contents.toString(enc)); let data = JSON.parse(file.contents.toString(enc));
var transformedFile = file.clone(); var transformedFile = file.clone();
// console.log(data); // console.log(data);
jsonld.flatten(data, {}, (err, flattened)=> { jsonld.flatten(data, {}, (err, flattened)=> {
if(err) {
console.error(err);
}
transformedFile.contents = Buffer.from(JSON.stringify(flattened), enc); transformedFile.contents = Buffer.from(JSON.stringify(flattened), enc);
createHtaccessFromFlattenedJsonld(flattened); createHtaccessFromFlattenedJsonld(flattened);
callback(null, transformedFile) callback(null, transformedFile)
}); });
})) }))
.pipe(gulp.dest(paths.data.dest)); .pipe(gulp.dest(paths.data.dest))
}); });
gulp.task('jsonld', gulp.series(
'flattenJsonld',
createPagerankFromFlattenedJsonld
));
var watchStylesAndScripts = function() { var watchStylesAndScripts = function() {
gulp.watch(paths.styles.src, gulp.series('styles')); gulp.watch(paths.styles.src, gulp.series('styles'));
gulp.watch(paths.scripts.src,gulp.series('scripts', reload)); gulp.watch(paths.scripts.src,gulp.series('scripts', reload));

File diff suppressed because one or more lines are too long

View file

@ -1,10 +1,20 @@
from pyld import jsonld from pyld import jsonld
import json import json
import PageRank.pagerank as pagerank import PageRank.pagerank as pagerank
import argparse
parser = argparse.ArgumentParser(description='Apply pagerank to the (flattened) JSONLD file')
parser.add_argument('--jsonld', '-i', metavar='FILENAME.JSONLD', type=str,
required=True,
help='Input filename, make sure to use the flattened JSONLD (in our case from the \'assets\' folder)')
parser.add_argument('--output', '-o', type=str,
default=None, metavar='FILENAME.JSON',
help='Optional output filename for the resulting JSON')
args = parser.parse_args()
# use flattened jsonld # use flattened jsonld
with open('../assets/js/rubenvandeven.jsonld', 'r') as fp: with open(args.jsonld, 'r') as fp:
contents = json.load(fp)['@graph'] contents = json.load(fp)['@graph']
linksPerItem = {} linksPerItem = {}
@ -17,6 +27,7 @@ def addCount(fromId, toId, weight):
linksPerItem[fromId][toId] += weight linksPerItem[fromId][toId] += weight
def addLink(fromId, toId, weight = 1): def addLink(fromId, toId, weight = 1):
# Add link both ways: from + to.
addCount(fromId, toId, weight) addCount(fromId, toId, weight)
addCount(toId, fromId, weight) addCount(toId, fromId, weight)
@ -49,7 +60,13 @@ targetMax = 1.5
values = pagerank.powerIteration(linksPerItem) values = pagerank.powerIteration(linksPerItem)
normalised = targetMin + (values - min(values)) * (targetMax-targetMin)/max(values) normalised = targetMin + (values - min(values)) * (targetMax-targetMin)/max(values)
print(json.dumps(dict(normalised)))
if args.output is None:
print(json.dumps(dict(normalised)))
else:
with open(args.output, 'w') as fp:
json.dump(dict(normalised), fp)
# #
# factor = 1 / min(values) # factor = 1 / min(values)
# print(factor) # print(factor)

File diff suppressed because it is too large Load diff

View file

@ -33,7 +33,7 @@ function getNodeYear(n){
return n['https://schema.org/datePublished'].substr(0,4); return n['https://schema.org/datePublished'].substr(0,4);
} }
if(typeof n['https://schema.org/startDate'] !== 'undefined') { if(typeof n['https://schema.org/startDate'] !== 'undefined') {
console.log(n['https://schema.org/startDate']); // console.log(n['https://schema.org/startDate']);
return n['https://schema.org/startDate'].substr(0,4); return n['https://schema.org/startDate'].substr(0,4);
} }
if(typeof n['https://schema.org/endDate'] !== 'undefined') { if(typeof n['https://schema.org/endDate'] !== 'undefined') {
@ -114,10 +114,21 @@ var graph;
var nodeMap = {}; var nodeMap = {};
var linkMap = {}; var linkMap = {};
var breadcrumbs = {}; var breadcrumbs = {};
var weights = {};
// load the flattened jsonld file // load the flattened jsonld file
const requestPromise = fetch('/assets/js/rubenvandeven.jsonld') const requestPromise = fetch('/assets/js/rubenvandeven.jsonld').then(r => r.json());
.then(r => r.json()) const rankingPromise = fetch('/assets/js/ranking.json').then(r => r.json());
.then(data => {
Promise.all([requestPromise, rankingPromise])
.then(values => {
if(values[0].hasOwnProperty('@graph')) {
data = values[0];
weights = values[1];
} else {
data = values[1];
weights = values[0];
}
graph = jsonLdToGraph(data['@graph']); graph = jsonLdToGraph(data['@graph']);
// create a map of nodes by id. // create a map of nodes by id.
for(let i in graph.nodes) { for(let i in graph.nodes) {
@ -169,8 +180,8 @@ var firstNodeId = "https://rubenvandeven.com/";
function getSizeForNode(node) { function getSizeForNode(node) {
if(node.hasOwnProperty('https://schema.org/thumbnailUrl')) if(node.hasOwnProperty('https://schema.org/thumbnailUrl'))
return nodeSize; return nodeSize;
//if(weights[node['@id']]) if(weights[node['@id']])
// return nodeSize * weights[node['@id']]; return nodeSize * weights[node['@id']];
if(node['@id'] == firstNodeId) if(node['@id'] == firstNodeId)
return nodeSize*1.2; return nodeSize*1.2;
// everynode has at least one link. these should equal 1 // everynode has at least one link. these should equal 1
@ -442,7 +453,7 @@ var centerByType = function(types, updateHistory) {
deselectNode(); deselectNode();
if(updateHistory) { if(updateHistory) {
// TODO: working // TODO: working
console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr)); // console.log(types[0], getDisplayAttr(types[0]),types.map(getDisplayAttr));
history.pushState({types: types}, "", "/@type/"+(types.map(getDisplayAttr).join("+"))); history.pushState({types: types}, "", "/@type/"+(types.map(getDisplayAttr).join("+")));
} else { } else {
history.replaceState({types: types}, "", "/@type/"+(types.map(getDisplayAttr).join("+"))); history.replaceState({types: types}, "", "/@type/"+(types.map(getDisplayAttr).join("+")));
@ -614,11 +625,15 @@ var setDetails = function(nodeDatum, nodeIdx) {
} }
} }
// relationships / links in <dl> // relationships / links incomming <dl>
for(let attr in relDown) { for(let attr in relDown) {
let attrEl = document.createElement("dt"); let attrEl = document.createElement("dt");
attrEl.innerHTML = getDisplayAttr(attr); attrEl.innerHTML = getDisplayAttr(attr);
relsEl.appendChild(attrEl); relsEl.appendChild(attrEl);
// highest pagerank first:
relDown[attr].sort((a,b) => weights[b['@id']] - weights[a['@id']]);
for(let i in relDown[attr]) { for(let i in relDown[attr]) {
let rel = relDown[attr][i]; let rel = relDown[attr][i];
relsEl.appendChild(createRelationshipEl(rel)); relsEl.appendChild(createRelationshipEl(rel));
@ -637,10 +652,15 @@ var setDetails = function(nodeDatum, nodeIdx) {
} }
} }
// relationships / links outgoing <dl>
for(let attr in relUp) { for(let attr in relUp) {
let attrEl = document.createElement("dt"); let attrEl = document.createElement("dt");
attrEl.innerHTML = getDisplayAttr(attr); attrEl.innerHTML = getDisplayAttr(attr);
relsEl.appendChild(attrEl); relsEl.appendChild(attrEl);
// highest pagerank first:
relUp[attr].sort((a,b) => weights[b['@id']] - weights[a['@id']]);
for(let i in relUp[attr]) { for(let i in relUp[attr]) {
let rel = relUp[attr][i]; let rel = relUp[attr][i];
relsEl.appendChild(createRelationshipEl(rel, i)); relsEl.appendChild(createRelationshipEl(rel, i));

View file

@ -20,7 +20,8 @@ body{
// - NunitoSansRegular // - NunitoSansRegular
font-weight: light; font-weight: light;
height: 100vh; height: 100vh;
background: black; background:#222;
// background: radial-gradient(purple, darken(purple, 10%));
font-size: 12pt; font-size: 12pt;
} }
@ -271,7 +272,8 @@ text{
.nodeType{ .nodeType{
font-size:80%; font-size:80%;
text-transform: uppercase; // text-transform: uppercase;
font-variant-caps: small-caps;
color: #999; color: #999;
margin-left:10px; margin-left:10px;
@ -329,6 +331,7 @@ text{
font-weight:bold; font-weight:bold;
min-height:25px; min-height:25px;
clear:both; clear:both;
word-wrap: anywhere; // relations like "educationalCredentialAward" are crazily long..
} }
dd{ dd{
min-height:30px; min-height:30px;