aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package.json1
-rw-r--r--src/client/ClientRecommender.tsx57
-rw-r--r--src/client/views/Recommendations.tsx6
-rw-r--r--src/client/views/nodes/DocumentView.tsx67
4 files changed, 84 insertions, 47 deletions
diff --git a/package.json b/package.json
index d4b5bdab6..3486f752b 100644
--- a/package.json
+++ b/package.json
@@ -140,6 +140,7 @@
"express-session": "^1.15.6",
"express-validator": "^5.3.1",
"expressjs": "^1.0.1",
+ "feedparser": "^2.2.9",
"flexlayout-react": "^0.3.3",
"font-awesome": "^4.7.0",
"formidable": "^1.2.1",
diff --git a/src/client/ClientRecommender.tsx b/src/client/ClientRecommender.tsx
index 66f0ae745..0e344dae9 100644
--- a/src/client/ClientRecommender.tsx
+++ b/src/client/ClientRecommender.tsx
@@ -7,6 +7,7 @@ import { observer } from "mobx-react";
import { observable, action, computed, reaction } from "mobx";
var assert = require('assert');
var sw = require('stopword');
+var FeedParser = require('feedparser');
import "./ClientRecommender.scss";
import { JSXElement } from "babel-types";
import { ToPlainText, RichTextField } from "../new_fields/RichTextField";
@@ -130,14 +131,23 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
let fielddata = Cast(dataDoc.data, RichTextField);
let data: string;
fielddata ? data = fielddata[ToPlainText]() : data = "";
- console.log(data);
let converter = (results: any, data: string) => {
let keyterms = new List<string>();
let keyterms_counted = new List<string>();
+ let highKP: string[] = [""];
+ let high = 0;
results.documents.forEach((doc: any) => {
let keyPhrases = doc.keyPhrases;
keyPhrases.map((kp: string) => {
const frequency = this.countFrequencies(kp, data);
+ if (frequency > high) {
+ high = frequency;
+ highKP = [kp];
+
+ }
+ else if (frequency === high) {
+ highKP.push(kp);
+ }
let words = kp.split(" "); // separates phrase into words
words = this.removeStopWords(words);
words.forEach((word) => {
@@ -148,19 +158,18 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
});
});
});
+ console.log(highKP);
+ this.sendRequest(highKP);
return { keyterms: keyterms, keyterms_counted: keyterms_counted };
};
- let test = (results: any, data: string) => {
- results.documents.forEach((doc: any) => {
- let kps = doc.keyPhrases;
- kps.map((kp: string) => {
- this.countFrequencies(kp, data);
- });
- });
- };
await CognitiveServices.Text.Appliers.analyzer(dataDoc, extDoc, ["key words"], data, converter, mainDoc);
}
+ private findImportantKPs(keyterms_counted: string[], paragraph: string) {
+ let imporantSet = new Set<string>();
+
+ }
+
private countFrequencies(keyphrase: string, paragraph: string) {
let data = paragraph.split(" ");
let kp_array = keyphrase.split(" ");
@@ -183,6 +192,12 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
return sw.removeStopwords(word_array);
}
+ private async sendRequest(keywords: string[]) {
+ let query = "";
+ keywords.forEach((kp: string) => query += kp);
+ await this.arxivrequest(query);
+ }
+
/**
* Request to the arXiv server for ML articles.
*/
@@ -190,14 +205,28 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
arxivrequest = async (query: string) => {
let xhttp = new XMLHttpRequest();
let serveraddress = "http://export.arxiv.org/api"
- let endpoint = serveraddress + "/query?search_query=all:" + query + "&start=0&max_results=5";
+ let endpoint = serveraddress + "/query?search_query=all:" + query + "&start=0&max_results=1";
let promisified = (resolve: any, reject: any) => {
xhttp.onreadystatechange = function () {
if (this.readyState === 4) {
let result = xhttp.response;
+ let xml = xhttp.responseXML;
+ console.log(xml);
switch (this.status) {
case 200:
- console.log(result);
+ //console.log(result);
+ if (xml) {
+ let titles = xml.getElementsByTagName("title");
+ if (titles && titles.length > 1) {
+ let text = titles[1].childNodes[0].nodeValue;
+ console.log(text);
+ }
+ let ids = xml.getElementsByTagName("id");
+ if (ids && ids.length > 1) {
+ let text = ids[1].childNodes[0].nodeValue;
+ console.log(text);
+ }
+ }
return resolve(result);
case 400:
default:
@@ -211,6 +240,12 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
return new Promise<any>(promisified);
}
+ processArxivResult = (result: any) => {
+ var xmlDoc = result as XMLDocument;
+ let text = xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
+ console.log(text);
+ }
+
/***
* Creates distance matrix for all Documents analyzed
*/
diff --git a/src/client/views/Recommendations.tsx b/src/client/views/Recommendations.tsx
index 63aa12c29..d0105ee18 100644
--- a/src/client/views/Recommendations.tsx
+++ b/src/client/views/Recommendations.tsx
@@ -56,7 +56,9 @@ export class Recommendations extends React.Component<{}> {
let returnYDimension = () => 50;
let scale = () => returnXDimension() / NumCast(renderDoc.nativeWidth, returnXDimension());
//let scale = () => 1;
- //let newRenderDoc = Doc.MakeDelegate(renderDoc); /// newRenderDoc -> renderDoc -> render"data"Doc -> TextProt
+ let newRenderDoc = Doc.MakeAlias(renderDoc); /// newRenderDoc -> renderDoc -> render"data"Doc -> TextProt
+ newRenderDoc.height = 50;
+ newRenderDoc.autoHeight = false;
const docview = <div>
{/* onPointerDown={action(() => {
this._useIcons = !this._useIcons;
@@ -66,7 +68,7 @@ export class Recommendations extends React.Component<{}> {
onPointerLeave={action(() => this._displayDim = 50)} > */}
<DocumentView
fitToBox={StrCast(doc.type).indexOf(DocumentType.COL) !== -1}
- Document={renderDoc}
+ Document={newRenderDoc}
addDocument={returnFalse}
removeDocument={returnFalse}
ScreenToLocalTransform={Transform.Identity}
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index a1e64f1c5..48a059b8e 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -644,40 +644,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
});
cm.addItem({
description: "Recommender System",
- event: async () => {
- if (!ClientRecommender.Instance) new ClientRecommender({ title: "Client Recommender" });
- let documents: Doc[] = [];
- let allDocs = await SearchUtil.GetAllDocs();
- // allDocs.forEach(doc => console.log(doc.title));
- // clears internal representation of documents as vectors
- ClientRecommender.Instance.reset_docs();
- ClientRecommender.Instance.arxivrequest("electrons");
- await Promise.all(allDocs.map((doc: Doc) => {
- let mainDoc: boolean = false;
- const dataDoc = Doc.GetDataDoc(doc);
- if (doc.type === DocumentType.TEXT) {
- if (dataDoc === Doc.GetDataDoc(this.props.Document)) {
- mainDoc = true;
- console.log(StrCast(doc.title));
- }
- if (!documents.includes(dataDoc)) {
- documents.push(dataDoc);
- const extdoc = doc.data_ext as Doc;
- return ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, mainDoc);
- }
- }
- }));
- console.log(ClientRecommender.Instance.createDistanceMatrix());
- const doclist = ClientRecommender.Instance.computeSimilarities();
- let recDocs: { preview: Doc, score: number }[] = [];
- // tslint:disable-next-line: prefer-for-of
- for (let i = 0; i < doclist.length; i++) {
- console.log(doclist[i].score);
- recDocs.push({ preview: doclist[i].actualDoc, score: doclist[i].score });
- }
- Recommendations.Instance.addDocuments(recDocs);
- Recommendations.Instance.displayRecommendations(e.pageX + 100, e.pageY);
- },
+ event: () => this.recommender(e),
icon: "brain"
});
cm.addItem({ description: "Delete", event: this.deleteClicked, icon: "trash" });
@@ -744,6 +711,38 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
});
}
+ recommender = async (e: React.MouseEvent) => {
+ if (!ClientRecommender.Instance) new ClientRecommender({ title: "Client Recommender" });
+ let documents: Doc[] = [];
+ let allDocs = await SearchUtil.GetAllDocs();
+ // allDocs.forEach(doc => console.log(doc.title));
+ // clears internal representation of documents as vectors
+ ClientRecommender.Instance.reset_docs();
+ //ClientRecommender.Instance.arxivrequest("electrons");
+ await Promise.all(allDocs.map((doc: Doc) => {
+ let mainDoc: boolean = false;
+ const dataDoc = Doc.GetDataDoc(doc);
+ if (doc.type === DocumentType.TEXT) {
+ if (dataDoc === Doc.GetDataDoc(this.props.Document)) {
+ mainDoc = true;
+ }
+ if (!documents.includes(dataDoc)) {
+ documents.push(dataDoc);
+ const extdoc = doc.data_ext as Doc;
+ return ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, mainDoc);
+ }
+ }
+ }));
+ const doclist = ClientRecommender.Instance.computeSimilarities();
+ let recDocs: { preview: Doc, score: number }[] = [];
+ // tslint:disable-next-line: prefer-for-of
+ for (let i = 0; i < doclist.length; i++) {
+ recDocs.push({ preview: doclist[i].actualDoc, score: doclist[i].score });
+ }
+ Recommendations.Instance.addDocuments(recDocs);
+ Recommendations.Instance.displayRecommendations(e.pageX + 100, e.pageY);
+ }
+
onPointerEnter = (e: React.PointerEvent): void => { Doc.BrushDoc(this.props.Document); };
onPointerLeave = (e: React.PointerEvent): void => { Doc.UnBrushDoc(this.props.Document); };