Dữ liệu thử nghiệm

Một phần của tài liệu (LUẬN văn THẠC sĩ) xây dựng hệ thống trả lời tự động tư vấn tuyển sinh tại trường cao đẳng bình định (Trang 57 - 65)

4. Phương pháp nghiên cứu

3.1.1 Dữ liệu thử nghiệm

Để thử nghiệm độ tin cậy của mơ hình hỏi đáp tự động, tơi thu thập tập dữ liệu gồm 650 bộ câu hỏi và câu trả lời, trong đĩ đã sử dụng 500 câu hỏi/câu trả lời dùng để training và bộ dữ liệu 150 câu dùng để test. Các câu hỏi trong tập dữ liệu này thuộc 10 lớp như đã trình bày trong Bảng 2-1, phân bố khá đồng đều, điều này sẽ giúp tránh tình trạng mất cân bằng dữ liệu (imbalanced data) sẽ làm ảnh hưởng đến kết quả phân lớp.

Dữ liệu được tổ chức lưu trữ theo dạng json trong file Dulieu.json như minh họa dưới đây:

{"NoiDung": [

{"Lop": "Chung",

"Cauhoi": ["Đối tượng tuyển sinh ngành Giáo dục mầm non ", "Phương thức xét tuyển ngành Giáo dục mầm non", " Thời gian học ngành giáo dục mầm non trong bao lâu?"],

"Traloi": ["Học sinh đã tốt nghiệp THPT hoặc tương đương.", " Cĩ 2 phương thức xét tuyển : Xét tuyển theo kết quả kỳ thi THPT quốc gia năm 2018 hoặc Xét tuyển theo kết quả học tập THPT (học bạ), học lực cả năm lớp 12 xếp loại Khá trở lên.", " Thời gian đào tạo khơng quá 3 năm"],

},

{"Lop": "Vieclam",

"Cauhoi": ["Học ngành giáo dục mầm non ra làm gì", " Trường cĩ đảm bảo việc làm cho sinh viên sau khi tốt nghiệp khơng?", " Thưa ban tư vấn, cho em hỏi nhà trường cĩ trung tâm hỗ trợ giới thiệu việc

làm cho SV khơng ạ? "],

"Traloi": ["Phục vụ trong các trường mầm non hoặc các cơ sở ngồi cơng lập", " Trường giới thiệu cơng ty cĩ nhu cầu tuyển dụng để sinh viên ứng tuyển. Đồng thời trong quá trình đạo tạo nhà trường luơn tổ chức các khĩa huấn luyện nâng cao kỹ năng ứng xử khi phỏng vấn. Điều quan trọng trong quá trình phỏng vấn là sinh viên phải thể hiện được kiến thức cũng như kỹ năng nhà tuyển dụng yêu cầu để thành cơng.", "CĐBĐ cĩ Trung tâm Quan hệ hợp tác doanh nghiệp sẽ hỗ trợ giới thiệu việc làm cho em nếu em cĩ nhu cầu. Hàng tháng, trường đều tổ chức các buổi hội thảo, tọa đàm về kỹ năng xin việc và phỏng vấn cũng như giới thiệu việc làm đến với các bạn sinh viên trong trường. Ngồi ra nhà trường cĩ quan hệ rất tốt với các doanh nghiệp khu vực miền Trung, là đối tác cung cấp nguồn nhân lực cho nhiều cơng ty khác nhau trong địa bàn TP.Đà Nẵng và các tỉnh lân cận. Do đĩ tỷ lệ sinh viên tốt nghiệp hàng năm tìm được việc làm phù hợp luơn đạt trên 80%."]

},

{"Lop": "Supham",

"Cauhoi": ["Hiện em đang quan tâm đến ngành Ngơn ngữ Anh. Vậy cơ hội việc làm của ngành này cĩ cao khơng?", " Em rất thích ngành Ngơn ngữ Anh nhưng chỉ học tiếng Anh ở mức trung bình, vậy cĩ thể vào học ngành này được khơng?", "Ngồi Tiếng Anh ra thì khi học ngành Ngơn ngữ Anh em cĩ phải bắt buộc học thêm ngoại ngữ khác khơng? Cĩ yêu cầu về chuẩn đầu ra khơng?

"],

"Traloi": ["Cơ hội việc làm của ngành này tương đối cao do sinh viên ngành Ngơn ngữ Anh cĩ lợi thế về tiếng Anh, nên rất được các cơng ty, doanh nghiệp ưa chuộng.", "Ngành Ngơn Ngữ Anh thích hợp cho những bạn thích việc giao lưu, học hỏi, làm việc với nhiều nền văn hĩa khác nhau. Mỗi sinh viên chính là một người kết nối xuyên ngơn ngữ và văn hĩa. Qua những yếu tố trên cho thấy nếu em thật sự

yêu thích, đam mê cộng với sự cố gắng rèn luyện cùng sự hỗ trợ giảng dạy từ phía nhà trường thì em hồn tồn cĩ thể theo học ngành Ngơn ngữ Anh tại trường ", " Đối với ngành Ngơn ngữ Anh sinh viên bắt buộc chọn học một trong các ngoại ngữ 2 là Pháp/Trung/Nhật/Hàn và cĩ yêu cầu chuẩn đầu ra cụ thể tùy theo từng ngoại ngữ "]

},

... }

3.1.2 Xây dựng mơ hình phân lớp câu hỏi

Để xây dựng mơ hình phân lớp câu hỏi, luận văn sử dụng các cơng cụ và mơ hình sau đây:

- Ngơn ngữ lập trình: Python - Cơng cụ học máy: Tensorflow

- Thư viện xử lý ngơn ngữ tự nhiên: nltk. - Bộ phân tích từ tiếng Việt: pyvi

- Danh sách stopwords của Van-Duyet Le.

- Mơ hình phân lớp câu hỏi: Mạng nơ ron nhân tạo

Import các thư viện là vấn đề rất cần thiết, các thư viện sử dụng trong ứng dụng này là:

import nltk

from nltk.stem.lancaster import LancasterStemmer

stemmer = LancasterStemmer() import numpy as np import tflearn import tensorflow as tf import random import pyvi

from pyvi import ViUtils

import npm

from npm import vietnamese-stopwords

Xử lý dữ liệu trƣớc khi đƣa vào mơ hình học máy:

Nạp dữ liệu học từ file Dulieu.json:

import json

with open('Dulieu.json') as json_data: duLieu = json.load(json_data)

stop_words=[]

with open(‘stopwords.txt’, 'r', encoding='utf8') as fp:

for line in fp.readlines():

stop_words.append(line.strip())

Tiếp theo để tiến hành tiền xử lý dữ liệu như tách từ, phân đoạn từ, xĩa bỏ stopword và gán nhãn từ loại… thì các khối câu lệnh sau sẽ giúp ta làm việc này:

words = [] classes = [] documents = []

for noidung in duLieu['Dulieu']: for cauhoi in noidung['Cauhoi']:

w = ViTokenizer.word_tokenize(cauhoi) words.extend(w)

documents.append((w, noidung['Lop'])) if noidung['Lop'] not in classes: classes.append(noidung['Lop'])

words = [stemmer.stem(w.lower()) for w in words if w not in

words = sorted(list(set(words))) classes = sorted(list(set(classes)))

Sau đĩ dữ liệu sẽ được mã hĩa từ dạng chữ ra dạng số, cách thực hiện như sau:

# Tạo dữ liệu đầu vào training = []

output = []

output_empty = [0] * len(classes)

# Xử lý dữ liệu cho từng câu

for doc in documents: bag = []

pattern_words = doc[0]

pattern_words = [stemmer.stem(word.lower()) for word in

pattern_words]

# Tạo véc tơ số cho từng câu hỏi

for w in words:

bag.append(1) if w in pattern_words else bag.append(0) output_row = list(output_empty) output_row[classes.index(doc[1])] = 1 training.append([bag, output_row]) random.shuffle(training) training = np.array(training) # Ma trận trọng số train_x = list(training[:,0]) train_y = list(training[:,1]) # Xây dựng mơ hình

# khởi tạo đồ thị tensorflow tf.reset_default_graph() # Xây dựng mạng nơ ron

net = tflearn.input_data(shape=[None, len(train_x[0])]) net = tflearn.fully_connected(net, 8)

net = tflearn.fully_connected(net, 8)

net = tflearn.fully_connected(net, len(train_y[0]), activation='softmax')

net = tflearn.regression(net)

# Định nghĩa mơ hình và setup tensorboard

model = tflearn.DNN(net, tensorboard_dir='tflearn_logs') # Bắt đầu học

model.fit(train_x, train_y, n_epoch=1000, batch_size=8, show_metric=True)

# Lưu mơ hình

model.save('model.tflearn')

# Lưu dữ liệu import pickle

pickle.dump( {'words':words, 'classes':classes,

'train_x':train_x, 'train_y':train_y}, open( "training_data", "wb" ))

Áp dụng mơ hình phân lớp câu hỏi:

# Lấy dữ liệu và mơ hình đã được training ở bước trên

import pickle

data = pickle.load(open( "training_data", "rb" ) ) words = data['words']

classes = data['classes'] train_x = data['train_x']

train_y = data['train_y']

# Nạp dữ liệu để lấy các câu trả lời

import json

with open('DuLieu.json') as json_data: duLieu = json.load(json_data)

# Nạp mơ hình phân lớp

model.load('./model.tflearn')

Lựa chọn câu trả lời:

Khi người dùng nhập câu hỏi mới vào thì hệ thống sẽ tiến hành xử lý thơng qua các bước đã đề cập ở phần trên như tiền xử lý, tokenizer, hay chuyển sang bag-of-words để hệ thống cĩ thể hiểu và phân loại lớp:

# Tách từ

def clean_up_sentence(sentence):

sentence_words = ViTokenizer.word_tokenize(sentence) sentence_words = [stemmer.stem(word.lower()) for word in

sentence_words]

return sentence_words

# Tạo túi từ

def bow(sentence, words):

sentence_words = clean_up_sentence(sentence)

# Tăng trọng số của từ nếu từ đã cĩ trong thư viện (túi từ) bag = [0]*len(words)

for s in sentence_words:

for i,w in enumerate(words): if w == s:

bag[i] = 1 return(np.array(bag))

Sau khi đã xử lý xong sẽ tiến hành phân lớp và so khớp câu hỏi để trả về câu trả lời phù hợp nhất cho người dùng, cụ thể như sau:

ERROR_THRESHOLD = 0.25

def classify(sentence):

# xử lý câu hỏi

results = model.predict([bow(sentence, words)])[0] results = [[i,r] for i,r in enumerate(results) if

r>ERROR_THRESHOLD]

results.sort(key=lambda x: x[1], reverse=True)

return_list = [] for r in results: return_list.append((classes[r[0]], r[1])) return return_list def response(sentence): results = classify(sentence) if results: while results: for i in duLieu['Dulieu']: if i['Lop'] == results[0][0]: max=0

for j,t in i[‘Cauhoi’], i[‘Traloi’]: k=countWord(sentence, j) if k>max: max=k str=t return print(str) results.pop(0)

Một phần của tài liệu (LUẬN văn THẠC sĩ) xây dựng hệ thống trả lời tự động tư vấn tuyển sinh tại trường cao đẳng bình định (Trang 57 - 65)

Tải bản đầy đủ (PDF)

(72 trang)