aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorab <abdullah_ahmed@brown.edu>2019-11-16 16:45:41 -0500
committerab <abdullah_ahmed@brown.edu>2019-11-16 16:45:41 -0500
commite103be2d58da2a6809dd4ad5f0b5f445d8d6c96b (patch)
tree7f3ba5d06546adc8a9ae537f7253f6791e213601
parentf7e101dfc7bc9e81ca03730865740360a831285a (diff)
ibm integrated, bing search -> server next time
-rw-r--r--package.json7
-rw-r--r--src/client/ClientRecommender.tsx66
-rw-r--r--src/client/apis/IBM_Recommender.ts6
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx5
-rw-r--r--src/client/views/nodes/DocumentView.tsx2
-rw-r--r--src/server/index.ts2
6 files changed, 70 insertions, 18 deletions
diff --git a/package.json b/package.json
index 80b65cc68..d41119a47 100644
--- a/package.json
+++ b/package.json
@@ -57,9 +57,9 @@
"@hig/theme-context": "^2.1.3",
"@hig/theme-data": "^2.3.3",
"@tensorflow-models/universal-sentence-encoder": "^1.2.0",
- "@tensorflow/tfjs": "^1.3.1",
+ "@tensorflow/tfjs-converter": "^1.3.2",
"@tensorflow/tfjs-core": "^1.3.1",
- "@tensorflow/tfjs-node": "^1.3.1",
+ "@tensorflow/tfjs-node": "1.3.1",
"@trendmicro/react-dropdown": "^1.3.0",
"@types/adm-zip": "^0.4.32",
"@types/animejs": "^2.0.2",
@@ -238,8 +238,9 @@
"url-loader": "^1.1.2",
"uuid": "^3.3.2",
"wikijs": "^6.0.1",
+ "word2vec": "^1.1.4",
"words-to-numbers": "^1.5.1",
"xoauth2": "^1.2.0",
"youtube": "^0.1.0"
}
-} \ No newline at end of file
+}
diff --git a/src/client/ClientRecommender.tsx b/src/client/ClientRecommender.tsx
index 364ec0fe0..a37434c0d 100644
--- a/src/client/ClientRecommender.tsx
+++ b/src/client/ClientRecommender.tsx
@@ -8,6 +8,7 @@ import { observable, action, computed, reaction } from "mobx";
var assert = require('assert');
var sw = require('stopword');
var FeedParser = require('feedparser');
+var https = require('https');
import "./ClientRecommender.scss";
import { JSXElement } from "babel-types";
import { RichTextField } from "../new_fields/RichTextField";
@@ -111,7 +112,7 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
}
);
let doclist = Array.from(ClientRecommender.Instance.docVectors);
- if (distance_metric == "euclidian") {
+ if (distance_metric === "euclidian") {
doclist.sort((a: RecommenderDocument, b: RecommenderDocument) => a.score - b.score);
}
else {
@@ -245,7 +246,27 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
if (kp_string.length > 2) kp_string = kp_string.substring(0, kp_string.length - 2);
console.log("kp string: ", kp_string);
let values = "";
- if (!internal) values = await this.sendRequest(highKP);
+ if (!internal) {
+ const parameters: any = {
+ 'language': 'en',
+ 'text': data,
+ 'features': {
+ 'keywords': {
+ 'sentiment': true,
+ 'emotion': true,
+ 'limit': 3
+ }
+ }
+ };
+ await Identified.PostToServer("/IBMAnalysis", parameters).then(response => {
+ const sorted_keywords = response.result.keywords;
+ if (sorted_keywords.length > 0) {
+ console.log("IBM keyphrase", sorted_keywords[0]);
+ highKP = [sorted_keywords[0].text];
+ }
+ });
+ values = await this.sendRequest(highKP, "bing");
+ }
return { keyterms: keyterms, external_recommendations: values, kp_string: [kp_string] };
};
if (data !== "") {
@@ -290,11 +311,46 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
* API for sending arXiv request.
*/
- private async sendRequest(keywords: string[]) {
+ private async sendRequest(keywords: string[], api: string) {
let query = "";
keywords.forEach((kp: string) => query += " " + kp);
- return new Promise<any>(resolve => {
- this.arxivrequest(query).then(resolve);
+ if (api === "arxiv") {
+ return new Promise<any>(resolve => {
+ this.arxivrequest(query).then(resolve);
+ });
+ }
+ else if (api === "bing") {
+ await this.bingWebSearch(query);
+ }
+ else {
+ return new Promise<any>(resolve => {
+ this.arxivrequest(query).then(resolve);
+ });
+ }
+
+ }
+
+ bingWebSearch = async (query: string) => {
+ https.get({
+ hostname: 'api.cognitive.microsoft.com',
+ path: '/bing/v5.0/search?q=' + encodeURIComponent(query),
+ headers: { 'Ocp-Apim-Subscription-Key': process.env.BING },
+ }, (res: any) => {
+ let body = '';
+ res.on('data', (part: any) => body += part);
+ res.on('end', () => {
+ for (var header in res.headers) {
+ if (header.startsWith("bingapis-") || header.startsWith("x-msedge-")) {
+ console.log(header + ": " + res.headers[header])
+ }
+ }
+ console.log('\nJSON Response:\n');
+ console.dir(JSON.parse(body), { colors: false, depth: null });
+ })
+ res.on('error', (e: any) => {
+ console.log('Error: ' + e.message);
+ throw e;
+ });
});
}
diff --git a/src/client/apis/IBM_Recommender.ts b/src/client/apis/IBM_Recommender.ts
index 5f80f5126..da6257f28 100644
--- a/src/client/apis/IBM_Recommender.ts
+++ b/src/client/apis/IBM_Recommender.ts
@@ -16,19 +16,19 @@ export namespace IBM_Recommender {
});
const analyzeParams = {
- 'url': 'www.ibm.com',
+ 'text': 'this is a test of the keyword extraction feature I am integrating into the program',
'features': {
'keywords': {
'sentiment': true,
'emotion': true,
'limit': 3
- }
+ },
}
};
export const analyze = async (_parameters: any): Promise<Opt<string>> => {
try {
- const response = await naturalLanguageUnderstanding.analyze(analyzeParams);
+ const response = await naturalLanguageUnderstanding.analyze(_parameters);
console.log(response);
return (JSON.stringify(response, null, 2));
} catch (err) {
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
index bb5d99a28..bfec545c6 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormView.tsx
@@ -34,11 +34,6 @@ import { CollectionFreeFormRemoteCursors } from "./CollectionFreeFormRemoteCurso
import "./CollectionFreeFormView.scss";
import { MarqueeView } from "./MarqueeView";
import React = require("react");
-import v5 = require("uuid/v5");
-import { ClientRecommender } from "../../../ClientRecommender";
-import { SearchUtil } from "../../../util/SearchUtil";
-import { RouteStore } from "../../../../server/RouteStore";
-import { string, number, elementType } from "prop-types";
import { DocServer } from "../../../DocServer";
import { documentSchema, positionSchema } from "../../../../new_fields/documentSchemas";
import { DocumentViewProps } from "../../nodes/DocumentView";
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 55063a52c..c6ad2f9d7 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -772,7 +772,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
}
render() {
if (!this.props.Document) return (null);
- trace();
+ //trace();
const animDims = this.Document.animateToDimensions ? Array.from(this.Document.animateToDimensions) : undefined;
const ruleColor = this.props.ruleProvider ? StrCast(this.props.ruleProvider["ruleColor_" + this.Document.heading]) : undefined;
const ruleRounding = this.props.ruleProvider ? StrCast(this.props.ruleProvider["ruleRounding_" + this.Document.heading]) : undefined;
diff --git a/src/server/index.ts b/src/server/index.ts
index 2a669f147..45fc7fc07 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -1086,7 +1086,7 @@ addSecureRoute({
const batched = BatchedArray.from<GooglePhotosUploadUtils.MediaInput>(media, { batchSize: 25 });
const newMediaItems = await batched.batchedMapPatientInterval<NewMediaItem>(
{ magnitude: 100, unit: TimeUnit.Milliseconds },
- async (batch, collector) => {
+ async (batch: any, collector: any): Promise<any> => {
for (let index = 0; index < batch.length; index++) {
const { url, description } = batch[index];
const uploadToken = await GooglePhotosUploadUtils.DispatchGooglePhotosUpload(url);