国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

NLP作業(yè)02:課程設(shè)計報告

這篇具有很好參考價值的文章主要介紹了NLP作業(yè)02:課程設(shè)計報告。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作業(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ò),分別叫做編碼器和解碼器。 編碼器?來分析輸?序列,解碼器?來?成輸出序列。
NLP作業(yè)02:課程設(shè)計報告
(2)LSTM
長短期記憶(Long short-term memory)是一種特殊的RNN,主要是為了解決長序列訓(xùn)練過程中的梯度消失和梯度爆炸問題。簡單來說,就是相比普通的RNN,LSTM能夠在更長的序列中有更好的表現(xiàn)。

NLP作業(yè)02:課程設(shè)計報告
本項目采用LSTM作為編碼器和解碼器。
NLP作業(yè)02:課程設(shè)計報告

(3)注意力機制
NLP作業(yè)02:課程設(shè)計報告
編碼器在時間步t的隱藏狀態(tài)為ht,且總時間步數(shù)為T。那么解碼器在時間步t ′的背景變量為所有編碼器隱藏狀態(tài)的加權(quán)平均:
NLP作業(yè)02:課程設(shè)計報告
其中給定t ′時,權(quán)重αt ′t在t = 1, . . . , T的值是?個概率分布。為了得到概率分布,我們可以使?softmax運算:
NLP作業(yè)02:課程設(shè)計報告

計算softmax運算的輸?et ′t。由于et ′t同時取決于解碼器的時間步t ′和編碼器的時間步t,不妨以解碼器在時間步t ′ ? 1的隱藏狀態(tài)st ′?1與編碼器在時間步t的隱藏狀態(tài)ht為輸?,并通過函數(shù)a計算et ′t:
NLP作業(yè)02:課程設(shè)計報告

4.設(shè)計過程

4.1 提出總體設(shè)計方案

