aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/ClientRecommender.tsx41
-rw-r--r--src/client/cognitive_services/CognitiveServices.ts54
-rw-r--r--src/client/views/nodes/DocumentView.tsx23
-rw-r--r--src/server/index.ts3
4 files changed, 88 insertions, 33 deletions
diff --git a/src/client/ClientRecommender.tsx b/src/client/ClientRecommender.tsx
index a37434c0d..83ca48590 100644
--- a/src/client/ClientRecommender.tsx
+++ b/src/client/ClientRecommender.tsx
@@ -191,7 +191,7 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
* Uses Cognitive Services to extract keywords from a document
*/
- public async extractText(dataDoc: Doc, extDoc: Doc, internal: boolean = true, isMainDoc: boolean = false, image: boolean = false) {
+ public async extractText(dataDoc: Doc, extDoc: Doc, internal: boolean = true, api: string = "bing", isMainDoc: boolean = false, image: boolean = false) {
let data: string = "";
let taglist: FieldResult<List<string>> = undefined;
if (image) {
@@ -265,7 +265,7 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
highKP = [sorted_keywords[0].text];
}
});
- values = await this.sendRequest(highKP, "bing");
+ values = await this.sendRequest(highKP, api);
}
return { keyterms: keyterms, external_recommendations: values, kp_string: [kp_string] };
};
@@ -320,38 +320,27 @@ export class ClientRecommender extends React.Component<RecommenderProps> {
});
}
else if (api === "bing") {
- await this.bingWebSearch(query);
- }
- else {
return new Promise<any>(resolve => {
- this.arxivrequest(query).then(resolve);
+ this.bingWebSearch(query).then(resolve);
});
}
+ else {
+ console.log("no api specified :(");
+ }
}
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;
+ const converter = async (results: any) => {
+ let title_vals: string[] = [];
+ let url_vals: string[] = [];
+ results.webPages.value.forEach((doc: any) => {
+ title_vals.push(doc.name);
+ url_vals.push(doc.url);
});
- });
+ return { title_vals, url_vals };
+ };
+ return CognitiveServices.BingSearch.Appliers.analyzer(query, converter);
}
/**
diff --git a/src/client/cognitive_services/CognitiveServices.ts b/src/client/cognitive_services/CognitiveServices.ts
index d496b442e..641747207 100644
--- a/src/client/cognitive_services/CognitiveServices.ts
+++ b/src/client/cognitive_services/CognitiveServices.ts
@@ -17,6 +17,7 @@ type AnalysisApplier<D> = (target: Doc, relevantKeys: string[], data: D, ...args
type BodyConverter<D> = (data: D) => string;
type Converter = (results: any) => Field;
type TextConverter = (results: any, data: string) => Promise<{ keyterms: Field, external_recommendations: any, kp_string: string[] }>;
+type BingConverter = (results: any) => Promise<{ title_vals: string[], url_vals: string[] }>;
export type Tag = { name: string, confidence: number };
export type Rectangle = { top: number, left: number, width: number, height: number };
@@ -25,7 +26,8 @@ export enum Service {
ComputerVision = "vision",
Face = "face",
Handwriting = "handwriting",
- Text = "text"
+ Text = "text",
+ Bing = "bing"
}
export enum Confidence {
@@ -225,6 +227,56 @@ export namespace CognitiveServices {
}
+ export namespace BingSearch {
+ export const Manager: APIManager<string> = {
+ converter: (data: string) => {
+ return data;
+ },
+ requester: async (apiKey: string, query: string) => {
+ let xhttp = new XMLHttpRequest();
+ let serverAddress = "https://api.cognitive.microsoft.com";
+ let endpoint = serverAddress + '/bing/v5.0/search?q=' + encodeURIComponent(query);
+ let promisified = (resolve: any, reject: any) => {
+ xhttp.onreadystatechange = function () {
+ if (this.readyState === 4) {
+ let result = xhttp.responseText;
+ switch (this.status) {
+ case 200:
+ return resolve(result);
+ case 400:
+ default:
+ return reject(result);
+ }
+ }
+ };
+
+ if (apiKey) {
+ xhttp.open("GET", endpoint, true);
+ xhttp.setRequestHeader('Ocp-Apim-Subscription-Key', apiKey);
+ xhttp.setRequestHeader('Content-Type', 'application/json');
+ xhttp.send();
+ }
+ else {
+ console.log("API key for BING unavailable");
+ }
+ };
+ return new Promise<any>(promisified);
+ }
+
+ };
+
+ export namespace Appliers {
+ export const analyzer = async (query: string, converter: BingConverter) => {
+ let results = await ExecuteQuery(Service.Bing, Manager, query);
+ console.log(results);
+ const { title_vals, url_vals } = await converter(results);
+ return { title_vals, url_vals };
+ };
+ }
+
+ }
+
+
export namespace Text {
export const Manager: APIManager<string> = {
converter: (data: string) => {
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index c6ad2f9d7..2455c320d 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -518,9 +518,22 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
icon: "brain"
});
+ let ext_recommender_subitems: ContextMenuProps[] = [];
+
+ ext_recommender_subitems.push({
+ description: "arXiv",
+ event: () => this.externalRecommendation(e, "arxiv"),
+ icon: "brain"
+ });
+ ext_recommender_subitems.push({
+ description: "Bing",
+ event: () => this.externalRecommendation(e, "bing"),
+ icon: "brain"
+ });
+
recommender_subitems.push({
description: "External recommendations",
- event: () => this.externalRecommendation(e),
+ subitems: ext_recommender_subitems,
icon: "brain"
});
@@ -590,7 +603,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
if (!documents.includes(dataDoc)) {
documents.push(dataDoc);
const extdoc = doc.data_ext as Doc;
- return ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, true, isMainDoc);
+ return ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, true, "", isMainDoc);
}
}
if (doc.type === DocumentType.IMG) {
@@ -600,7 +613,7 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
if (!documents.includes(dataDoc)) {
documents.push(dataDoc);
const extdoc = doc.data_ext as Doc;
- return ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, true, isMainDoc, true);
+ return ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, true, "", isMainDoc, true);
}
}
}));
@@ -628,12 +641,12 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
// RecommendationsBox.Instance.displayRecommendations(e.pageX + 100, e.pageY);
}
- externalRecommendation = async (e: React.MouseEvent) => {
+ externalRecommendation = async (e: React.MouseEvent, api: string) => {
if (!ClientRecommender.Instance) new ClientRecommender({ title: "Client Recommender" });
ClientRecommender.Instance.reset_docs();
const doc = Doc.GetDataDoc(this.props.Document);
const extdoc = doc.data_ext as Doc;
- const values = await ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, false);
+ const values = await ClientRecommender.Instance.extractText(doc, extdoc ? extdoc : doc, false, api);
const headers = [new SchemaHeaderField("title"), new SchemaHeaderField("href")];
let bodies: Doc[] = [];
const titles = values.title_vals;
diff --git a/src/server/index.ts b/src/server/index.ts
index 45fc7fc07..050ab8755 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -674,7 +674,8 @@ const ServicesApiKeyMap = new Map<string, string | undefined>([
["face", process.env.FACE],
["vision", process.env.VISION],
["handwriting", process.env.HANDWRITING],
- ["text", process.env.TEXT]
+ ["text", process.env.TEXT],
+ ["bing", process.env.BING]
]);
addSecureRoute({