DUICUO

ChatGPT開発の実践 - ホテルレビュー感情分析

翻訳者 |朱賢宗

校正:孫淑娟

OpenAI の新しいチャットボット GPT は素晴らしいです!

私は人工知能技術を日々活用している研究者です。私と同じ立場の人は皆、アイスクリームコーンに目が留まる犬のように興奮していると言ってもいいでしょう。

理由は次のとおりです。

何を言っているのかわからない方のために、ChatGPTはAIチャットボットで、ほぼ何でも手伝ってくれるということを知っておいてください。コーディング、記事執筆、家のデコレーション、さらにはレシピ作成(イタリア語を話す方にはおすすめしません)など、他にも様々なことができます。

これは将来、倫理的な問題(倫理的な問題だけにとどまらない)を引き起こすと言えるでしょう。高校教師である私の母は、生徒たちがChatGPTを使って試験でカンニングをするのではないかと恐れています。もちろん、これはこの強力なテクノロジーがいかに「問題を引き起こす」かを示す、数ある例の一つに過ぎません。

しかし、問題は製品そのものではなく、使い方です。技術的な側面だけを議論するのは無理があります(正直なところ、私は「認定」オタクなので、そちらの方が興味があります)。

多くの開発者が既にこのチャットボットを使用し、コードやAIのアイデアを実験しています。もちろん、このチャットボットの活用は開発者の経験に大きく依存します。例えば、Web開発者であれば、ChatGPTにHTMLを使ったWebサイトの構築を依頼できます。テスターであれば、特定のシステムのバグを見つけるためにChatGPTに依頼できます。

私は研究者です。具体的には、人工知能を用いた代替モデルの構築に携わっています。例えば、「A」という課題を研究したいけれど、「A」という課題を達成するには、膨大な資金、人員、そして計算時間が必要になるとします。こうした代替モデルの根底にある考え方は、従来の実装手法に代わる、人工知能を活用したデータ駆動型の手法を用いることです。

さて、少し話題を変えましょう。

例えば、私がアメリカ全土に多くのホテルを所有する起業家だとしましょう。特定のホテルのレビューを書くとして、そのレビューがそのホテルにとって肯定的なものか否定的なものかを知りたい場合、どうすればよいでしょうか?3つの選択肢があります。

1. 毎日何百万ものコメントを読んで分類するために誰かを雇ったら、それは明らかに人権侵害となるので逮捕されるかもしれません。

2. 毎日何百ものコメントを読んで分類してくれる人を雇いました。数か月後、この情報を使ってデータセットを構築することができました。そして、このデータセットを使って機械学習モデルを訓練しました。

3. 良いレビューと悪いレビューを自動生成します。そして、そこから自分でデータセットを構築し、最後にそのデータセットを使って機械学習モデルをトレーニングします。

雑談はもう十分です。最初のオプションはスキップしましょう。

2つ目の選択肢は、ChatGPTが作成される前に行うべきものです。当然のことながら、コメントが良いか悪いかを事前に知ることはできません。そのため、この情報を用いてデータセットを構築する場合は、人材を雇用し、データセットが準備できるまで行動を起こすのを待つ必要があります。

ChatGPTを使えば、良いレビューと悪いレビューを自動生成してくれるようになりました! 数分で完了(数ヶ月もかかりません)し、顧客レビューを自動分類する機械学習アルゴリズムを構築できるようになります!

おめでとうございます。これが最初のプロキシ モデルです。

ChatGPTの学習や微調整は行いませんのでご了承ください。このモデルは、このような微調整が不要なタスクの例外です。現在、ChatGPTモデルの学習は(モデル自体と同様に)オープンソースではありません。OpenAI公式ブログに掲載されている簡単な説明のみで、モデルはAIトレーナーと強化学習の教師ありアルゴリズムによって学習されていると説明されています。

OpenAIのChatGPTがオープンソースではないという事実自体が、非常に厄介で興味深い倫理的問題を提起しています。これほど強力なモデルは、誰もが(悪意のある人物も含めて)利用できるようにオープンソースにするべきでしょうか?それとも、誰も真に信頼できないようにオープンソースにすべきではないでしょうか?

さて、上記の全体的な手順を要約します。

上の画像に写っている小さな頭がサロゲートモデルです。後ほど説明しますが、これはランダムフォレストです。しかし、前にも言ったように、これは実践的な記事なので、早速始めましょう!(ワクワクしますね!!!)

すみません、ネタバレが好きなんです。

I. データセットの生成

最初のステップは、OpenAI の Python API を使用してシミュレーションを生成することです。

したがって、いくつかの点を考慮する必要があります。

1. OpenAIライブラリは、天才によって、そうでないユーザーのために作られました。そのため、インストールするには、次の手順に従います。

 pipインストール--upgrade openai

2. もちろん、大量のリクエストを送信したい場合は、プレミアムサービスに料金を支払う必要があります。そうしない場合は、仮想コメント情報のデータセットを取得するために約30分待つだけで済みます。同様に、手動で行う場合も、数ヶ月待つ時間(とコスト)と比べれば無視できるほどです。さらに、OpenAIの公式サイトにログインして、OpenAIライブラリに対応するキーを取得する必要があります。

