aboutsummaryrefslogtreecommitdiff
path: root/src/server/Recommender.ts
diff options
context:
space:
mode:
authoreeng5 <eleanor_eng@brown.edu>2020-02-09 14:59:57 -0500
committereeng5 <eleanor_eng@brown.edu>2020-02-09 14:59:57 -0500
commitdaa8898f70bd44d2716f1f0d3371a8435a3ff638 (patch)
treeccb2ea544eeed0413370cdd69e758faec6170690 /src/server/Recommender.ts
parent1e36055e3674fe33dd39f6ad79c969531f7b447c (diff)
parentf6179334d6f2942631caa17b7c8ae2531d87c7c4 (diff)
Merge branch 'pen' of https://github.com/browngraphicslab/Dash-Web into pen
Diffstat (limited to 'src/server/Recommender.ts')
-rw-r--r--src/server/Recommender.ts137
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!!!");
+ // }
+
+}