aboutsummaryrefslogtreecommitdiff
path: root/src/client/ClientRecommender.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/ClientRecommender.tsx')
-rw-r--r--src/client/ClientRecommender.tsx83
1 files changed, 56 insertions, 27 deletions
diff --git a/src/client/ClientRecommender.tsx b/src/client/ClientRecommender.tsx
index 63f85c737..a6d1a32b3 100644
--- a/src/client/ClientRecommender.tsx
+++ b/src/client/ClientRecommender.tsx
@@ -1,5 +1,5 @@
import { Doc } from "../new_fields/Doc";
-import { StrCast } from "../new_fields/Types";
+import { StrCast, Cast } from "../new_fields/Types";
import { List } from "../new_fields/List";
import { CognitiveServices } from "./cognitive_services/CognitiveServices";
import React = require("react");
@@ -8,30 +8,42 @@ import { observable, action, computed, reaction } from "mobx";
var assert = require('assert');
import "./ClientRecommender.scss";
import { JSXElement } from "babel-types";
+import { ToPlainText, RichTextField } from "../new_fields/RichTextField";
export interface RecommenderProps {
title: string;
}
+export interface RecommenderDocument {
+ actualDoc: Doc;
+ vectorDoc: number[];
+ score: number;
+}
+
@observer
export class ClientRecommender extends React.Component<RecommenderProps> {
static Instance: ClientRecommender;
- private docVectors: Set<number[]>;
+ private mainDoc?: RecommenderDocument;
+ private docVectors: Set<RecommenderDocument> = new Set();
@observable private corr_matrix = [[0, 0], [0, 0]];
constructor(props: RecommenderProps) {
//console.log("creating client recommender...");
super(props);
if (!ClientRecommender.Instance) ClientRecommender.Instance = this;
- this.docVectors = new Set<number[]>();
- //this.corr_matrix = [[0, 0], [0, 0]];
+ ClientRecommender.Instance.docVectors = new Set();
+ //ClientRecommender.Instance.corr_matrix = [[0, 0], [0, 0]];
}
@action
public reset_docs() {
- this.docVectors = new Set();
- this.corr_matrix = [[0, 0], [0, 0]];
+ ClientRecommender.Instance.docVectors = new Set();
+ ClientRecommender.Instance.corr_matrix = [[0, 0], [0, 0]];
+ }
+
+ public deleteDocs() {
+ console.log("deleting previews...");
}
/***
@@ -67,11 +79,24 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
}
}
+ public computeSimilarities() {
+ ClientRecommender.Instance.docVectors.forEach((doc: RecommenderDocument) => {
+ if (ClientRecommender.Instance.mainDoc) {
+ const distance = ClientRecommender.Instance.distance(ClientRecommender.Instance.mainDoc.vectorDoc, doc.vectorDoc, "euclidian");
+ doc.score = distance;
+ }
+ }
+ );
+ let doclist = Array.from(ClientRecommender.Instance.docVectors);
+ doclist.sort((a: RecommenderDocument, b: RecommenderDocument) => a.score - b.score);
+ return doclist;
+ }
+
/***
* Computes the mean of a set of vectors
*/
- public mean(paragraph: Set<number[]>) {
+ public mean(paragraph: Set<number[]>, dataDoc: Doc, mainDoc: boolean) {
const n = 200;
const num_words = paragraph.size;
let meanVector = new Array<number>(n).fill(0); // mean vector
@@ -82,14 +107,16 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
}
});
meanVector = meanVector.map(x => x / num_words);
- this.addToDocSet(meanVector);
+ const internalDoc: RecommenderDocument = { actualDoc: dataDoc, vectorDoc: meanVector, score: 0 };
+ if (mainDoc) ClientRecommender.Instance.mainDoc = internalDoc;
+ ClientRecommender.Instance.addToDocSet(internalDoc);
}
return meanVector;
}
- private addToDocSet(vector: number[]) {
- if (this.docVectors) {
- this.docVectors.add(vector);
+ private addToDocSet(internalDoc: RecommenderDocument) {
+ if (ClientRecommender.Instance.docVectors) {
+ ClientRecommender.Instance.docVectors.add(internalDoc);
}
}
@@ -97,9 +124,11 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
* Uses Cognitive Services to extract keywords from a document
*/
- public async extractText(dataDoc: Doc, extDoc: Doc) {
- let data = StrCast(dataDoc.title);
- //console.log(data);
+ public async extractText(dataDoc: Doc, extDoc: Doc, mainDoc: boolean = false) {
+ let fielddata = Cast(dataDoc.data, RichTextField);
+ let data: string;
+ fielddata ? data = fielddata[ToPlainText]() : data = "";
+ console.log(data);
let converter = (results: any) => {
let keyterms = new List<string>();
results.documents.forEach((doc: any) => {
@@ -108,7 +137,7 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
});
return keyterms;
};
- await CognitiveServices.Text.Appliers.analyzer(extDoc, ["key words"], data, converter);
+ await CognitiveServices.Text.Appliers.analyzer(dataDoc, extDoc, ["key words"], data, converter, mainDoc);
}
/***
@@ -116,7 +145,7 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
*/
@action
- public createDistanceMatrix(documents: Set<number[]> = this.docVectors) {
+ public createDistanceMatrix(documents: Set<RecommenderDocument> = ClientRecommender.Instance.docVectors) {
const documents_list = Array.from(documents);
const n = documents_list.length;
var matrix = new Array<number>(n).fill(0).map(() => new Array<number>(n).fill(0));
@@ -124,22 +153,22 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
var doc1 = documents_list[i];
for (let j = 0; j < n; j++) {
var doc2 = documents_list[j];
- matrix[i][j] = this.distance(doc1, doc2, "euclidian");
+ matrix[i][j] = ClientRecommender.Instance.distance(doc1.vectorDoc, doc2.vectorDoc, "euclidian");
}
}
- this.corr_matrix = matrix;
+ ClientRecommender.Instance.corr_matrix = matrix;
return matrix;
}
@computed
private get generateRows() {
- const n = this.corr_matrix.length;
+ const n = ClientRecommender.Instance.corr_matrix.length;
let rows: JSX.Element[] = [];
for (let i = 0; i < n; i++) {
let children: JSX.Element[] = [];
for (let j = 0; j < n; j++) {
- //let cell = React.createElement("td", this.corr_matrix[i][j]);
- let cell = <td>{this.corr_matrix[i][j].toFixed(4)}</td>;
+ //let cell = React.createElement("td", ClientRecommender.Instance.corr_matrix[i][j]);
+ let cell = <td>{ClientRecommender.Instance.corr_matrix[i][j].toFixed(4)}</td>;
children.push(cell);
}
//let row = React.createElement("tr", { children: children, key: i });
@@ -151,22 +180,22 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
render() {
return (<div className="wrapper">
- <h3 >{this.props.title ? this.props.title : "hello"}</h3>
+ <h3 >{ClientRecommender.Instance.props.title ? ClientRecommender.Instance.props.title : "hello"}</h3>
{/* <table className="space" >
<tbody>
<tr key="1">
- <td key="1">{this.corr_matrix[0][0].toFixed(4)}</td>
- <td key="2">{this.corr_matrix[0][1].toFixed(4)}</td>
+ <td key="1">{ClientRecommender.Instance.corr_matrix[0][0].toFixed(4)}</td>
+ <td key="2">{ClientRecommender.Instance.corr_matrix[0][1].toFixed(4)}</td>
</tr>
<tr key="2">
- <td key="1">{this.corr_matrix[1][0].toFixed(4)}</td>
- <td key="2">{this.corr_matrix[1][1].toFixed(4)}</td>
+ <td key="1">{ClientRecommender.Instance.corr_matrix[1][0].toFixed(4)}</td>
+ <td key="2">{ClientRecommender.Instance.corr_matrix[1][1].toFixed(4)}</td>
</tr>
</tbody>
</table> */}
<table className="space">
<tbody>
- {this.generateRows}
+ {ClientRecommender.Instance.generateRows}
</tbody>
</table>
</div>);