早く来なさい!最初の Python チャットボット プロジェクトの構築

早く来なさい!最初の Python チャットボット プロジェクトの構築

Python を使用すると、お客様専用のチャットボット プログラムの構築など、さまざまな目標を達成できます。

[[316320]]

チャットボット プログラムは個人のニーズを満たすだけでなく、ビジネス組織や顧客にとっても非常に役立ちます。ほとんどの人は、ヘルプセンターに電話するよりも、チャットルームで直接話すことを好みます。

Facebook が公開したデータはロボットの価値を証明しています。毎月、個人と企業の間で20億件を超えるメッセージが送信されます。 HubSpot の調査によると、71% の人がメッセージング アプリから顧客サポートを受けたいと考えています。これは問題を迅速に解決する方法であるため、チャットボットは組織において明るい未来を持っています。

今日は、チャットボットに関するエキサイティングなプロジェクトを構築します。ユーザーが話していることを理解し、適切な応答を返すことができるチャットボットをゼロから作成します。

前提条件

チャットボットを実装するには、ディープラーニングライブラリの Keras、自然言語処理ツールキットの NLTK、およびいくつかの便利なライブラリを使用します。すべてのライブラリがインストールされていることを確認するには、次のコマンドを実行します。

  1. 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 データ ファイルを読み取ります。

  1. numpyをnpとしてインポートする
  2. fromkeras.models から importSequential
  3. keras.layers から importDense、Activation、Dropout
  4. fromkeras.optimizers から SGD をインポートする
  5. インポートランダム
  6. インポートnltk
  7. fromnltk.stem インポートWordNetLemmatizer
  8. レマタイザー = WordNetLemmatizer()
  9. インポートjson
  10. インポートピクル
  11. intents_file = open ( 'intents.json' ). read ()
  12. インテント = json.loads(intents_file)

ステップ2: データの前処理

モデルは元のデータを取得できません。機械が理解しやすいようにするためには、多くの前処理を行わなければなりません。テキスト データにはさまざまな前処理手法が利用できます。最初の手法は、文を単語に分割するトークン化です。

インテント ファイルを見ると、各タグにモードと応答のリストが含まれていることがわかります。各パターンにマークを付け、単語をリストに追加します。さらに、パターンに関連するすべてのインテントを追加するためのクラスとドキュメントのリストを作成します。

  1. 単語=[]
  2. クラス=[]
  3. ドキュメント = []
  4. ignore_letters = [ '!' '?' ',' '.' ]
  5. intents[ 'intents' ]内のforintent :
  6. forpattern in intent[ 'patterns' ]:
  7. #各単語をトークン化する
  8. 単語 = nltk.word_tokenize(パターン)
  9. words.extend(単語)
  10. #コーパス文書を追加する
  11. documents.append((単語, インテント[ 'タグ' ]))
  12. 追加 クラスリスト
  13. ifintent[ 'tag' ] がクラス内にありません:
  14. クラス.append(インテント[ 'タグ' ])
  15. 印刷(ドキュメント)

もう一つの手法は、見出し語化です。すべての標準語を簡約できるように、単語をレマ形式に変換できます。たとえば、play、playing、playing、played などの単語はすべて play に置き換えられます。このようにして、語彙の総語数を減らすことができます。したがって、各単語に対して補題を実行し、重複する単語を削除します。

  1. # レマズタイズし 各単語を下げて重複を削除する
  2. words = [lemmatizer.lemmatize( w.lower ()) forw単語if w notinignore_letters]
  3. 単語 = sorted(リスト(セット(単語)))
  4. # ソートクラス
  5. クラス = sorted(リスト(セット(クラス)))
  6. # ドキュメント = パターンインテントの組み合わせ
  7. print(len(ドキュメント)、 "ドキュメント" )
  8. # クラス = インテント
  9. print(len(classes), "classes" , classes)
  10. # 単語 =すべての単語、語彙
  11. print(len(words), "一意のレマタイ化された単語" , words)
  12. pickle.dump(単語、 open ( 'words.pkl' 'wb' ))
  13. pickle.dump(classes, open ( 'classes.pkl' , 'wb' ))

