apiRequest.js
4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// api key
require('dotenv').config();
// api key error check
try {
if( process.env.TEST != "OKAY" ) {
throw new Error( "키 오류 키파일을 확인하세요" );
}
}
catch( err ) {
throw new Error(err);
}
const rp = require("request-promise");
// Api URL
const URL = {
"ETRI" : "http://aiopen.etri.re.kr:8000/",
"Korean" : "https://search.naver.com/p/csearch/ocontent/util/SpellerProxy?_callback=&color_blindness=0&q="
}
// ETRI Api Request Format
const apiRequestJsonFrame = {
"request_id" : "reserved field",
"access_key" : process.env.ETRI_API_KEY,
"argument" : {}
};
let apiRequest = {};
/**
* @param {String} query 세부 url / 형식은 api사이트 참조
* @param {Object} argument 필요한 argument / 형식은 api사이트 참조
* @returns {Object} api사이트에서 정해진 형식의 응답을 받아옵니다.
* @description 이 함수는 이미 정해진 url(etri api)+query의
경로로 argument와 함께 request를 보냅니다.
그 후 얻은 응답을 js object로 보내줍니다.
*/
apiRequest.ETRI = async ( query, argument ) => {
return new Promise( ( resolve, reject ) => {
let apiReqJson = apiRequestJsonFrame;
apiReqJson.argument = argument;
let apiReqOption = { headers: {
"Accept": "application/json",
"Content-Type": "application/json",
},uri : URL.ETRI + query, body : JSON.stringify( apiReqJson ) };
rp.post( apiReqOption )
.then( ( body ) => {
body = JSON.parse( body );
if( body.result == "-1" ) {
throw new Error( body.reason );
}
resolve( body );
})
.catch( ( err ) => {
throw new Error( err );
});
})
}
/**
* @param {String} text 고치고 싶은 문장
* @returns {Object} 정해진 형식의 응답을 보내줍니다.
* @description 네이버 맞춤법 사이트로 text를 보내서 응답을 받아옵니다.
*/
apiRequest.Korean = async ( text ) => {
return new Promise( ( resolve,reject ) => {
rp( { "uri" : URL.Korean+encodeURI( text ) } )
.then( ( body ) => {
body = body.substring( 1, body.length - 2 );
resolve( JSON.parse( body ).message.result );
})
.catch( ( err ) => {
throw new Error( err );
});
});
}
apiRequest.multiETRI = async ( searchResults, keywordText ) => {
try {
const Promises = await searchResults.map((searchResult, index)=>{
//return makeOption( searchResults, keywordText, index );
return DOCVECAPI( searchResults, keywordText, index );
});
await Promise.all( Promises );
}
catch ( err ) {
throw new Error( err.message );
}
}
/**
* @param {String} keywordText 사용자의 검색에서 textAnalystic을 거쳐 keyword만 남은 text
* @param {{title:string,passage:string,ulr:string}} searchResult searchResults keywordtext문장을 검색하여 나온 결과들
* @returns confidence key와 해당 value가 추가된 searchResults
* @description DOCVECAPI를 이용해 각각의 searchResult의 keywordtext에 대한 정확도(confidence, 검색문장에 대해 검색 결과가 얼마나 지)를
* 판단하고, confidence key와 해당 value를 searchResult에 추가해줍니다.
*/
const DOCVECAPI = (searchResults, keywordText, index) => {
return new Promise((resolve, reject) => {
apiReqOption = {
method: "POST",
uri: "http://127.0.0.1:5000/analyze",
body: {
sentence1: searchResults[index].passage,
sentence2: keywordText
},
json: true
};
rp.post(apiReqOption)
.then(body => {
if (body.result == "-1") {
throw new Error(body.data + " index : " + index);
}
searchResults[index].confidence = Number(body.result);
resolve();
})
.catch(err => {
searchResults[index].confidence = 0;
resolve();
});
});
};
module.exports = apiRequest;