Python を使用すると、お客様専用のチャットボット プログラムの構築など、さまざまな目標を達成できます。 [[316320]] チャットボット プログラムは個人のニーズを満たすだけでなく、ビジネス組織や顧客にとっても非常に役立ちます。ほとんどの人は、ヘルプセンターに電話するよりも、チャットルームで直接話すことを好みます。 Facebook が公開したデータはロボットの価値を証明しています。毎月、個人と企業の間で20億件を超えるメッセージが送信されます。 HubSpot の調査によると、71% の人がメッセージング アプリから顧客サポートを受けたいと考えています。これは問題を迅速に解決する方法であるため、チャットボットは組織において明るい未来を持っています。 今日は、チャットボットに関するエキサイティングなプロジェクトを構築します。ユーザーが話していることを理解し、適切な応答を返すことができるチャットボットをゼロから作成します。 前提条件チャットボットを実装するには、ディープラーニングライブラリの Keras、自然言語処理ツールキットの NLTK、およびいくつかの便利なライブラリを使用します。すべてのライブラリがインストールされていることを確認するには、次のコマンドを実行します。 - pip インストール tensorflow keras pickle nltk
チャットボットはどのように機能しますか?チャットボットは、人間のように人々と対話し、コミュニケーションできるインテリジェントなソフトウェアです。興味深いですね。では、どのように動作するか見てみましょう。 すべてのチャットボットは自然言語処理 (NLP) の概念に基づいています。 NLP は次の 2 つの部分で構成されます。 - NLU (自然言語理解): 英語などの人間の言語を機械が理解する能力。
- NLG (自然言語生成): 人間が書いた文章に似たテキストを機械が生成する能力。
ユーザーがチャットボットに「ねえ、今日のニュースは何ですか?」と質問すると想像してください。 チャットボットは、ユーザーの文章を意図とエンティティの 2 つの部分に分解します。この文の目的は、ユーザーが実行したいアクションに言及していることから、おそらくニュースを入手することです。エンティティは意図に関する具体的な詳細を伝えるので、「今日」がエンティティになります。したがって、ここでは機械学習モデルを使用して、チャットの意図とエンティティを識別します。 プロジェクトファイルの構造プロジェクトが完了すると、これらのファイルはすべて残されます。それぞれを簡単に見てみましょう。これにより、開発者はプロジェクトをどのように実装するかについてのアイデアを得ることができます。 - Train_chatbot.py - このファイルでは、ユーザーがボットに対して行ったリクエストを分類および認識できるディープラーニング モデルを構築してトレーニングします。
- Gui_Chatbot.py - このファイルは、トレーニング済みのチャットボットとチャットするためのグラフィカル ユーザー インターフェイスを構築する場所です。
- Intents.json - Intents ファイルには、モデルのトレーニングに使用されるすべてのデータが含まれています。トークンのセットとそれに対応するパターンおよび応答が含まれています。
- Chatbot_model.h5 - トレーニング済みモデルの重みとアーキテクチャが保存される階層データ形式のファイルです。
- Classes.pkl-pickle ファイルを使用すると、メッセージを予測するときに分類するすべてのタグ名を保存できます。
- Words.pkl - Words.pklpickle ファイルには、モデルの語彙に含まれるすべての一意の単語が含まれています。
ソースコードとデータセットをダウンロード: メール送信先:https://drive.google.com/drive/folders/1r6MrrdE8V0bWBxndGfJxJ4Om62dJ2OMP?usp=sharing 独自のチャットボットを構築するにはどうすればいいですか?このチャットボットの構築を 5 つのステップに簡略化しました。 ステップ1: ライブラリをインポートしてデータをロードする 新しい Python ファイルを作成し、train_chatbot という名前を付けて、必要なすべてのモジュールをインポートします。その後、Python プログラムから JSON データ ファイルを読み取ります。 - numpyをnpとしてインポートする
- fromkeras.models から importSequential
- keras.layers から importDense、Activation、Dropout
- fromkeras.optimizers から SGD をインポートする
- インポートランダム
- インポートnltk
- fromnltk.stem インポートWordNetLemmatizer
- レマタイザー = WordNetLemmatizer()
- インポートjson
- インポートピクル
- intents_file = open ( 'intents.json' ). read ()
- インテント = json.loads(intents_file)
ステップ2: データの前処理 モデルは元のデータを取得できません。機械が理解しやすいようにするためには、多くの前処理を行わなければなりません。テキスト データにはさまざまな前処理手法が利用できます。最初の手法は、文を単語に分割するトークン化です。 インテント ファイルを見ると、各タグにモードと応答のリストが含まれていることがわかります。各パターンにマークを付け、単語をリストに追加します。さらに、パターンに関連するすべてのインテントを追加するためのクラスとドキュメントのリストを作成します。 - 単語=[]
- クラス=[]
- ドキュメント = []
- ignore_letters = [ '!' 、 '?' 、 ',' 、 '.' ]
- intents[ 'intents' ]内のforintent :
- forpattern in intent[ 'patterns' ]:
- #各単語をトークン化する
- 単語 = nltk.word_tokenize(パターン)
- words.extend(単語)
- #コーパスに文書を追加する
- documents.append((単語, インテント[ 'タグ' ]))
- #追加 クラスリストへ
- ifintent[ 'tag' ] がクラス内にありません:
- クラス.append(インテント[ 'タグ' ])
- 印刷(ドキュメント)
もう一つの手法は、見出し語化です。すべての標準語を簡約できるように、単語をレマ形式に変換できます。たとえば、play、playing、playing、played などの単語はすべて play に置き換えられます。このようにして、語彙の総語数を減らすことができます。したがって、各単語に対して補題を実行し、重複する単語を削除します。 - # レマズタイズして 各単語を下げて重複を削除する
- words = [lemmatizer.lemmatize( w.lower ()) forw単語内if w notinignore_letters]
- 単語 = sorted(リスト(セット(単語)))
- # ソートクラス
- クラス = sorted(リスト(セット(クラス)))
- # ドキュメント = パターンとインテントの組み合わせ
- print(len(ドキュメント)、 "ドキュメント" )
- # クラス = インテント
- print(len(classes), "classes" , classes)
- # 単語 =すべての単語、語彙
- print(len(words), "一意のレマタイ化された単語" , words)
- pickle.dump(単語、 open ( 'words.pkl' 、 'wb' ))
- pickle.dump(classes, open ( 'classes.pkl' , 'wb' ))
最後に、 words にはプロジェクトの語彙が含まれ、 classes には分類されるすべてのエンティティが含まれます。 Python オブジェクトをファイルに保存するには、pickle.dump() メソッドを使用します。これらのファイルは、トレーニングが完了するとチャットを予測するのに役立ちます。 ステップ3: トレーニングセットとテストセットを作成する モデルをトレーニングするために、各入力パターンは数値に変換されます。まず、パターン内の各単語を補題化し、単語の総数と同じ長さのゼロのリストを作成します。パターン内の単語を含むインデックスにのみ値 1 を設定します。同様に、パターンが属するクラス入力に 1 を設定して出力を作成します。 - #トレーニングデータを作成する
- トレーニング=[]
- #出力用の空の配列を作成する
- output_empty = [0] * len(クラス)
- # トレーニングセット、各文の単語の集まり
- ドキュメント内のfordoc :
- #単語の袋を初期化しています
- バッグ=[]
- #パターンのトークン化された単語のリスト
- 単語パターン = doc[0]
- # 各単語をレマタイ化 -関連する単語を表すためにベースワードを作成する
- word_patterns = [lemmatizer.lemmatize( word.lower ())で word_patterns内のwordを検索]
- #単語が見つかった場合は1で単語のバッグ配列を作成します 現在のパターン
- 序文の言葉:
- bag.append(1) 単語が word_patterns 内にある場合、そうでない場合はbag.append(0)
- #出力 ' 0'です 各タグごとに '1'は 現在のタグ(各パターン)
- 出力行 = リスト(出力空)
- output_row[クラス.インデックス(doc[1])] = 1
- トレーニング.append([バッグ、出力行])
- # 特徴量をシャッフルしてnumpyarrayを作成する
- ランダムシャッフル(トレーニング)
- トレーニング = np.array(トレーニング)
- #トレーニングとテストのリストを作成します。X-パターン、Y-インテント
- train_x = リスト(トレーニング[:,0])
- train_y = リスト(トレーニング[:,1])
- print( "トレーニングデータが作成されました" )
ステップ4: モデルのトレーニング モデルは 3 つの密な層で構成されるニューラル ネットワークになります。最初の層には 128 個のニューロンがあり、2 番目の層には 64 個のニューロンがあり、最後の層にはクラスの数と同じ数のニューロンがあります。モデルの過剰適合を減らすために、ドロップアウト レイヤーが導入されました。 SGD オプティマイザーを使用してデータを適合させ、モデルのトレーニングを開始します。 200 エポックのトレーニングが完了したら、Kerasmodel.save("chatbot_model.h5") 関数を使用してトレーニング済みのモデルを保存します。 - # ディープニューラルネットワークモデル
- モデル = シーケンシャル()
- モデルを追加します(Dense(128,input_shape=(len(train_x[0]),), activation= 'relu' ))
- model.add(ドロップアウト(0.5))
- model.add (Dense(64,アクティベーション= 'relu' ))
- model.add(ドロップアウト(0.5))
- モデルを追加します(Dense(len(train_y[0]), activation= 'softmax' ))
- # モデルのコンパイル。Nesterovaccelerated gradientを使用したSGD は、このモデルに対して良好な結果をもたらします。
- sgd = SGD(lr=0.01、減衰=1e-6、運動量=0.9、nesterov= True )
- model.compile(損失= 'categorical_crossentropy' 、オプティマイザー=sgd、メトリック=[ 'accuracy' ])
- #モデルのトレーニングと保存
- hist = model.fit(np.array(train_x), np.array(train_y), エポック=200, バッチサイズ=5, 詳細=1)
- モデルを保存します( 'chatbot_model.h5' , 履歴)
- print( "モデルが作成されました" )
ステップ5: チャットボットと対話する モデルがチャットの準備ができたので、新しいファイルにチャットボット用の優れたグラフィカル ユーザー インターフェイスを作成しましょう。ファイル名はgui_chatbot.pyとします。 GUI ファイルでは、Tkinter モジュールを使用してデスクトップ アプリケーションの構造を構築し、ユーザー メッセージをキャプチャして、再度前処理を実行してから、それらをトレーニング モデルに入力します。 次に、モデルはユーザーのメッセージのラベルを予測し、インテント ファイル内の応答リストから応答をランダムに選択します。 GUI ファイルの完全なソース コードは次のとおりです。 - インポートnltk
- fromnltk.stem インポートWordNetLemmatizer
- レマタイザー = WordNetLemmatizer()
- インポートピクル
- numpyをnpとしてインポートする
- keras.models から load_model をインポートする
- モデル = load_model( 'chatbot_model.h5' )
- インポートjson
- インポートランダム
- インテント = json.loads( open ( 'intents.json' ) .read ())
- words = pickle.load ( open ( 'words.pkl' 、 'rb' ))を実行します。
- クラス = pickle.load (開く( 'classes.pkl' 、 'rb' ))
- defclean_up_sentence(文):
- # パターンをトークン化 - 単語を配列に分割
- sentence_words = nltk.word_tokenize(文)
- # すべての単語の語幹を抽出 - 基本形に縮小
- sentence_words = [lemmatizer.lemmatize( word.lower ())文中の単語に対して]
- 戻り値: 文の単語
- # 単語の配列のバッグを返す:文中に存在する単語の場合は0または1
- defbag_of_words(文、単語、show_details= True ):
- # トークン化パターン
- sentence_words = clean_up_sentence(文)
- # 言葉の袋- 語彙マトリックス
- バッグ = [0]*len(単語数)
- sentence_words内のfors:
- fori,word inenumerate(単語):
- ifword == s:
- #現在の単語が 語彙の位置
- バッグ[i] = 1
- 詳細を表示:
- print( "バッグ内に見つかりました:%s" % 単語)
- 戻り値(np.array(bag))
- defpredict_class(文):
- # しきい値以下の予測をフィルタリング
- p = bag_of_words(文、単語、詳細表示= False )
- res = model.predict(np.array([p]))[0]
- ERROR_THRESHOLD = 0.25
- 結果 = [[i,r] fori,r inenumerate(res) ifr>ERROR_THRESHOLD]
- # ソート強度確率
- results.sort(キー=lambdax: x[1], 逆順= True )
- 戻り値リスト = []
- 結果のforr:
- return_list.append({ "意図" : クラス[r[0]], "確率" : str(r[1])})
- 戻る戻りリスト
- def getResponse(ints, intents_json):
- タグ = ints[0][ '意図' ]
- list_of_intents = intents_json[ 'インテント' ]
- list_of_intents内のfori :
- if(i[ 'タグ' ] == タグ):
- 結果 = random.choice(i[ 'responses' ])
- 壊す
- 結果を返す
- #tkinter GUIの作成
- インポートtkinter
- tkinter からのインポート *
- defsend():
- msg = EntryBox.get( "1.0" , 'end-1c' ).strip()
- エントリボックスを削除します( "0.0" , END )
- ifmsg != '' :
- ChatBox.config(状態=NORMAL)
- ChatBox.insert ( END , "あなた: " + msg+ '\n\n' )
- ChatBox.config(前景= "#446665" 、フォント=( "Verdana" 、 12 ))
- ints = predict_class(メッセージ)
- res = getResponse(ints,intents)
- ChatBox.insert ( END 、 "Bot: " + res+ '\n\n' )
- ChatBox.config(状態=無効)
- ChatBox.yview(終了)
- ルート = Tk()
- root.title( "チャットボット" )
- ルート.ジオメトリ( "400x500"
- root.resizable(幅= FALSE 、高さ= FALSE )
- #チャットウィンドウの作成
- ChatBox= Text(root, bd=0, bg= "white" ,height= "8" , width= "50" , font= "Arial" ,)
- ChatBox.config(状態=無効)
- #スクロールバーをチャットウィンドウにバインドする
- scrollbar = Scrollbar(root, command = ChatBox.yview, cursor = "heart" )
- チャットボックス[ 'yscrollcommand' ] = scrollbar.set
- #メッセージを送信するためのボタンを作成する
- SendButton = Button(root,font=( "Verdana" ,12, 'bold' ),text= "送信" , width= "12" , height=5,
- bd=0、bg= "#f9a602" 、アクティブ背景= "#3c9d9b" 、fg= "#000000" 、
- コマンド=送信)
- #メッセージを入力するボックスを作成する
- EntryBox= Text(root, bd=0, bg= "white" ,width= "29" , height= "5" , font= "Arial" )
- #EntryBox.bind( "<Return>" ,send)
- #すべてのコンポーネントを画面上に配置します
- スクロールバーを配置(x=376,y=6,高さ=386)
- チャットボックス.place(x=6,y=6,高さ=386,幅=370)
- エントリーボックス.place(x=128,y=401, 高さ=90,幅=265)
- SendButton.place(x=6,y=401, 高さ=90)
- ルート.メインループ()
チャットボットの実行 現在、2 つの個別のファイルがあります。1 つは train_chatbot.py で、最初にモデルをトレーニングするために使用されます。 - pythontrain_チャットボット.py
ぜひお試しください〜 |