作業(yè)頭
這個作業(yè)屬于哪個課程 | 自然語言處理 |
---|---|
這個作業(yè)要求在哪里 | NLP作業(yè)02:課程設(shè)計報告 |
我在這個課程的目標(biāo) | 實現(xiàn)基于Seq2Seq注意力機制的聊天機器人 |
這個作業(yè)在哪個具體方面幫助我實現(xiàn)目標(biāo) | 問題的提出,資料的查找 |
參考文獻 | 1.簡說Seq2Seq原理以及實現(xiàn)?2.序列到序列學(xué)習(xí)(seq2seq) ?20分鐘掌握RNN與LSTM原理及其結(jié)構(gòu)應(yīng)用(Seq2Seq & Attention) |
1. 設(shè)計目的
通過課程設(shè)計的練習(xí),加深學(xué)生對所學(xué)自然語言處理的理論知識與操作技能的理解和掌握,使得學(xué)生能綜合運用所學(xué)理論知識和操作技能進行實際工程項目的設(shè)計開發(fā),讓學(xué)生真正體會到自然語言處理算法在實際工程項目中的具體應(yīng)用方法,為今后能夠獨立或協(xié)助工程師進行人工智能產(chǎn)品的開發(fā)設(shè)計工作奠定基礎(chǔ)。通過綜合應(yīng)用項目的實施,培養(yǎng)學(xué)生團隊協(xié)作溝通能力,培養(yǎng)學(xué)生運用現(xiàn)代工具分析和解決復(fù)雜工程問題的能力;引導(dǎo)學(xué)生深刻理解并自覺實踐職業(yè)精神和職業(yè)規(guī)范;培養(yǎng)學(xué)生遵紀守法、愛崗敬業(yè)、誠實守信、開拓創(chuàng)新的職業(yè)品格和行為習(xí)慣。
2.設(shè)計要求
2.1 實驗儀器及設(shè)備
(1) 使用64位Windows操作系統(tǒng)的電腦。
(2) 使用3.8.16版本的Python。
(3) 使用6.4.12版本的jupyter notebook編輯器。
(4) 使用 numpy,pandas,tensorflow,pyttsx3……
2.2 設(shè)計要求
課程設(shè)計的主要環(huán)節(jié)包括課程設(shè)計作品和課程設(shè)計報告的撰寫。課程設(shè)計作品的完成主要包含方案設(shè)計、計算機編程實現(xiàn)、作品測試幾個方面。課程設(shè)計報告主要是將課程設(shè)計的理論設(shè)計內(nèi)容、實現(xiàn)的過程及測試結(jié)果進行全面的總結(jié),把實踐內(nèi)容上升到理論高度。
3.設(shè)計內(nèi)容
本項目針對傳統(tǒng)的聊天機器人對話生成機制識別率低的情況,設(shè)計一種基于 seq2seq和Attention模型的聊天機器人對話生成機制,一定程度提高了識別率,項目設(shè)計內(nèi)容為:
(1)編碼器和解碼器
這兩個模型本質(zhì)上都?到了兩個循環(huán)神經(jīng)?絡(luò),分別叫做編碼器和解碼器。 編碼器?來分析輸?序列,解碼器?來?成輸出序列。
(2)LSTM
長短期記憶(Long short-term memory)是一種特殊的RNN,主要是為了解決長序列訓(xùn)練過程中的梯度消失和梯度爆炸問題。簡單來說,就是相比普通的RNN,LSTM能夠在更長的序列中有更好的表現(xiàn)。
本項目采用LSTM作為編碼器和解碼器。
(3)注意力機制
編碼器在時間步t的隱藏狀態(tài)為ht,且總時間步數(shù)為T。那么解碼器在時間步t ′的背景變量為所有編碼器隱藏狀態(tài)的加權(quán)平均:
其中給定t ′時,權(quán)重αt ′t在t = 1, . . . , T的值是?個概率分布。為了得到概率分布,我們可以使?softmax運算:
計算softmax運算的輸?et ′t。由于et ′t同時取決于解碼器的時間步t ′和編碼器的時間步t,不妨以解碼器在時間步t ′ ? 1的隱藏狀態(tài)st ′?1與編碼器在時間步t的隱藏狀態(tài)ht為輸?,并通過函數(shù)a計算et ′t:
4.設(shè)計過程
4.1 提出總體設(shè)計方案
為了設(shè)計基于Seq2Seq注意力機制的聊天機器人系統(tǒng),需要以下幾個步驟:
(1)數(shù)據(jù)收集和預(yù)處理:搜集對話記錄數(shù)據(jù)集,并進行文本清洗、處理,如去除標(biāo)點符號、轉(zhuǎn)換為小寫字母等。將文本序列轉(zhuǎn)換為相應(yīng)的整數(shù)序列,并對數(shù)據(jù)進行填充,對話記錄數(shù)據(jù)集應(yīng)包含問題和答案的對應(yīng)關(guān)系。
(2)創(chuàng)建Seq2Seq模型:使用TensorFlow框架創(chuàng)建Seq2Seq模型,其中編碼器采用 LSTM,解碼器采用 LSTM + 注意力機制。Seq2Seq 模型將問題作為輸入,輸出答案。
(3)訓(xùn)練模型和保存:將預(yù)處理的數(shù)據(jù)集訓(xùn)練Seq2Seq模型,調(diào)整超參數(shù)和網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化模型性能。
(4)設(shè)計主函數(shù):加載預(yù)訓(xùn)練模型的權(quán)重參數(shù),通過循環(huán)處理輸入的文本序列 encoder_input_data,進行機器人對話交互。
(5)構(gòu)建UI界面,使用 PyQt5設(shè)計登錄界面,實現(xiàn)正確輸入賬號密碼登錄使用基于Seq2Seq注意力模型的聊天機器人系統(tǒng)。
4.2 具體實現(xiàn)過程
4.2.1 數(shù)據(jù)收集和預(yù)處理
(1)數(shù)據(jù)收集
通過在網(wǎng)上搜集資料,尋找合適的語料庫,本項目采用的語料庫為Source_segment11.txt
(2)導(dǎo)入相關(guān)庫
導(dǎo)入實驗所需庫,用于后續(xù)數(shù)據(jù)的處理和模型的構(gòu)建,其中主要使用Tensorflow中的Keras模塊,Keras 是一個高級神經(jīng)網(wǎng)絡(luò)API,它可以幫助構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型,而無需手動編寫大量的代碼,避免重復(fù)造輪子。
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers , activations , models , preprocessing , utils
import pandas as pd
import pyttsx3
import sys
(3)數(shù)據(jù)預(yù)處理
使用中文分詞工具jieba,將原來的語料庫進行中文分詞處理,在自動問答系統(tǒng)中,對于用戶輸入的問題,我們需要通過自然語言處理技術(shù)將其轉(zhuǎn)換成機器能夠理解和處理的形式,以便能夠正確匹配并返回相應(yīng)的答案。而中文分詞是這個過程中的一環(huán),其主要作用是將中文句子切分為一系列有意義的詞匯單位,以便后續(xù)的處理。
import jieba
with open('Source_segment11.txt', 'r', encoding='utf-8') as f:
text = f.read()
seg_list = jieba.cut(text, cut_all=False)
with open('Source_segment12.txt', 'w', encoding='utf-8') as f:
f.write(' '.join(seg_list))
(4)讀取預(yù)處理數(shù)據(jù)
讀取預(yù)處理數(shù)據(jù),移除換行,對文本庫數(shù)據(jù)進行檢查,并查看對話內(nèi)容總數(shù),對數(shù)據(jù)展示,初步查看數(shù)據(jù)預(yù)處理情況。
text_Segment = open('./Source_segment11.txt','r', encoding='utf-8')
text_Segment_list = text_Segment.readlines()
text_Segment.close()
text_Segment_list = [n.rstrip() for n in text_Segment_list]
if len(text_Segment_list)%2!=0:
print("文本庫數(shù)據(jù)有誤 對話不對稱 請檢查!")
else:
print('對話內(nèi)容總數(shù):', len(text_Segment_list))
X = text_Segment_list[0:][::2]
Y = text_Segment_list[1:][::2]
lines = pd.DataFrame({"input":X,"output":Y})
lines.head()
(5)數(shù)據(jù)填充
使用預(yù)處理模塊中的 Tokenizer() 方法對其進行處理,將文本數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的整數(shù)序列。然后,統(tǒng)計所有序列的長度,并找到其中的最大長度作為填充后的標(biāo)準(zhǔn)長度,再使用 pad_sequences() 函數(shù)對序列進行填充。
#encoder
input_lines = list()
for line in lines.input:
input_lines.append(line)
print(input_lines[:4])
tokenizer = preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(input_lines)
tokenized_input_lines = tokenizer.texts_to_sequences(input_lines)
print(tokenized_input_lines[:4])
len_list = list()
for token_line in tokenized_input_lines:
len_list.append(len(token_line))
print(len_list[:4])
max_len = np.array(len_list).max()
print( '輸入最大長度為{}'.format( max_len ))
padded_input_lines = preprocessing.sequence.pad_sequences(tokenized_input_lines, maxlen=max_len, padding='post')
print("進行填充之后:")
print(padded_input_lines[:4])
encoder_input_data = np.array(padded_input_lines)
print( '編碼輸入數(shù)據(jù)后的形狀 -> {}'.format( encoder_input_data.shape ))
input_word_dict = tokenizer.word_index
# print(input_word_dict)
num_input_tokens = len(input_word_dict) + 1
print( '輸入詞元數(shù)量 = {}'.format( num_input_tokens))
output_lines = list()
for line in lines.output:
output_lines.append('<START> ' + line + ' <END>')
print(output_lines[:4])
tokenizer = preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(output_lines)
tokenized_output_lines = tokenizer.texts_to_sequences(output_lines)
length_list = list()
for token_seq in tokenized_output_lines:
length_list.append( len( token_seq ))
max_output_length = np.array( length_list ).max()
print( '輸出最大長度為 {}'.format( max_output_length ))
padded_output_lines = preprocessing.sequence.pad_sequences(tokenized_output_lines, maxlen=max_output_length, padding='post')
decoder_input_data = np.array(padded_output_lines)
print( '解碼數(shù)據(jù)后的shape -> {}'.format( decoder_input_data.shape ))
output_word_dict = tokenizer.word_index
num_output_tokens = len(output_word_dict) + 1
print( '輸出詞元的數(shù)量 = {}'.format( num_output_tokens))
decoder_target_data = list()
for token in tokenized_output_lines:
decoder_target_data.append(token[1:])
padded_output_lines = preprocessing.sequence.pad_sequences(decoder_target_data, maxlen=max_output_length, padding='post')
onehot_output_lines = utils.to_categorical(padded_output_lines, num_output_tokens) #對答案進行 one-hot 編碼
decoder_target_data = np.array(onehot_output_lines)
print( 'Decoder target data shape -> {}'.format( decoder_target_data.shape ))
4.2.2 模型搭建
模型搭建包含編碼器和解碼器兩個部分。
(1)編碼器的輸入
是一個形狀為(None,)的張量,表示輸入序列的長度是可變的;嵌入層將輸入序列中的每個單詞轉(zhuǎn)換為一個256維的向量;LSTM層將嵌入層的輸出作為輸入,返回最后一個時間步的輸出和狀態(tài)向量。這些狀態(tài)向量將作為解碼器的初始狀態(tài)。
圖 4- 11 編碼器輸入
(2)解碼器的輸入
也是一個形狀為(None,)的張量,表示輸出序列的長度是可變的;嵌入層將輸出序列中的每個單詞轉(zhuǎn)換為一個256維的向量;LSTM層將嵌入層的輸出作為輸入,同時也接收編碼器的狀態(tài)向量作為初始狀態(tài),返回一個形狀為(None,256)的張量作為輸出序列。
encoder_inputs = tf.keras.layers.Input(shape=( None , ))
#嵌入層將輸出序列中的每個單詞轉(zhuǎn)換為一個256維的向量
encoder_embedding = tf.keras.layers.Embedding( num_input_tokens, 256 , mask_zero=True ) (encoder_inputs) #編碼器的嵌入層
#LSTM層將嵌入層的輸出作為輸入,同時也接收編碼器的狀態(tài)向量作為初始狀態(tài),返回一個形狀為(None,256)的張量作為輸出序列
encoder_lstm = tf.keras.layers.LSTM( 256 , return_state=True , recurrent_activation = 'sigmoid',dropout=0.2)
encoder_outputs , state_h , state_c = encoder_lstm( encoder_embedding )
encoder_states = [ state_h , state_c ]
decoder_inputs = tf.keras.layers.Input(shape=( None , ))
decoder_embedding = tf.keras.layers.Embedding( num_output_tokens, 256 , mask_zero=True) (decoder_inputs)
decoder_lstm = tf.keras.layers.LSTM( 256 , return_state=True , recurrent_activation = 'sigmoid',return_sequences=True,dropout=0.2)
decoder_outputs , _ , _ = decoder_lstm ( decoder_embedding , initial_state=encoder_states)
(3)注意力機制,
通過計算解碼器的輸出序列和編碼器的輸出序列之間的相似度,得到一個權(quán)重向量,表示解碼器在生成當(dāng)前單詞時應(yīng)該關(guān)注編碼器輸出序列的哪些部分。這個權(quán)重向量會被用來加權(quán)編碼器的輸出序列,得到一個加權(quán)向量,作為解碼器的輸入。
#注意力機制
attention = tf.keras.layers.Attention(name='attention_layer')
attention_output = attention([decoder_outputs,encoder_outputs])
(4)Concatenate和全連接層
將解碼器的輸出向量映射到一個形狀為(num_output_tokens)的張量,表示輸出序列中每個單詞的概率分布。
#定義 Concatenate 層,并將解碼器 LSTM 層的輸出 decoder_outputs 與 attention_output 進行連接。
decoder_concat = tf.keras.layers.Concatenate(axis=-1, name='concat_layer')
decoder_concat_input = decoder_concat([decoder_outputs, attention_output])
#全連接層
decoder_dense = tf.keras.layers.Dense( num_output_tokens , activation=tf.keras.activations.softmax )
output = decoder_dense ( decoder_concat_input )
#預(yù)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型
model = tf.keras.models.Model([encoder_inputs, decoder_inputs], output )
#編譯模型,使用 Adam 優(yōu)化器以及交叉熵損失函數(shù)進行訓(xùn)練,同時使用 accuracy 指標(biāo)查詢準(zhǔn)確率
model.compile(optimizer=tf.keras.optimizers.Adam(), loss='categorical_crossentropy',metrics=['accuracy'])
(5)模型預(yù)訓(xùn)練和編譯
模型的損失函數(shù)為交叉熵,優(yōu)化器為Adam,評價指標(biāo)為準(zhǔn)確率。模型的輸入是編碼器和解碼器的輸入張量,輸出是全連接層的輸出張量。模型結(jié)構(gòu)的具體信息可以通過調(diào)用summary()方法進行查看。
其中:
符號 | 解釋 |
---|---|
M | 類別的數(shù)量 |
yic | 符號函數(shù)( 0 或 1 ) |
pic | 觀測樣本 i 屬于類別 c 的預(yù)測概率 |
model.summary() #查看模型結(jié)構(gòu)的具體信息
#導(dǎo)入下面的庫
from tensorflow.keras.utils import plot_model
import pydotplus
#參數(shù) :模型名稱,結(jié)構(gòu)圖保存位置,是否展示shape
plot_model(model,to_file='model.png',show_shapes=True)
4.2.3 模型訓(xùn)練與保存
(1)代碼定義了一個生成隨機 batch 數(shù)據(jù)的函數(shù) generate_batch_data_random,用于逐步提取數(shù)據(jù)并降低對顯存的占用。
DEFAULT_BATCH_SIZE = 32
DEFAULT_EPOCH = 200
import random
def generate_batch_data_random(x1,x2, y, batch_size):
"""逐步提取batch數(shù)據(jù)到顯存,降低對顯存的占用"""
ylen = len(y)
loopcount = ylen // batch_size
while (True):
i = random.randint(0,loopcount)
yield [x1[i * batch_size:(i + 1) * batch_size],x2[i * batch_size:(i + 1) * batch_size]], y[i * batch_size:(i + 1) * batch_size]
(2)計算訓(xùn)練集的批次數(shù),以便在訓(xùn)練過程中使用。然后,使用generate_batch_data_random函數(shù)生成隨機批次的訓(xùn)練數(shù)據(jù),并使用fit函數(shù)進行訓(xùn)練。其中,steps_per_epoch參數(shù)設(shè)置為train_num_batches,表示在一個epoch中訓(xùn)練的批次數(shù)。batch_size參數(shù)設(shè)置為DEFAULT_BATCH_SIZE,表示每個批次的大小。epochs參數(shù)設(shè)置為DEFAULT_EPOCH,表示訓(xùn)練的輪數(shù)。最后,使用save函數(shù)將訓(xùn)練好的模型保存為’h5’格式的文件。
train_num_batches = len(encoder_input_data) // DEFAULT_BATCH_SIZE #
model.fit(generate_batch_data_random(encoder_input_data,decoder_input_data,decoder_target_data,DEFAULT_BATCH_SIZE)
,steps_per_epoch=train_num_batches, batch_size=DEFAULT_BATCH_SIZE, epochs=DEFAULT_EPOCH)
model.save( 'model.h5' )
(3)將訓(xùn)練好的編碼器和解碼器模型組合成一個完整的推理模型。在推理階段,該模型可以一步一步地生成目標(biāo)序列,直到完成整個序列的生成,并且可以對每一步的輸出進行調(diào)整和優(yōu)化。
def make_inference_model():
encoder_outputs , state_h , state_c = encoder_lstm( encoder_embedding )
encoder_model = tf.keras.models.Model(encoder_inputs, [encoder_outputs,encoder_states])
decoder_state_input_h = tf.keras.layers.Input(shape=(256,))
decoder_state_input_c = tf.keras.layers.Input(shape=(256,))
decoder_state_inputs = [decoder_state_input_h, decoder_state_input_c]
decoder_outputs, state_h, state_c = decoder_lstm(decoder_embedding, decoder_state_inputs)
decoder_states = [state_h, state_c]
attention_output = attention([decoder_outputs,encoder_outputs])
decoder_concat_input = decoder_concat([decoder_outputs, attention_output])
decoder_outputs = decoder_dense(decoder_concat_input)
decoder_model = tf.keras.models.Model([decoder_inputs,encoder_outputs] + decoder_state_inputs, [decoder_outputs] + decoder_states)
return encoder_model, decoder_model
enc_model , dec_model = make_inference_model()
4.2.4 聊天機器人
(1)定義str_to_token函數(shù),將一個輸入的句子轉(zhuǎn)換為一個數(shù)字序列。
import jieba
def str_to_token (sentence: str):
words = sentence.lower().strip()
words = jieba.cut(words)
token_list = list()
for word in words:
token_list.append(input_word_dict[word])
return preprocessing.sequence.pad_sequences([token_list], maxlen=max_len, padding='post')
(2)定義聊天機器人函數(shù),實現(xiàn)一個簡單的基于預(yù)訓(xùn)練模型的聊天機器人,它可以接收用戶的文本輸入,使用預(yù)訓(xùn)練模型生成合適的響應(yīng),并通過語音輸出等方式進行回復(fù)。
4.2.5 登錄界面
設(shè)計一個登錄界面,用戶,輸入正確的賬號密碼,方可登錄聊天機器人系統(tǒng),若輸入錯誤,會有錯誤提示。文章來源:http://www.zghlxwxcb.cn/news/detail-493493.html
# 導(dǎo)入所需的庫
import sys
import numpy as np
import pyttsx3
from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QLineEdit, QVBoxLayout
from PyQt5.QtCore import Qt
# 加載模型和詞典
model = ... # 省略模型加載的代碼
output_word_dict = ... # 省略詞典加載的代碼
# 定義一個將字符串轉(zhuǎn)換為token的函數(shù)
def str_to_token(sentence):
# 省略轉(zhuǎn)換邏輯的代碼
return token
# 創(chuàng)建一個聊天機器人類
class Chatbot:
def __init__(self):
# 初始化語音引擎對象
self.engine = pyttsx3.init()
# 加載編碼器和解碼器模型
self.enc_model = ... # 省略模型加載的代碼
self.dec_model = ... # 省略模型加載的代碼
# 定義一個回答用戶輸入的方法
def reply(self, user_input):
# 初始化一個空的翻譯結(jié)果
decoded_translation = ''
try:
# 用編碼器模型預(yù)測用戶輸入的狀態(tài)值和輸出值
encoder_outputs, states_values = self.enc_model.predict(str_to_token(user_input))
# 創(chuàng)建一個空的目標(biāo)序列
empty_target_seq = np.zeros((1, 1))
# 將目標(biāo)序列的第一個元素設(shè)為"start"對應(yīng)的索引值
empty_target_seq[0, 0] = output_word_dict['start']
# 初始化一個停止條件為False
stop_condition = False
# 循環(huán)直到停止條件為True
while not stop_condition:
# 用解碼器模型預(yù)測目標(biāo)序列,狀態(tài)值和輸出值
dec_outputs, h, c = self.dec_model.predict([empty_target_seq, encoder_outputs] + states_values)
# 獲取輸出值中最大概率對應(yīng)的索引值
sampled_word_index = np.argmax(dec_outputs[0, -1, :])
# 初始化一個采樣的單詞為None
sampled_word = None
# 遍歷輸出詞典,找到索引值對應(yīng)的單詞
for word, index in output_word_dict.items():
if sampled_word_index == index:
# 將單詞添加到翻譯結(jié)果中,并加上空格
decoded_translation += ' {}'.format(word)
# 更新采樣的單詞為找到的單詞
sampled_word = word
# 如果采樣的單詞是"end"或者翻譯結(jié)果超過最大長度,更新停止條件為True
if sampled_word == 'end' or len(decoded_translation.split()) > max_output_length:
stop_condition = True
# 創(chuàng)建一個新的空目標(biāo)序列
empty_target_seq = np.zeros((1, 1))
# 將目標(biāo)序列的第一個元素設(shè)為采樣單詞對應(yīng)的索引值
empty_target_seq[0, 0] = sampled_word_index
# 更新狀態(tài)值為當(dāng)前狀態(tài)值
states_values = [h, c]
except:
# 如果出現(xiàn)異常,將翻譯結(jié)果設(shè)為一個默認回答
decoded_translation = '對不起,我沒有聽懂。'
# 返回去掉"end"和空格后的翻譯結(jié)果
return decoded_translation.replace(' end', '').replace(' ', '')
# 創(chuàng)建一個圖形用戶界面類
class GUI(QWidget):
def __init__(self):
super().__init__()
# 初始化一個聊天機器人對象
self.chatbot = Chatbot()
# 初始化圖形用戶界面
self.initUI()
def initUI(self):
# 設(shè)置窗口標(biāo)題
self.setWindowTitle('聊天界面')
# 設(shè)置窗口大小
self.resize(400, 400)
# 設(shè)置窗口背景顏色
self.setStyleSheet('background-color: lightblue')
# 創(chuàng)建一個文本框,用于顯示聊天記錄,設(shè)置為只讀模式
self.text_box = QTextEdit(self)
self.text_box.setReadOnly(True)
# 創(chuàng)建一個輸入框,用于輸入用戶信息,設(shè)置為單行模式
self.entry_box = QLineEdit(self)
self.entry_box.setPlaceholderText('請輸入一些內(nèi)容')
# 綁定回車鍵事件,調(diào)用send方法
self.entry_box.returnPressed.connect(self.send)
# 創(chuàng)建一個垂直布局,將文本框和輸入框添加到布局中
layout = QVBoxLayout(self)
layout.addWidget(self.text_box)
layout.addWidget(self.entry_box)
# 定義一個發(fā)送用戶輸入并接收機器人回答的方法
def send(self):
# 獲取用戶輸入的內(nèi)容
user_input = self.entry_box.text()
# 清空輸入框
self.entry_box.clear()
# 在文本框中顯示用戶輸入的內(nèi)容,并換行
self.text_box.append('user:???????' + user_input)
# 調(diào)用聊天機器人的回答方法,獲取機器人回答的內(nèi)容
bot_output = self.chatbot.reply(user_input)
# 在文本框中顯示機器人回答的內(nèi)容,并換行
self.text_box.append('chatbot??:' + bot_output)
# 調(diào)用語音引擎說出機器人回答的內(nèi)容
self.chatbot.engine.say(bot_output)
self.chatbot.engine.runAndWait()
# 創(chuàng)建一個應(yīng)用對象
app = QApplication(sys.argv)
# 創(chuàng)建一個圖形用戶界面對象
gui = GUI()
# 顯示圖形用戶界面
gui.show()
# 進入主循環(huán),等待用戶交互
sys.exit(app.exec_())
5.設(shè)計體會
歷時七天的自然語言處理實訓(xùn),是在寫代碼中度過的,我想這也是我們大都數(shù)同學(xué),第一次這么長時間的坐在一起去認真搞一個項目;這對我來說,是一段特殊的回憶,并且我想,通過認真做項目,這在很大程度上提高了我們的動手能力,就比如說,在本次項目的開發(fā)過程中,我通過查找資料,看視頻課學(xué)到了很多的關(guān)于自然語言處理和神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)方面的知識,我還拓展了該項目,為我的聊天機器人設(shè)計了一個登錄界面,進而,我也學(xué)會了一些PyQt5界面設(shè)計技巧,我相信通過后續(xù)的進一步學(xué)習(xí)思考,我的聊天機器人將變得更加完善。
我選擇了大都數(shù)人認為難實現(xiàn)的實驗三作為我本次自然語言的課程設(shè)計,原因有很多,更多的是因為興趣使然,隨著ChatGPT的爆紅,聊天機器人作為一種智能化的交互方式受到了越來越多人的歡迎。尤其是在各種社交軟件和智能家居中,聊天機器人已經(jīng)成為人們生活和工作中不可缺少的一部分。而基于 Seq2Seq 注意力機制的聊天機器人,則是目前比較常見和有效的一種技術(shù)方案,這讓我忍不住想動手去試一試,實現(xiàn)一個自己的簡單聊天機器人。
Seq2Seq 作為一種經(jīng)典的神經(jīng)網(wǎng)絡(luò)模型,由編碼器和解碼器兩個部分組成。編碼器將輸入序列壓縮成一個定長向量,并將其傳遞給解碼器,解碼器再根據(jù)該向量生成輸出序列。
然而,當(dāng)輸入或輸出序列很長時,編碼器和解碼器無法保留所有信息,從而導(dǎo)致信息冗余和模型性能下降。為了解決這個問題,注意力機制被引入并得到成功應(yīng)用。它通過學(xué)習(xí)每個輸入位置與輸出位置之間的相似度,使解碼器能夠關(guān)注輸入序列中與當(dāng)前輸出位置最相關(guān)的部分,從而提高模型的效果。
在聊天機器人的實現(xiàn)中,我們可以使用 Seq2Seq 注意力機制來判斷用戶的輸入并生成相應(yīng)的回復(fù)。
首先,我們需要對聊天記錄進行預(yù)處理,將原始數(shù)據(jù)轉(zhuǎn)化為模型可以理解并處理的格式。這個過程通常涉及到文本清洗、分詞、詞向量化等一系列步驟。然后,我們可以將用戶的輸入作為編碼器的輸入,并將生成的定長向量傳遞給解碼器。解碼器通過注意力機制來生成相應(yīng)的回復(fù),并將其返回給用戶。
除了技術(shù)方案,聊天機器人的交互設(shè)計也是十分重要的。為了增強用戶體驗,我考慮如何讓用戶盡可能地簡便地使用聊天機器人。為此,我采用了 GUI 開發(fā)工具,如 PyQt5 等,來實現(xiàn)友好、直觀、便捷的用戶界面,從而提高用戶的操作體驗和滿意度。例如,可以設(shè)計一個具有登錄功能的界面,以便用戶可以通過輸入用戶名和密碼來進入聊天室。
在完成聊天機器人項目的過程中,我遇到了很多困難,比如說,對注意力機制和編碼器解碼器模型的不夠理解,對PyQt5的使用,知之甚少,但是這些問題大都得到了解決,同時我增加了一些融合創(chuàng)新,使得整個界面看起來與眾不同,這讓我感受到了快速學(xué)習(xí)和創(chuàng)新思維的重要性。在技術(shù)和設(shè)計之間進行融合時,需要全面地考慮各種情況,并及時解決遇到的問題。同時,需要有創(chuàng)新思維和創(chuàng)造力,能夠不斷地推陳出新,做出更好的應(yīng)用體驗。此外,我還需要定期更新和優(yōu)化模型,在不斷學(xué)習(xí)新技術(shù)、新算法的基礎(chǔ)上,提高聊天機器人的表現(xiàn)。
總的來說,基于 Seq2Seq 注意力機制的聊天機器人是一個相對較為復(fù)雜的應(yīng)用,需要綜合運用多種技術(shù)和工具并考慮到許多復(fù)雜因素。在實際開發(fā)中,需要我們不斷地學(xué)習(xí)、思考和實踐,以達到更好的應(yīng)用效果和用戶使用體驗。文章來源地址http://www.zghlxwxcb.cn/news/detail-493493.html
到了這里,關(guān)于NLP作業(yè)02:課程設(shè)計報告的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!