diff options
Diffstat (limited to 'src/server/Recommender.ts')
-rw-r--r-- | src/server/Recommender.ts | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/server/Recommender.ts b/src/server/Recommender.ts new file mode 100644 index 000000000..1d2cb3858 --- /dev/null +++ b/src/server/Recommender.ts @@ -0,0 +1,137 @@ +//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<any> { + // 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<Tensor | undefined> { + 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<Tensor>(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!!!"); + // } + +} |