spaCy/website/assets/js/models.vue.js

139 lines
6.3 KiB
JavaScript
Raw Normal View History

💫 Interactive code examples, spaCy Universe and various docs improvements (#2274) * Integrate Python kernel via Binder * Add live model test for languages with examples * Update docs and code examples * Adjust margin (if not bootstrapped) * Add binder version to global config * Update terminal and executable code mixins * Pass attributes through infobox and section * Hide v-cloak * Fix example * Take out model comparison for now * Add meta text for compat * Remove chart.js dependency * Tidy up and simplify JS and port big components over to Vue * Remove chartjs example * Add Twitter icon * Add purple stylesheet option * Add utility for hand cursor (special cases only) * Add transition classes * Add small option for section * Add thumb object for small round thumbnail images * Allow unset code block language via "none" value (workaround to still allow unset language to default to DEFAULT_SYNTAX) * Pass through attributes * Add syntax highlighting definitions for Julia, R and Docker * Add website icon * Remove user survey from navigation * Don't hide GitHub icon on small screens * Make top navigation scrollable on small screens * Remove old resources page and references to it * Add Universe * Add helper functions for better page URL and title * Update site description * Increment versions * Update preview images * Update mentions of resources * Fix image * Fix social images * Fix problem with cover sizing and floats * Add divider and move badges into heading * Add docstrings * Reference converting section * Add section on converting word vectors * Move converting section to custom section and fix formatting * Remove old fastText example * Move extensions content to own section Keep weird ID to not break permalinks for now (we don't want to rewrite URLs if not absolutely necessary) * Use better component example and add factories section * Add note on larger model * Use better example for non-vector * Remove similarity in context section Only works via small models with tensors so has always been kind of confusing * Add note on init-model command * Fix lightning tour examples and make excutable if possible * Add spacy train CLI section to train * Fix formatting and add video * Fix formatting * Fix textcat example description (resolves #2246) * Add dummy file to try resolve conflict * Delete dummy file * Tidy up [ci skip] * Ensure sufficient height of loading container * Add loading animation to universe * Update Thebelab build and use better startup message * Fix asset versioning * Fix typo [ci skip] * Add note on project idea label
2018-04-29 00:06:46 +00:00
/**
* Initialise model overviews
* @param {string} repo - Repository to load from, in the format user/repo.
*/
export default function(repo) {
const LICENSES = {
'CC BY 4.0': 'https://creativecommons.org/licenses/by/4.0/',
'CC BY-SA': 'https://creativecommons.org/licenses/by-sa/3.0/',
'CC BY-SA 3.0': 'https://creativecommons.org/licenses/by-sa/3.0/',
'CC BY-SA 4.0': 'https://creativecommons.org/licenses/by-sa/4.0/',
'CC BY-NC': 'https://creativecommons.org/licenses/by-nc/3.0/',
'CC BY-NC 3.0': 'https://creativecommons.org/licenses/by-nc/3.0/',
'CC-BY-NC-SA 3.0': 'https://creativecommons.org/licenses/by-nc-sa/3.0/',
'GPL': 'https://www.gnu.org/licenses/gpl.html',
'LGPL': 'https://www.gnu.org/licenses/lgpl.html',
'MIT': 'https://opensource.org/licenses/MIT'
};
const URL = `https://raw.githubusercontent.com/${repo}/master`;
const models = [...document.querySelectorAll('[data-vue]')]
.map(el => el.getAttribute('data-vue'));
document.addEventListener('DOMContentLoaded', ev => {
fetch(`${URL}/compatibility.json`)
.then(res => res.json())
.then(json => models.forEach(modelId => new Vue({
el: `[data-vue="${modelId}"]`,
data: {
repo: `https://github.com/${repo}`,
compat: json.spacy,
loading: false,
error: false,
id: modelId,
version: 'n/a',
notes: null,
sizeFull: null,
pipeline: null,
releaseUrl: null,
description: null,
license: null,
author: null,
url: null,
vectors: null,
sources: null,
uas: null,
las: null,
tags_acc: null,
ents_f: null,
ents_p: null,
ents_r: null,
modelLicenses: LICENSES,
spacyVersion: Object.keys(json.spacy)[0]
},
computed: {
compatVersion() {
const res = this.compat[this.spacyVersion][this.id];
return res ? `${this.id}-${res[0]}` : false;
},
orderedCompat() {
return Object.keys(this.compat)
.filter(v => !v.includes('a') && !v.includes('dev') && !v.includes('rc'));
},
hasAccuracy() {
return this.uas || this.las || this.tags_acc || this.ents_f || this.ents_p || this.ents_r;
}
},
beforeMount() {
const version = this.$_getLatestVersion(this.id);
if (version) {
this.loading = true;
fetch(`${URL}/meta/${this.id}-${version}.json`)
.then(res => res.json())
.then(json => this.$_updateData(json))
.catch(err => { this.error = true });
}
},
updated() {
window.dispatchEvent(new Event('resize')); // scroll position for progress
},
methods: {
$_updateData(data) {
const fullName = `${data.lang}_${data.name}-${data.version}`;
this.version = data.version;
this.releaseUrl = `${this.repo}/releases/tag/${fullName}`;
this.sizeFull = data.size;
this.pipeline = data.pipeline;
this.notes = data.notes;
this.description = data.description;
this.vectors = this.$_formatVectors(data.vectors);
this.sources = data.sources;
this.author = data.author;
this.url = data.url;
this.license = data.license;
const accuracy = data.accuracy || {};
for (let key of Object.keys(accuracy)) {
this[key] = accuracy[key].toFixed(2);
}
this.loading = false;
},
$_getLatestVersion(modelId) {
for (let [spacy_v, models] of Object.entries(this.compat)) {
if (models[modelId]) {
return models[modelId][0];
}
}
},
$_formatVectors(data) {
if (!data) {
return 'n/a';
}
if (Object.values(data).every(n => n == 0)) {
return 'context vectors only';
}
const { keys, vectors, width } = data;
const nKeys = this.$_abbrNum(keys);
const nVectors = this.$_abbrNum(vectors);
return `${nKeys} keys, ${nVectors} unique vectors (${width} dimensions)`;
},
/**
* Abbreviate a number, e.g. 14249930 --> 14.25m.
* @param {number|string} num - The number to convert.
* @param {number} fixed - Number of decimals.
*/
$_abbrNum: function(num = 0, fixed = 1) {
const suffixes = ['', 'k', 'm', 'b', 't'];
if (num === null || num === 0) return 0;
const b = num.toPrecision(2).split('e');
const k = (b.length === 1) ? 0 : Math.floor(Math.min(b[1].slice(1), 14) / 3);
const n = (k < 1) ? num : num / Math.pow(10, k * 3);
const c = (k >= 1 && n >= 100 ) ? Math.round(n) : n.toFixed(fixed);
return (c < 0 ? c : Math.abs(c)) + suffixes[k];
}
}
})))
});
}