3. 良いレビューか悪いレビューかを自動的に入力し、同じ文章で始まります。悪いレビューの場合は「このホテルはひどかった」、良いレビューの場合は「このホテルは素晴らしかった」です。つまり、ChatGPTがレビューを作成してくれるのです。もちろん、最初の4語(そもそもレビューには含まれません)を除いて、残りのレビューはそれぞれ異なります。

否定的なレビューの例を挙げてみましょう。

 Openaiをインポート
インポート時間
openai.api_key = "あなたのキー"

完了= openai .完了. create ( engine = "davinci"prompt = "このホテルはひどかった。"max_tokens = 120 )
print (補完.選択肢[ 0 ][ 'テキスト' ])

次に、肯定的なレビューの別の例を挙げます。

完了= openai .完了. create ( engine = "davinci"prompt = "このホテルは素晴らしかったです。"max_tokens = 120 )
print (補完.選択肢[ 0 ][ 'テキスト' ])

ここで、データセット全体を生成するために必要なコードを紹介します。

良いレビュー= []
悪いレビュー= []
i範囲( 0 , 500 )場合:
完了= openai .完了. create ( engine = "davinci"prompt = "このホテルは素晴らしかったです。"max_tokens = 120 )
good_reviews.append (補完.選択肢[ 0 ][ 'テキスト' ])
print ( '良いレビュー番号 %i を生成しています' % ( i ))
完了= openai .完了. create ( engine = "davinci"prompt = "このホテルはひどかった。"max_tokens = 120 )
bad_reviews . append (補完.選択肢[ 0 ][ 'テキスト' ])
print ( '悪いレビュー番号 %i を生成しています' % ( i ))
表示= np .ランダム.選択([ 0 , 1 ], p = [ 0.7 , 0.3 ])
時間.睡眠( 3 )
display == 1 の場合:
display_good = np .ランダム.選択([ 0 , 1 ], p = [ 0.5 , 0.5 ])
display_good == 1 の場合:
print ( 'ランダムに良いレビューを印刷しています' )
印刷( good_reviews [-1 ] )
display_good == 0 の場合:
print ( 'ランダムに悪いレビューを印刷しています' )
印刷( bad_reviews [ -1 ] )

次に、Pandas ライブラリを使用してすべてをDataFrameに保存します

したがって、最初のステップは、ライブラリをインポートし、データ フレームワーク df をビルドすることです。

 pandasをpdとしてインポートする
numpyをnpとしてインポートする
df = pd.DataFrame ( np.zeros ( (1000,2 ) ) )

次に、データ フレーム構造 (df) を入力します。

 df . columns = [ 'レビュー' , '感情' ]
df [ '感情' ] .loc [ 0 : 499 ] = 1

最後に、データフレーム (df) をエクスポートします。

 df . to_csv ( 'generated_reviews.csv' )

II. 機械学習を始める

ここで、機械学習アルゴリズムを構築してトレーニングする必要があります。

テキストを処理する際、まず最初に必要なのはベクトライザーを使うことです。ベクトライザーはテキストをベクトルに変換する役割を担います。

例えば:

ご覧の通り、類似したテキストは類似したベクトルに対応しています(「類似」というのは難しい概念ですが、要点は理解していただけると思います)。さらに、異なるテキストは異なるベクトルを持ちます。

ベクトル化のステップには様々な方法があります。方法によって複雑なものもあれば、効率の良いものもあれば、機械学習を必要とするものもあれば、そうでないものもあります。

このプロジェクトの目的を達成するために (私は NLP 機械学習エンジニアではないため)、 SkLearn フレームワークすぐに利用できるTfIDF ベクトライザーと呼ばれる非常にシンプルなツールを使用します。

まずライブラリをインポートすることから始めましょう:

 pandasをpdとしてインポートする
numpyをnpとしてインポートする
matplotlib .pyplotpltとしてインポートします
sklearn.ensembleからRandomForestClassifierインポートする
sklearn.model_selectionからtrain_test_splitインポートする
sklearn.metricsからconfusion_matrixplot_confusion_matrixをインポートします
sklearn.feature_extraction.textからTfidfVectorizerインポートする

次に、ChatGPT を使用して生成したデータセットをインポートし、前処理を実行します。

ラベル付きデータ= pd . read_csv ( 'generated_reviews.csv' ) . drop ( columns = [ '名前なし: 0' ])
ラベル付きデータ.感情=ラベル付きデータ.感情.astype ( int )
ラベル付きデータ=ラベル付きデータ. dropna () . reset_index ()

データセットの先頭のデータは次のとおりです。

素晴らしい!では、ベクトル化してみましょう。

データセット=ラベル付きデータ

トランスフォーマーからAutoTokenizerをインポート

