diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/client/ClientRecommender.tsx | 41 | ||||
-rw-r--r-- | src/client/cognitive_services/CognitiveServices.ts | 54 | ||||
-rw-r--r-- | src/client/views/nodes/DocumentView.tsx | 23 | ||||
-rw-r--r-- | src/server/index.ts | 3 |
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({ |