最後に、 words にはプロジェクトの語彙が含まれ、 classes には分類されるすべてのエンティティが含まれます。 Python オブジェクトをファイルに保存するには、pickle.dump() メソッドを使用します。これらのファイルは、トレーニングが完了するとチャットを予測するのに役立ちます。

ステップ3: トレーニングセットとテストセットを作成する

モデルをトレーニングするために、各入力パターンは数値に変換されます。まず、パターン内の各単語を補題化し、単語の総数と同じ長さのゼロのリストを作成します。パターン内の単語を含むインデックスにのみ値 1 を設定します。同様に、パターンが属するクラス入力に 1 を設定して出力を作成します。

  1. #トレーニングデータを作成する
  2. トレーニング=[]
  3. #出力用のの配列を作成する 
  4. output_empty = [0] * len(クラス)
  5. # トレーニングセット各文単語集まり
  6. ドキュメント内のfordoc :
  7. #単語袋を初期化しています
  8. バッグ=[]
  9. #パターントークン化された単語リスト
  10. 単語パターン = doc[0]
  11. # 各単語をレマタイ化 -関連する単語を表すためベースワードを作成する
  12. word_patterns = [lemmatizer.lemmatize( word.lower ())で word_patterns内のword検索]
  13. #単語見つかった場合は1で単語バッグ配列を作成します 現在のパターン
  14. 序文言葉
  15. bag.append(1) 単語が word_patterns 内にある場合、そうでない場合はbag.append(0)
  16. #出力  ' 0'です 各タグごと  '1' 現在のタグ(パターン)
  17. 出力行 = リスト(出力空)
  18. output_row[クラス.インデックス(doc[1])] = 1
  19. トレーニング.append([バッグ、出力行])
  20. # 特徴量をシャッフルしnumpyarrayを作成する
  21. ランダムシャッフル(トレーニング)
  22. トレーニング = np.array(トレーニング)
  23. #トレーニングテストのリストを作成します。X-パターン、Y-インテント
  24. train_x = リスト(トレーニング[:,0])
  25. train_y = リスト(トレーニング[:,1])
  26. print( "トレーニングデータが作成されました" )

ステップ4: モデルのトレーニング

モデルは 3 つの密な層で構成されるニューラル ネットワークになります。最初の層には 128 個のニューロンがあり、2 番目の層には 64 個のニューロンがあり、最後の層にはクラスの数と同じ数のニューロンがあります。モデルの過剰適合を減らすために、ドロップアウト レイヤーが導入されました。 SGD オプティマイザーを使用してデータを適合させ、モデルのトレーニングを開始します。 200 エポックのトレーニングが完了したら、Kerasmodel.save("chatbot_model.h5") 関数を使用してトレーニング済みのモデルを保存します。

  1. # ディープニューラルネットワークモデル
  2. モデル = シーケンシャル()
  3. モデルを追加します(Dense(128,input_shape=(len(train_x[0]),), activation= 'relu' ))
  4. model.add(ドロップアウト(0.5))
  5. model.add (Dense(64,アクティベーション= 'relu' ))
  6. model.add(ドロップアウト(0.5))
  7. モデルを追加します(Dense(len(train_y[0]), activation= 'softmax' ))
  8. # モデルのコンパイル。Nesterovaccelerated gradientを使用したSGD は、このモデルに対して良好な結果をもたらします。
  9. sgd = SGD(lr=0.01、減衰=1e-6、運動量=0.9、nesterov= True )
  10. model.compile(損失= 'categorical_crossentropy' 、オプティマイザー=sgd、メトリック=[ 'accuracy' ])
  11. #モデルのトレーニング保存
  12. hist = model.fit(np.array(train_x), np.array(train_y), エポック=200, バッチサイズ=5, 詳細=1)
  13. モデルを保存します( 'chatbot_model.h5' , 履歴)
  14. print( "モデルが作成されました" )

