-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
345 lines (288 loc) · 16.8 KB
/
index.js
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
const express = require('express');
const bodyParser = require('body-parser');
const request = require('request');
const app = express();
const crypto = require('crypto');
const fetch = require('node-fetch');
var stemmer = require('stemmer');
var Tokenizer = require('node-vntokenizer');
var token = new Tokenizer();
sw = require('stopword');
//const access = EAAFM8bGZAZA0wBAHhYIyfgAb2ZBLlBNvdnrNkiSldZAis3Ung67RZBr4leQ99ZB6XPFliyn78FTYQbMu9BHZCtogL4oWHFqmX5gTwtKC5HlTdrOspsw7oTqGmTSGZA1sJcBSk7FPpVX18fg37NNaaBdjojY8C3xsWqTK3yysM6pxd6vM9qp58cHT;
app.set('port', (process.env.PORT || 5000));
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
app.get('/', function(req,res){
res.send("hello");
})
app.get('/webhook/', function(req,res){
if(req.query['hub.verify_token']===
'my_voice_is_my_password_verify_me'){
res.send(req.query['hub.challenge'])
}
res.send('no entry');
})
app.post('/webhook/', function (req, res) {
var data = req.body;
// Make sure this is a page subscription
if (data.object === 'page') {
// Iterate over each entry - there may be multiple if batched
data.entry.forEach(function(entry) {
var pageID = entry.id;
var timeOfEvent = entry.time;
// Iterate over each messaging event
entry.messaging.forEach(function(event) {
if (event.message) {
receivedMessage(event);
} else {
console.log("Webhook received unknown event: ", event);
}
});
});
// Assume all went well.
//
// You must send back a 200, within 20 seconds, to let us know
// you've successfully received the callback. Otherwise, the request
// will time out and we will keep trying to resend.
res.sendStatus(200);
}
});
function receivedMessage(event) {
var senderID = event.sender.id;
var recipientID = event.recipient.id;
var timeOfMessage = event.timestamp;
var message = event.message;
console.log("Received message for user %d and page %d at %d with message:",
senderID, recipientID, timeOfMessage);
console.log(JSON.stringify(message));
var messageId = message.mid;
var messageText = message.text;
var messageAttachments = message.attachments;
if (messageText) {
// If we receive a text message, check to see if it matches a keyword
// and send back the example. Otherwise, just echo the text we received.
switch (messageText) {
case 'generic':
sendGenericMessage(senderID);
break;
default:
sendTextMessage(senderID, messageText);
}
} else if (messageAttachments) {
sendTextMessage(senderID, "Message with attachment received");
}
}
function sendGenericMessage(recipientId, messageText) {
// To be expanded in later sections
}
function sendTextMessage(recipientId, messageText) {
var myMessage = classify(messageText);
console.log("myMessage",myMessage);
var messageData = {
recipient: {
id: recipientId
},
message: {
text: myMessage
}
};
callSendAPI(messageData);
}
function callSendAPI(messageData) {
request({
uri: 'https://graph.facebook.com/v2.6/me/messages',
qs: { access_token: 'EAAREebZAGfwUBAE6Fdk92NwkEQyv1H7U6ICLQFjlMkAuOk0rzbZCxx5ZA8QbtqxZBFWMZBb1qUtcUGrSY9aXrHNjriTbndueePIZB9t13jYMKukZC00DC1t9PBbjywDQcxcDiAwYgUpZBdGf6JpxnJwm2skCxmumsTLaUj8kTQYjqhmZCxSvZB2uKZB' },
method: 'POST',
json: messageData
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
var recipientId = body.recipient_id;
var messageId = body.message_id;
console.log("Successfully sent generic message with id %s to recipient %s",
messageId, recipientId);
} else {
console.error("Unable to send message.");
console.error(response);
console.error(error);
}
});
}
app.listen(app.get('port'), function(){
console.log('running on port', app.get('port'));
})
var training_data = [];training_data.push({"class":"greeting", "sentence":"how are you"})
training_data.push({"class":"greeting", "sentence":"how is your day"})
training_data.push({"class":"greeting", "sentence":"good day"})
training_data.push({"class":"greeting", "sentence":"how is it going today"})
training_data.push({"class":"greeting", "sentence":"hello"})
training_data.push({"class":"greeting", "sentence":"hi"})
training_data.push({"class":"greeting", "sentence":"is anyone there"})
training_data.push({"class":"greeting", "sentence":"good morning"})
training_data.push({"class":"greeting", "sentence":"good afternoon"})
training_data.push({"class":"greeting", "sentence":"good evenening"})
training_data.push({"class":" Chào hỏi ", "sentence":"chào"})
training_data.push({"class":" Chào hỏi ", "sentence":"Alo"})
training_data.push({"class":" Chào hỏi ", "sentence":"Ê"})
training_data.push({"class":" Chào hỏi ", "sentence":"Ad ơi"})
training_data.push({"class":" Chào hỏi ", "sentence":"Admin ơi"})
training_data.push({"class":" Chào hỏi ", "sentence":"Thầy ơi"})
training_data.push({"class":" Chào hỏi ", "sentence":"Anh ơi"})
training_data.push({"class":" Chào hỏi ", "sentence":"Chị ơi"})
training_data.push({"class":" Chào hỏi ", "sentence":"hello"})
training_data.push({"class":" Chào hỏi ", "sentence":"Hi"})
training_data.push({"class":" Chào hỏi ", "sentence":"nè nè"})
training_data.push({"class":"Chuẩn tiếng anh đầu vào", "sentence":"mấy điểm TOEFL hay IELTS là vào được?"})
training_data.push({"class":"Chuẩn tiếng anh đầu vào", "sentence":"cần bao nhiêu điểm tiếng anh?"})
training_data.push({"class":"Chuẩn tiếng anh đầu vào", "sentence":"Chuẩn tiếng anh đầu vào là mấy?"})
training_data.push({"class":"Chuẩn tiếng anh đầu vào", "sentence":"anh văn cần để vào học chương trình ạ?"})
training_data.push({"class":"ENGLISH STANDARD", "sentence":"IELTS certificate to be get out"})
training_data.push({"class":"ENGLISH STANDARD", "sentence":"TOEFL certificate to be get out"})
training_data.push({"class":"ENGLISH STANDARD", "sentence":"English score requirements that I must pass to be enter the program"})
training_data.push({"class":"curriculum structure", "sentence":"curriculum structure "})
training_data.push({"class":"curriculum structure", "sentence":"contents of the program "})
training_data.push({"class":"curriculum structure", "sentence":"what will i learn in the program? "})
training_data.push({"class":"Cấu trúc chương trình", "sentence":"Nội dung đào tạo là gì?"})
training_data.push({"class":"Cấu trúc chương trình", "sentence":"Cho em hỏi cấu trúc chương trình là gì ạ?"})
training_data.push({"class":"Cấu trúc chương trình", "sentence":"Chương trình đào tạo những kĩ năng gì ạ?"})
training_data.push({"class":"Cấu trúc chương trình", "sentence":"Em sẽ được học gì trong chương trình ạ?"})
training_data.push({"class":"Cấu trúc chương trình", "sentence":"Hệ đào tạo của mình ạ?"})
training_data.push({"class":"Cấu trúc chương trình", "sentence":"Em sẽ được đào tạo gì trong chương trình ạ?"})
training_data.push({"class":"FACILITIES", "sentence":"Tell me about the facilities in the center "})
training_data.push({"class":"FACILITIES", "sentence":"Is the center better than other program "})
training_data.push({"class":"FACILITIES", "sentence":"Compare the facilities with other center or program "})
training_data.push({"class":"cơ sở vật chất", "sentence":"cơ sở vật chất như thế nào"})
training_data.push({"class":"cơ sở vật chất", "sentence":"điều kiện học tập trung tâm"})
training_data.push({"class":"cơ sở vật chất", "sentence":"Học trung tâm khác như thế nào với chương trình thường"})
training_data.push({"class":"cơ sở vật chất", "sentence":"So sánh điều kiện trung tâm với chương trình khác"})
// training_data.push({"class":"sandwich", "sentence":"make me a sandwich"})
// training_data.push({"class":"sandwich", "sentence":"I wish I have something to eat"})
// training_data.push({"class":"sandwich", "sentence":"how much does a sandwich cost"})
// training_data.push({"class":"sandwich", "sentence":"I am hungry, is there anything to eat"})
// training_data.push({"class":"sandwich", "sentence":"can you make a sandwich?"})
// training_data.push({"class":"sandwich", "sentence":"having a sandwich today?"})
// training_data.push({"class":"sandwich", "sentence":"what's for lunch?"})
// training_data.push({"class":"sandwich", "sentence":"I want a sandwich"})
// training_data.push({"class":"PROGRAM LEARNING OUTCOMES", "sentence":"what will student receive after studying at this university?"})
// training_data.push({"class":"PROGRAM LEARNING OUTCOMES", "sentence":"what will student achieve?"})
// training_data.push({"class":"PROGRAM LEARNING OUTCOMES", "sentence":"benefits when study at this center"})
// training_data.push({"class":"PROGRAM LEARNING OUTCOMES", "sentence":"advantages of studying this program"})
// training_data.push({"class":"PROGRAM LEARNING OUTCOMES", "sentence":"what will graduates achieve?"})
// training_data.push({"class":"PROGRAM LEARNING OUTCOMES", "sentence":"what is the learning outcomes?"})
training_data.push({"class":"TUITION FEE", "sentence":"tuition fee"})
training_data.push({"class":"TUITION FEE", "sentence":"how about the tuition fee for 1 year of studying"})
training_data.push({"class":"TUITION FEE", "sentence":"what is the tuition fee"})
training_data.push({"class":"TUITION FEE", "sentence":"How much I have to pay for 1 semester?"})
training_data.push({"class":"TUITION FEE", "sentence":"the annual tuition fee"})
training_data.push({"class":"TUITION FEE", "sentence":"the money require for a year"})
training_data.push({"class":"TUITION FEE", "sentence":"1 semester cost"})
training_data.push({"class":" Học phí ", "sentence":"Tiền học mỗi kì bên mình là ?"})
training_data.push({"class":" Học phí ", "sentence":"đóng tiền thường niên?"})
training_data.push({"class":" Học phí ", "sentence":"tiền cần đóng?"})
training_data.push({"class":" Học phí ", "sentence":"Học phí một năm bên mình là ?"})
var corpus_words = {}
var class_words = {}
var mySet = new Set();
for (var i = 0; i <training_data.length; i++){
mySet.add(training_data[i].class)
}
mySet.forEach(function(current_value){
class_words[current_value]=[];
})
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--)
if (this[i] == obj)
return true;
return false;
}
for (var i = 0; i <training_data.length; i++){
var sentence = sw.removeStopwords(token.tokenize(training_data[i].sentence));
var word;
for (word in sentence){
var stemmed_word = stemmer(sentence[word])
if (stemmed_word in corpus_words) {
corpus_words[stemmed_word] += 1
}
else{
corpus_words[stemmed_word] = 1
}
if (class_words[training_data[i].class].contains(stemmed_word) == false){
class_words[training_data[i].class].push(stemmed_word);
}
}
}
function calculate_class_score_commonality(sentence, className){
var score = 0;
var mySentence = sw.removeStopwords(token.tokenize(sentence));
var word;
for (word in mySentence){
var stemmed_word = stemmer(mySentence[word])
if (class_words[className].contains(stemmed_word)){
score += (1 / corpus_words[stemmed_word])
}
}
return score;
}
function classify(sentence){
var highClass = "none";
var highscore = 0;
var score;
mySet.forEach(function(current_value){
score = calculate_class_score_commonality(sentence, current_value);
if (score > highscore) {
highClass = current_value;
highscore = score;
}
})
var response_sentence;
switch (highClass) {
case "greeting":
response_sentence = "this is COE chatbot, may I help you?";
break;
case " Chào hỏi ":
response_sentence = "chào bạn, mình là chatbot COE, bạn muốn biết gì về tuyển sinh COE( yêu cầu đầu vào, yêu cầu xét tốt nghiệp, chuẩn tiếng anh, cấu trúc chương trình, cơ sở vật chất, học phí thường niên ...)";
break;
case "Chuẩn tiếng anh đầu vào":
response_sentence = "Sau năm thứ nhất sinh viên được yêu cầu đạt chứng chỉ tiếng Anh TOEFL iBT 52 trở lên hoặc các chứng chỉ tiếng Anh tương đương. Về ngoại ngữ đầu ra phải đạt năng lực từ bậc 4 trở lên theo thang năng lực ngoại ngữ 6 bậc của Việt Nam, hoặc đạt chứng chỉ tiếng Anh quốc tế tương đương là TOEFL iBT 71, TOEFL PBT 530, IELTS 6.0.";
break;
case "ENGLISH STANDARD":
response_sentence = "After the first year students are required to take the TOEFL iBT 52 or above certificate or equivalent English certificate. The curriculum is designed on a roadmap to help students improve their English proficiency. In foreign languages, they must have ability of level 4 or higher in accordance with the level of foreign language ability of Vietnam, or equivalent international certificate of TOEFL iBT 71, TOEFL PBT 530, IELTS 6.0.";
break;
case "curriculum structure":
response_sentence = "1. Compulsory mathematics and basic sciences. 2. General education, soft skills. 3. Compulsory disciplines. 4. Optional specialty design. 5. Compulsory basic disciplines. 6. Compulsory disciplines. support freedom";
break;
case "Cấu trúc chương trình":
response_sentence = "Cấu trúc chương trình 1. Toán và khoa học cơ bản bắt buộc 2.Giáo dục đại cương,kỹ năng mềm 3.Kiến thức chuyên ngành bắt buộc 4.Thiết kế chuyên ngành tự chọn 5.Kiến thức cơ sở ngành bắt buộc 6.Kiến thức bổ trợ tự do";
break;
case "FACILITIES":
response_sentence = "Labs: Many basic and specialized labs - General Electronics Lab, Microelectronics Fluke - Intel Computer Room and Cadence Chip Design - Texas Instrument Integrated Circuit and Instrumentation Laboratory and Research - Laboratory, research and development of intelligent robot technology - Laboratory of 3G and 4G National Instrument, R & S, AWR Library: - Academic and reference books in English for the entire curriculum - The Resource Center of DHDN Open Educational Resources in the world - Source of online magazine IEEE Xplorer - Website: Provides information on teaching schedules, curriculum, news, job information";
break;
case "cơ sở vật chất":
response_sentence = "Lab: Nhiều phòng Lab cơ bản và chuyên ngành hiện đại – Phòng thí nghiệm điện tử đại cương, vi điện tử Fluke – Phòng máy tính Intel và Thiết kế chip Cadence – Phòng thí nghiệm đo lường Tektronix – Phòng thí nghiệm, nghiên cứu & phát triển kỹ thuật Robot thông minh – Phòng thí nghiệm hệ thống viễn thông 3G và 4G National Instrument, R&S, AWR Thư viện: – Sách học và sách tham khảo chuyên ngành bằng tiếng Anh cho toàn bộ chương trình đào tạo – Trung tâm Thông Tin Tư Liệu của ĐHĐN– Nguồn học liệu mở Open Educational Resources trên thế giới – Nguồn tạp chí online chuyên ngành IEEE Xplorer ";
break;
case "TUITION FEE":
response_sentence = "Tuition fee: VND 10 million / student / semester. Each school year has 3 semesters. Students pay tuition fees by semester;";
break;
case " Học phí ":
response_sentence = "Học phí: 10 triệu đồng/sinh viên/ 1 học kỳ. Mỗi năm học có 3 học kỳ. Sinh viên đóng học phí theo học kỳ;";
break;
default:
response_sentence = "Tính năng này sẽ được cập nhật sớm hơn. Bạn có thể hỏi các câu hỏi khác về tuyển sinh ( yêu cầu đầu vào, yêu cầu xét tốt nghiệp, chuẩn tiếng anh, cấu trúc chương trình, cơ sở vật chất, học bổng khuyến khích học tập, học phí thường niên ...)";
}
if (highscore < 0.2){
response_sentence = "Tính năng này sẽ được cập nhật sớm hơn. Bạn có thể hỏi các câu hỏi khác về tuyển sinh ( yêu cầu đầu vào, yêu cầu xét tốt nghiệp, chuẩn tiếng anh, cấu trúc chương trình, cơ sở vật chất, học bổng khuyến khích học tập, học phí thường niên ...)";
}
console.log("sentence:",sentence)
console.log("class:", highClass);
console.log("score:", highscore);
console.log(response_sentence,"\n");
return (response_sentence);
}
classify("chuẩn tiếng anh đầu vào");
classify("english need to enter");
classify("love someone");
classify("hello")
classify("thịt")
classify("how about the tuition fee")
classify("những cánh hoa phai tàn thật nhanh em có đi xa")
classify("What will I receive at the university if I choose this program")