//import { Doc } from "../new_fields/Doc"; //import { StrCast } from "../new_fields/Types"; //import { List } from "../new_fields/List"; //import { CognitiveServices } from "../client/cognitive_services/CognitiveServices"; // var w2v = require('word2vec'); var assert = require('assert'); var arxivapi = require('arxiv-api-node'); import requestPromise = require("request-promise"); import * as use from '@tensorflow-models/universal-sentence-encoder'; import { Tensor } from "@tensorflow/tfjs-core/dist/tensor"; require('@tensorflow/tfjs-node'); //http://gnuwin32.sourceforge.net/packages/make.htm export class Recommender { private _model: any; static Instance: Recommender; private dimension: number = 0; private choice: string = ""; // Tensorflow or Word2Vec constructor() { console.log("creating recommender..."); Recommender.Instance = this; } /*** * Loads pre-trained model from TF */ public async loadTFModel() { let self = this; return new Promise(res => { use.load().then(model => { self.choice = "TF"; self._model = model; self.dimension = 512; res(model); }); } ); } /*** * Loads pre-trained model from word2vec */ // private loadModel(): Promise { // let self = this; // return new Promise(res => { // w2v.loadModel("./node_modules/word2vec/examples/fixtures/vectors.txt", function (err: any, model: any) { // self.choice = "WV"; // self._model = model; // self.dimension = model.size; // res(model); // }); // }); // } /*** * Testing */ public async testModel() { if (!this._model) { await this.loadTFModel(); } if (this._model) { if (this.choice === "WV") { let similarity = this._model.similarity('father', 'mother'); console.log(similarity); } else if (this.choice === "TF") { const model = this._model as use.UniversalSentenceEncoder; // Embed an array of sentences. const sentences = [ 'Hello.', 'How are you?' ]; const embeddings = await this.vectorize(sentences); if (embeddings) embeddings.print(true /*verbose*/); // model.embed(sentences).then(embeddings => { // // `embeddings` is a 2D tensor consisting of the 512-dimensional embeddings for each sentence. // // So in this example `embeddings` has the shape [2, 512]. // embeddings.print(true /* verbose */); // }); } } else { console.log("model not found :("); } } /*** * Uses model to convert words to vectors */ public async vectorize(text: string[]): Promise { if (!this._model) { await this.loadTFModel(); } if (this._model) { if (this.choice === "WV") { let word_vecs = this._model.getVectors(text); return word_vecs; } else if (this.choice === "TF") { const model = this._model as use.UniversalSentenceEncoder; return new Promise(res => { model.embed(text).then(embeddings => { res(embeddings); }); }); } } } // public async trainModel() { // console.log("phrasing..."); // w2v.word2vec("./node_modules/word2vec/examples/eng_news-typical_2016_1M-sentences.txt", './node_modules/word2vec/examples/my_phrases.txt', { // cbow: 1, // size: 200, // window: 8, // negative: 25, // hs: 0, // sample: 1e-4, // threads: 20, // iter: 200, // minCount: 2 // }); // console.log("phrased!!!"); // } }