aboutsummaryrefslogtreecommitdiff
path: root/src/server/Recommender.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/Recommender.ts')
-rw-r--r--src/server/Recommender.ts136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/server/Recommender.ts b/src/server/Recommender.ts
new file mode 100644
index 000000000..d014ba344
--- /dev/null
+++ b/src/server/Recommender.ts
@@ -0,0 +1,136 @@
+//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";
+
+//http://gnuwin32.sourceforge.net/packages/make.htm
+
+export class Recommender {
+
+ private _model: any;
+ static Instance: Recommender;
+ private dimension: number = 0;
+ private choice: string = "";
+
+ 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!!!");
+ }
+
+}