ステップ5: チャットボットと対話する

モデルがチャットの準備ができたので、新しいファイルにチャットボット用の優れたグラフィカル ユーザー インターフェイスを作成しましょう。ファイル名はgui_chatbot.pyとします。

GUI ファイルでは、Tkinter モジュールを使用してデスクトップ アプリケーションの構造を構築し、ユーザー メッセージをキャプチャして、再度前処理を実行してから、それらをトレーニング モデルに入力します。

次に、モデルはユーザーのメッセージのラベルを予測し、インテント ファイル内の応答リストから応答をランダムに選択します。

GUI ファイルの完全なソース コードは次のとおりです。

  1. インポートnltk
  2. fromnltk.stem インポートWordNetLemmatizer
  3. レマタイザー = WordNetLemmatizer()
  4. インポートピクル
  5. numpyをnpとしてインポートする
  6. keras.models から load_model をインポートする
  7. モデル = load_model( 'chatbot_model.h5' )
  8. インポートjson
  9. インポートランダム
  10. インテント = json.loads( open ( 'intents.json' ) .read ())
  11. words = pickle.load ( open ( 'words.pkl' 'rb' ))を実行します。
  12. クラス = pickle.load (開く( 'classes.pkl' 'rb' ))
  13. defclean_up_sentence(文):
  14. # パターンをトークン化 - 単語を配列分割
  15. sentence_words = nltk.word_tokenize(文)
  16. # すべての単語の語幹を抽出 - 基本形に縮小
  17. sentence_words = [lemmatizer.lemmatize( word.lower ())文中単語に対して]
  18. 戻り値: 文の単語
  19. # 単語の配列バッグを返す:文中存在する単語の場合は0または1
  20. defbag_of_words(文、単語、show_details= True ):
  21. # トークン化パターン
  22. sentence_words = clean_up_sentence(文)
  23. # 言葉- 語彙マトリックス
  24. バッグ = [0]*len(単語数)
  25. sentence_words内のfors:
  26. fori,word inenumerate(単語):
  27. ifword == s:
  28. #現在の単語 語彙位置
  29. バッグ[i] = 1
  30. 詳細を表示:
  31. print( "バッグ内に見つかりました:%s" % 単語)
  32. 戻り値(np.array(bag))
  33. defpredict_class(文):
  34. # しきい値以下の予測をフィルタリング
  35. p = bag_of_words(文、単語、詳細表示= False )
  36. res = model.predict(np.array([p]))[0]
  37. ERROR_THRESHOLD = 0.25
  38. 結果 = [[i,r] fori,r inenumerate(res) ifr>ERROR_THRESHOLD]
  39. # ソート強度確率
  40. results.sort(キー=lambdax: x[1], 逆順= True )
  41. 戻り値リスト = []
  42. 結果forr:
  43. return_list.append({ "意図" : クラス[r[0]], "確率" : str(r[1])})
  44. 戻る戻りリスト
  45. def getResponse(ints, intents_json):
  46. タグ = ints[0][ '意図' ]
  47. list_of_intents = intents_json[ 'インテント' ]
  48. list_of_intents内のfori :
  49. if(i[ 'タグ' ] == タグ):
  50. 結果 = random.choice(i[ 'responses' ])
  51. 壊す
  52. 結果を返す
  53. #tkinter GUIの作成
  54. インポートtkinter
  55. tkinter からのインポート *
  56. defsend():
  57. msg = EntryBox.get( "1.0" , 'end-1c' ).strip()
  58. エントリボックスを削除します( "0.0" , END )
  59. ifmsg != '' :
  60. ChatBox.config(状態=NORMAL)
  61. ChatBox.insert ( END , "あなた: " + msg+ '\n\n' )
  62. ChatBox.config(前景= "#446665" 、フォント=( "Verdana" 、 12 ))
  63. ints = predict_class(メッセージ)
  64. res = getResponse(ints,intents)
  65. ChatBox.insert ( END "Bot: " + res+ '\n\n' )
  66. ChatBox.config(状態=無効)
  67. ChatBox.yview(終了)
  68. ルート = Tk()
  69. root.title( "チャットボット" )
  70. ルート.ジオメトリ( "400x500"  
  71. root.resizable(幅= FALSE 、高さ= FALSE )
  72. #チャットウィンドウの作成
  73. ChatBox= Text(root, bd=0, bg= "white" ,height= "8" , width= "50" , font= "Arial" ,)
  74. ChatBox.config(状態=無効)
  75. #スクロールバーをチャットウィンドウバインドする
  76. scrollbar = Scrollbar(root, command = ChatBox.yview, cursor = "heart" )
  77. チャットボックス[ 'yscrollcommand' ] = scrollbar.set  
  78. #メッセージを送信するためのボタンを作成する
  79. SendButton = Button(root,font=( "Verdana" ,12, 'bold' ),text= "送信" , width= "12" , height=5,
  80. bd=0、bg= "#f9a602" 、アクティブ背景= "#3c9d9b" 、fg= "#000000"
  81. コマンド=送信)
  82. #メッセージを入力するボックス作成する
  83. EntryBox= Text(root, bd=0, bg= "white" ,width= "29" , height= "5" , font= "Arial" )
  84. #EntryBox.bind( "<Return>" ,send)
  85. #すべてのコンポーネントを画面上に配置します
  86. スクロールバーを配置(x=376,y=6,高さ=386)
  87. チャットボックス.place(x=6,y=6,高さ=386,幅=370)
  88. エントリーボックス.place(x=128,y=401, 高さ=90,幅=265)
  89. SendButton.place(x=6,y=401, 高さ=90)
  90. ルート.メインループ()

チャットボットの実行

現在、2 つの個別のファイルがあります。1 つは train_chatbot.py で、最初にモデルをトレーニングするために使用されます。

  1. pythontrain_チャットボット.py

ぜひお試しください〜

<<:  AI体温測定:仕事再開の波の中で構築された最初の防疫「障壁」

>>:  IoTとAIを活用して価値を加速させる4つの効果的な方法

ブログ    
ブログ    

推薦する

リスト管理?機械学習のためのデータセット

[[440033]]データが機械学習において重要な役割を果たすことは否定できません。各機械学習モデル...

...

...

自動運転に関する期限の問題

少し前に、自称メディアスターの板狐仙人が「自動運転のいくつかの期限問題」を発表し、将来の自動運転の実...

...

RoSA: 大規模モデルパラメータを効率的に微調整する新しい方法

言語モデルが前例のない規模にまで拡大し続けるにつれて、下流のタスクのすべてのパラメータを微調整するこ...

人工知能に関するよくある誤解

ビッグデータ、自動化、ニューラルネットワークが日常語となっている世界では、人工知能とその背後にあるプ...

...

電流制限アルゴリズムを理解すれば十分です。

TL;DR (長すぎるので読まないでください)現在の制限アルゴリズム: カウンター、スライディング...

ディープラーニングの概要: パーセプトロンからディープネットワークまで

近年、人工知能の分野は再び活発化しており、伝統的な学術界に加え、Google、Microsoft、F...

...

ビッグニュース!アリママが自社開発のCTR推定コアアルゴリズムMLRを初公開

1. 技術的背景CTR(Click-Through-Rate)とは、クリック率のことで、インターネッ...

315 顔認識は安全性が疑問視されており、新たな潜在的な脅威となる可能性があるのでしょうか?

先週、「Facezam」と呼ばれる偽のアプリがFacebookの写真をスキャンして人々の顔を追跡でき...

...

スタンフォード大学の64歳の学長が辞任!学術不正スキャンダルが勃発、95ページの調査報告書が公表

今日、衝撃的なニュースが突然飛び込んできました。スタンフォード大学のマーク・テシエ・ラヴィーンの学長...