diff options
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | src/client/ClientRecommender.tsx | 57 | ||||
-rw-r--r-- | src/client/views/Recommendations.tsx | 6 | ||||
-rw-r--r-- | src/client/views/nodes/DocumentView.tsx | 67 |
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); }; |