#tokenizer = AutoTokenizer . from_pretrained ( "bert-base-uncased" )
#tokenized_data = tokenizer (データセット[ "レビュー" ] .values ​​.tolist (), return_tensors = "np" , padding = True )
ベクターライザー= TfidfVectorizer ( max_features = 2500min_df = 7max_df = 0.8 )
tokenized_data = vectorizer . fit_transform (データセット[ 'レビュー' ] ). toarray ( )

labels = np . array ( dataset [ "Sentiment" ]) #ラベルすでに01配列です

先ほども述べたように、今回使用する機械学習モデルはランダムフォレストと呼ばれます。ランダムフォレストとは何でしょうか?簡単に言うと、決定木の集合体です。では、決定木とは何でしょうか?

決定木は、特定の理論的条件が与えられた場合に、データセットの特徴のすべての可能な分割の検索を最適化し、その分割に基づいて 1 と 0 を区別する方法が見つかるまで実行する機械学習アルゴリズムの一種です。

この説明がまだかなり分かりにくい点があることをお詫び申し上げます。しかし、たった4行で簡潔に説明するのは本当に大変なことです。この問題について、かなりの時間をかけて非常に分かりやすく解説している記事がありますので、ぜひご覧ください。

さて、仕事に戻りましょう。

1. ランダムフォレストを定義します。

 rf =ランダムフォレスト分類器( n_estimators = 100 )

2. データセットをトレーニングとテストの 2 つの部分に分割します。

 X =トークン化されたデータ
y =ラベル
X_trainX_testy_trainy_test = train_test_split ( Xytest_size = 0.2 )

3. モデルのトレーニングを開始します。

 rf . fit ( X_train , y_train )

特にハイパーパラメータの微調整を行わなくても、トレーニング出力は非常に印象的です。

III. 感情分析

これで学習済みモデルが完成したので、ラベル付けされていない新しいデータセットで使用できます。このため、オンラインで見つけたニューヨーク市のホテルのレビューセットを使ってテストしました。もちろん、ご自身のレビューを使ったり、自分でレビューを書いてモデルの動作を確認することもできます。

この記事で提供するデータセットはオープンソース (CC0 ライセンス) で、非常に小さく (2 MB)、 Kaggleからダウンロードできます

それでは、コメント セクション (またはテキスト) を前処理してみましょう。

ベクターライザー= TfidfVectorizer ( max_features = 2500min_df = 7max_df = 0.8 )
ベクター化ツール.fit (データセット[ 'レビュー' ])
new_data_processed = vectorizer.transform ( target_data [ 'review' ]). toarray ()
y_pred = rf . predict (新しく処理されたデータ)

次に、予測結果を出力します。

 J = np .ランダム.選択(範囲( 0 , len (新しく処理されたデータ)), 5 )
J内のjについて:
print ( 'レビュー番号 %i:\n' % ( j ))
print ( target_data [ 'review' ]. loc [ j ])
print ( '%i に分類されました (1=良好、0=不良)' % ( y_pred [ j ]))

ご覧のとおり、上記の 1 に分類されたランダムなコメント 5 件は、すべて実際には非常に優れています。

ここで、上記のデータの統計的なカウント結果を示す、より直感的な図を示しましょう。

IV. その他の問題

この記事では具体的にどのような作業を行ったのでしょうか?

まず第一に、ChatGPT は素晴らしいと断言できます。

次に、ChatGPTを使用してプロキシモデルのデータセットを構築しました。具体的には、ホテルの肯定的なレビューと否定的なレビューのデータを構築するためにChatGPTを使用しました。

次に、構築したラベル付きデータセットを用いて機械学習モデルを学習します。この記事の例では、ランダムフォレスト分類器モデルを使用します。

最後に、トレーニング済みのモデルを新しいデータセットでテストし、満足のいく結果が得られました。

では、上記のケースには改善の余地があるのでしょうか?もちろん、他にも改善の余地はたくさんあります。例えば、

1. OpenAI プレミアム サービスにアクセスし、1000 件を超えるコメントを生成できます。

2. さまざまな入力を提供し、場合によっては英語以外の言語を使用することで、クエリ スキルを向上させることができます。

3. ハイパーパラメータを調整することで、機械学習モデルをさらに改善できます。

さて、私は次のような疑問について考えずにはいられません。

OpenAIのChatGPTがどのように、そして誰が利用するのかについては、当然ながら多くの懸念があります。私は弁護士ではありませんし、ましてやAI倫理の専門家でもありませんが、このツールが様々な意味で、様々なレベルでどれほど危険になり得るかは想像に難くありません。

ChatGPTのパフォーマンスに感銘を受けていないという意見には強く反対します。ChatGPTは本当に素晴らしい技術であり、この技術がどのように進化していくのか楽しみです。しかしながら、この記事で紹介したおもちゃの例が読者の皆様にも共感していただければ幸いです。

翻訳者紹介

Zhu Xianzong 氏は、51CTO コミュニティ エディター、51CTO 専門ブロガー兼講師、維坊の大学のコンピューター教師、そしてフリー プログラミング コミュニティのベテランです。

原題:人工知能と Open AI の ChatGPT を用いたホテルレビューの実践的な感情分析 (Python 付き) ; 著者: Piero Paialunga