NLP作業(yè)02:課程設(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
NLP作業(yè)02:課程設(shè)計報告
(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()方法進行查看。
NLP作業(yè)02:課程設(shè)計報告

其中:

符號 解釋
M 類別的數(shù)量
yic 符號函數(shù)( 0 或 1 )
pic 觀測樣本 i 屬于類別 c 的預(yù)測概率
model.summary() #查看模型結(jié)構(gòu)的具體信息

NLP作業(yè)02:課程設(shè)計報告

#導(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)

NLP作業(yè)02:課程設(shè)計報告

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),若輸入錯誤,會有錯誤提示。

# 導(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 嵌入式系統(tǒng)課程設(shè)計報告

    嵌入式系統(tǒng)課程設(shè)計報告 題目7(序號) 學(xué)生成績查詢系統(tǒng)(題目) ?? ????????? 專??? 業(yè): ?? ???軟件工程 ???????? 班??? 級: ??? ? 軟件二班?????????????? ?? 姓??? 名: ???????? xx????????????? ?? 學(xué)??? 號: ? ??????????2019320100???

    2024年02月13日
    瀏覽(26)
  • C語言源碼做的運動會管理系統(tǒng)課程設(shè)計(源碼+課程設(shè)計報告)

    一、課程設(shè)計的目的: C語言程序設(shè)計課程設(shè)計是計算機科學(xué)與技術(shù)專業(yè)重要的實踐性教學(xué)環(huán)節(jié)之一,本次設(shè)計結(jié)合實際應(yīng)用的要求,使課程設(shè)計既覆蓋C語言的知識點,又接近工程實際需要。目的是通過課程設(shè)計的綜合訓(xùn)練,培養(yǎng)學(xué)生實際分析問題、解決問題的能力,以及編

    2023年04月13日
    瀏覽(23)
  • web前端課程作業(yè)設(shè)計:個人簡歷

    web前端課程作業(yè)設(shè)計:個人簡歷

    今天博主的web前端選修課結(jié)課了,期末大作業(yè)也提交了,今天寫一篇博客把我的大作業(yè)分享給大家。 個人簡歷主頁設(shè)計 應(yīng)盡量包含以下內(nèi)容: ? 包含個人基本信息、教育背景、個人風(fēng)采、與我聯(lián)系四塊內(nèi)容 ? 在頁面組織上,以上內(nèi)容可以通過主頁鏈接到不同頁面,也可以放

    2024年02月08日
    瀏覽(17)
  • MATLAB——信號處理仿真功能課程設(shè)計報告

    摘??? 要... I 目??? 錄. II 1 設(shè)計目的及內(nèi)容. 1 1.1 課程設(shè)計目的. 1 1.2 課程設(shè)計內(nèi)容. 1 2 課程設(shè)計基本原理. 3 2.1 基本信號. 3 2.2 計算原理. 3 3 設(shè)計與仿真. 4 3.1 基本信號. 4 3.2計算過程. 6 3.3 matlab仿真原理. 7 3.4 計算結(jié)果. 8 3.5結(jié)果分析. 10 總??? 結(jié). 12 參 考 文 獻. 13 附錄 仿真

    2024年02月11日
    瀏覽(23)
  • C++課程設(shè)計報告——簡易五子棋游戲

    C++課程設(shè)計報告——簡易五子棋游戲

    五子棋是是一種兩人對弈的純策略型棋類游戲,通常雙方分別使用黑白兩色的棋子在棋盤交替下棋,先形成五子連線者獲勝。此次課程設(shè)計主要目的是實現(xiàn)五子棋的雙人對弈,對戰(zhàn)雙方通過鼠標(biāo)點擊進行對弈。 游戲通過鼠標(biāo)點擊實現(xiàn)下棋,黑白子交替下棋。 程序通過使用e

    2024年02月13日
    瀏覽(20)
  • 系統(tǒng)分析與設(shè)計課程報告-----------------社團管理系統(tǒng)

    系統(tǒng)分析與設(shè)計課程報告-----------------社團管理系統(tǒng)

    青年志愿者協(xié)會在學(xué)院黨委的領(lǐng)導(dǎo)及團委的直接指導(dǎo)下,由學(xué)生自發(fā)組織,全校師生自愿參加的,志愿服務(wù)于廣大師生,奉獻愛心于社會的,倡導(dǎo)積極主流文化的群眾性服務(wù)性團體。 (一)主席團 作為青年志愿者協(xié)會的領(lǐng)導(dǎo)核心,全面主持校青志的各項工作;負責(zé)校青志總

    2024年02月11日
    瀏覽(102)
  • Android課程設(shè)計大作業(yè)-音樂播放器

    Android課程設(shè)計大作業(yè)-音樂播放器

    1)使用Service播放音樂 Android SDK提供了Service。Service有兩種類型: 本地服務(wù)(Local Service):用于應(yīng)用程序內(nèi)部 遠程服務(wù)(Remote Sercie):用于Android系統(tǒng)內(nèi)部的應(yīng)用程序之間前者用于實現(xiàn)應(yīng)用程序自己的一些耗時任務(wù),比如查詢升級信息,并不占用應(yīng)用程序比如Activity所屬線程,而是單

    2024年02月10日
    瀏覽(20)
  • MySQL數(shù)據(jù)庫設(shè)計作業(yè) ——《網(wǎng)上書店系統(tǒng)》數(shù)據(jù)庫設(shè)計實驗報告

    MySQL數(shù)據(jù)庫設(shè)計作業(yè) ——《網(wǎng)上書店系統(tǒng)》數(shù)據(jù)庫設(shè)計實驗報告

    普通用戶:可以進行最基礎(chǔ)的登陸操作,可瀏覽圖書、按類別查詢圖書、查看 圖書的詳細信息,還可以注冊成為會員。 會員:需要填寫詳細信息(真實姓名、性別、手機號、地址、郵箱等),可瀏覽圖書、按類別查詢圖書、查看圖書的詳細信息,在此基礎(chǔ)上,還可以訂購圖

    2024年02月04日
    瀏覽(32)
  • 基于C#開發(fā)五子棋游戲 大作業(yè) 課程設(shè)計源碼

    基于C#開發(fā)五子棋游戲 大作業(yè) 課程設(shè)計源碼

    基于C#開發(fā)五子棋游戲(大作業(yè)/課程設(shè)計) 開發(fā)環(huán)境:??Windows操作系統(tǒng) 開發(fā)工具: Microsoft Visual Studio 運行效果圖: ? ?基于C#開發(fā)五子棋游戲(大作業(yè)/課程設(shè)計) 開發(fā)環(huán)境:? Windows操作系統(tǒng) 開發(fā)工具:Microsoft Visual Studio 基于C#開發(fā)五子棋游戲(大作業(yè)/課程設(shè)計) 開發(fā)環(huán)境

    2024年02月04日
    瀏覽(22)
  • C語言貪吃蛇課程設(shè)計實驗報告(包含貪吃蛇項目源碼)

    C語言貪吃蛇課程設(shè)計實驗報告(包含貪吃蛇項目源碼)

    文末有貪吃蛇代碼全覽,代碼有十分細致的注釋!!! 文末有貪吃蛇代碼全覽,代碼有十分細致的注釋!!! 文末有貪吃蛇代碼全覽,代碼有十分細致的注釋!!! 碼文不易,給個免費的小星星和免費的贊吧,關(guān)注也行呀(??????).:*?? 不要白嫖哇(?????д????? ? )傷心 目錄 1

    2024年02月12日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包