GPT_TopicModel_thum1.png

2023.12.11

読了時間:15分

ChatGPTでトピックモデルを自動化したい!

古橋和宏

こんにちは!
sodaの古橋です。

皆さんChatGPT(以下、GPT)使ってますか??
最新モデル、派生モデルが更新され、モデルのスケールアップとコストダウンが同時進行することで汎用化の波が留まるところを知らない状態になっていますね。
ビジネス向けの製品でも「最新GPT搭載!」のような文字を頻繁に見るようになって来ました。

さて、今回はそんなGPTを使った当社新製品をご紹介・・ではなく、私も度々記事にしている文章解析モデルの一つ「トピックモデル」にGPTを活用してみようという記事になります。
※トピックモデルについてはこちら

具体的なやり方ですが、モデリングそのものをGPTにやってもらうのではなく、前処理、後工程で現状手動でやっている所を一部、GPTに代行して貰うという感じをイメージしています。
やったことがある方は共感して頂ける部分もあるかもしれないですが、トピックモデルを使用したモデル化は前処理等でけっこう地味な作業が付き纏いまして、もう少しシステマティックにやりたいという願望は個人的にずっとあったんですよね。

今回その願望をGPTに叶えてもらおうと思います。
実際にトピックモデルを適用する際の大まかな流れはこんな感じです。

1.文章のクリーニング、正規化
2.文章の形態素解析 -> GPTにお願い
3.ストップワード除去
4.モデリング(今回はLDAを使用)
5.トピックのラベル付け -> GPTにお願い

自分が作業する時は大体、「形態素解析→トピック確認(大体微妙な結果)→変な分かれ方の単語見つける→辞書更新して形態素解析(必要に応じて正規化方法も修正)・・・。」
みたいな感じで、アナログな確認、修正作業を何回か繰り返してなんとか結果として見せれるレベルに持って行くというようなスタイルで、あんまりスタイリッシュではないです。

そこで、作業負荷として重い2と5をGPT先生にお願いしてみようと思います。

1はURL削除みたいな定型作業はどんな文章でも行うので作業負荷はほぼゼロですが、定型以外の表記揺れや誤字の修正は毎回面倒なので2の工程でGPTに出来る限り頑張ってもらいます。
3のストップワード除去はどうせ単語指定が必要になり、GPTにやらせてもしょうがないので人力でやります。
4のモデリングはパラメータ固定で行きます(雑)。

若干手動の部分も残りますが、これで負荷が大きい部分はGPTに押し付けることが出来そうです。
余った時間で私は優雅にコーヒーブレイクと洒落込みたいと思います。

では早速、形態素解析から試してみましょう。

GPTでの形態素解析

なにはともあれ、まずはGPT先生の形態素解析の実力を見て見ないことには始まらないので、GPTに表記揺れも含んだ適当な文章を流して形態素解析してもらってみます。

入力文章

基台部分のネジ受けが外れ、使用一回目であえなくゴミとなりました。へんぴん処理を忘れていたので、勉強代だと思って諦めます。

では、結果です。

GPTでの形態素解析結果

【名詞】

基台部分、ネジ受け、使用、一回目、ゴミ、返品、処理、勉強代

【形容詞】

あえない

【動詞】

外れる、なる、忘れる、思う、諦める


!!?

これは中々に・・・衝撃的な結果です。
こちらの指示通り的確に抽出出来ていますし、「基台部分」「ネジ受け」みたいな複合系の単語もしっかり判別出来ているのが驚きです。
内容的にはほぼ完璧で、気になるのはせいぜい「返品」「処理」が複合系の「返品処理」でも良いかなーという所ぐらいですかね。
素晴らしい形態素解析力です。

続いて比較用に、よく使う形態素解析エンジン(MeCab-Neologed)での結果が下記です。

MeCab-Neologdでの形態素解析結果

【名詞】

基、台、部分、ネジ、受け、使用、一、回、目、ゴミ、返品、処理、勉強、代

【形容詞】


【動詞】

外れる、あえる、なる、忘れる、いる、思う、諦める

GPTの結果で感覚がおかしくなりそうですが、デフォルトだとこんな感じです。
複合系の単語とかは苦手で大体分割されちゃいますし、そもそも基台ってなんやねんという話でこのように分割されることはよくあります。
こうして結果を確認しながら、手動で辞書登録や語句の連結を行って再実行・・というのがお決まりの流れなのですが、GPTでそこの手間が要らなくなれば作業量的にかなり大きいです。

次はもう少し長めの文章を試してみます。
弊社HPの自然言語処理エンジンに関するサービス紹介文(こちら)です。

入力文

「BERT」を活用して自然言語処理エンジンを強化・進化させ、より高精度なテキスト分類を実現。また、データに潜む意味を統計的に解析する「トピックモデル」を活用、文章と単語の背後にある価値観や感性を推定。

GPTでの結果とMeCabでの形態素解析結果を見て見ます。

GPTでの形態素解析結果

【名詞】

BERT、活用、自然言語処理、エンジン、強化、進化、高精度、テキスト分類、実現、データ、意味、解析、トピックモデル、活用、文章、単語、背後、価値観、感性、推定

【形容詞】

統計的

【動詞】

させる、潜む、ある

MeCab-Neologdでの形態素解析結果

【名詞】

活用、自然言語処理、エンジン、強化、進化、精度、テキスト、分類、実現、データ、意味、統計、的、解析、トピック、モデル、活用、文章、単語、背後、価値観、感性、推定

【形容詞】


【動詞】

する、する、せる、潜む、する、ある

MeCabは「BERT」という固有名詞、「テキスト分類」「高精度」といった複合単語などが上手く抽出出来ていない一方で、GPTはこれまたいい感じに抽出出来ていますね。。。
うーむGPT恐るべし。

「強化させ」「進化させ」のように名詞にくっついた「する」の動詞が抽出出来ていないのが若干気がかりですが、「する」「ある」のように情報として有用じゃない単語は大体ストップワードに組み込みますので、実用上は問題無さそうです。

特段プロンプトの調整もせずにこの精度は個人的に驚異的です。
やる前はfew shotを組み込んだりEmbeddings構築したり、色々準備しないと難しいのかなーとか考えていたのですが、精度だけで見ると今の状態で色々十分な気もしてきます。
ただ、ブラウザ版で複数回試してみたところ、出力結果が全然安定しなかったりですとか、出力形式がバラバラで該当部分の抽出が難しいとかの問題は出そうだったので、実際にAPI等で大量の文章を処理する時はそのあたりも加味してプロンプトやパラメータの調整を行う必要が出てくるでしょう。
最新GPTモデルではJSONモードなる返答形式の固定化機能が実装されているようなので、そちらを使うのも良さそうですね。

形態素解析は概ね問題無さそうなので、次行ってみましょう。

ChatGPTでのトピックラベル付け

次にGPT先生にやってもらうのは、LDAで得たトピックが何を表すのかのラベル付けの作業です。
普段は人間がトピック内容を判断してラベル名を付けていますが、判断材料となる各トピックの文章や単語をGPTに渡して、よりふさわしいラベル名称を付けて貰います。

このトピックのラベル付けという工程、自由に決めていいならラベル名なんて適当でいいじゃんと思われるかもしれませんが、ここで誰もがしっくりくるようなラベル名をバシッと付けられるかどうかで見る側の納得感に雲泥の差が出てくるので、ボキャ貧の私は毎回けっこう悩む部分です・・・。

また、正規化や形態素解析はデフォルト実行での結果を採用してしまえば自動化可能と言えなくもないですが、ラベル付けは基本的に自動化が無理な部分だったので、ここの自動化はそういう意味でもインパクトが大きいです。

明確な正解もなくなかなか難しい作業ですが、GPTの懐の深さを見せて貰いましょう。

まずは簡単な文章から、リクルートのAI研究機関であるMegagon Labs様が公開している温泉宿泊施設の疑似レビューデータを使わせて頂きます。
日本語指示データ・日本語擬似レビューの公開 / Megagon Labs

LDAでモデリングを行い、私がラベル付けをした結果がこちらです。

topic_gpt_labeling_manual.png

トピック毎の特色がかなりしっかり出ているので、 私でもあまり悩まずにラベリング出来ましたが、しっくりくる名称になっているでしょうか?

続いてGPTです。
GPTにはトピック所属確率上位の文章を3つ、単語を10個渡し、アウトプットはラベル名称候補を3つ出力して貰う形にしてみました。

GPTへの入力(宿泊レビューデータのトピック0の例)

【入力文章】

・バスの本数が少なく、バス停からも遠いのですが、事前に連絡しておけば送迎サービスも受けられるので心配ありません。
・自家用車やバイク利用の方は、あらかじめホテルに連絡しておけば駐車場を無料で利用できるようです。
・とにかく観光するにあたって交通の便が良いところがよかったので、電車、バスの利用しやすいこの場所は最適でした。

【入力単語】

利用、ホテル、宿泊、家族、駅、満足、送迎、泊、子供、駐車場

上記はトピック0の文章と単語で、GPTの回答は「宿泊施設とアクセス」、「交通手段の利便性」、「旅行計画と家族向けサービス」でした。
なかなか良さそうですね。

全トピックのラベル名候補を見て見ましょう。

GPTでのトピックラベリング結果

【トピック0ラベル候補】

宿泊施設とアクセス、交通手段の利便性、旅行計画と家族向けサービス

【トピック1ラベル候補】

宿泊施設の食事体験、料理の充実度と満足度、家族向け食事サービス

【トピック2ラベル候補】

宿泊施設と温泉体験、観光地と自然の美しさ、贅沢な宿泊体験

【トピック3ラベル候補】

ホスピタリティ体験、宿泊満足度、早めの到着への柔軟な対応

【トピック4ラベル候補】

ロケーション満足度、周辺施設と便利性、交通状況への影響

【トピック5ラベル候補】

宿泊体験、ホテルの内装とリラックス、和モダンな客室

全体的に良い感じには見えるんですが、以下の点が気になります。
・ラベル名が冗長な部分がある
・入力した文章に引っ張られすぎているラベル名がある

前者は「宿泊施設とアクセス」「宿泊施設の食事体験」等、そもそも文章が宿泊施設に関するレビューなので、主語の部分は正直要らないです。
今回は文章が簡単でトピックがカッチリと分かれているのでそれっぽい結果になっていますが、もっとごちゃごちゃした文章だと全部のトピックが「宿泊施設に関する評判」みたいなラベル名称になってしまいそうな懸念があります。

後者は「早めの到着への柔軟な対応」「和モダンな客室」等、トピック内でも一部の文章にしか当てはまらないものが、たまたま入力文に複数あったため、ラベル名候補として出現してしまいました。単純にトピック名称としてあまりふさわしくないでしょう。

検証のため、毎度おなじみ鬼滅レビューデータを用いて同様のラベリングをしてみました。
まずは私のラベル付け結果がこちら。

topic_gpt_manual_labeling.png

続いてGPTにラベル付けして貰った結果がこちらです。

鬼滅映画 GPTでのトピックラベリング結果

【トピック0ラベル候補】

映画「鬼滅の刃」への感想、期待と評価のギャップ、作品の忠実性と映画化への期待

【トピック1ラベル候補】

映画「鬼滅の刃」に対する評価と感想、アニメと映画の連携と期待感、エンディングや音楽に対する評価

【トピック2ラベル候補】

鬼滅の刃の哲学とキャラクターの心情、善と悪、生きづらい現実世界の描写、煉獄さんの生き様と戦いへの感動

【トピック3ラベル候補】

感動的な映画体験、キャラクターの迫力と成長、原作へのリスペクトと映画の再現度

【トピック4ラベル候補】

カタルシスと物語の奥深さ、キャラクターの魅力と戦闘シーンの迫力、物語の構造と感情移入

要らない主語と、入力文章に引っ張られすぎるという、懸念した内容そのままの結果が出ました。
このままでは私のコーヒーブレイクタイムが獲得出来なさそうなので、対策を考えます。
単語だけを入力する、渡す文章の数を多くするなど色々試したのですが、最終的には下記で実行しました。

1.プロンプトにそもそも元データが何なのかの説明を加える
2.元文章を「。」等で区切った短い文章にする(代わりに入力文章数、単語数を少し増やす)
3.GPTへの入力文章の内容をバラけさせる

1で「元文章は鬼滅の刃の映画レビューだよ」と事前に教えることで、各トピックのラベル名が「鬼滅の刃の映画レビュー」のようになってしまうことを防ぐ狙いです。
2は正直あまりやりたくなかったのですが、そもそも元の文章が長いとどうしても文章内容に引っ張られすぎるor包括的なラベル名称を返してくる事が多かったので、致し方なく。。。
これをやると元文章との関係性が1:1でなくなり、トピック0の所属人数が〇〇人でしたみたいな集計がしたい時に出来なくなるのがネックですが、今回はまず質の良いトピックとラベル名称を得られるかどうかの確認が第一なので、文章分割を実施しました。
3は入力文により偏った内容にならないための処置です。同じような文章が渡されてもラベル付けの情報として有用ではないので、トピックへの所属率が高い15文書を抜粋後、各文章ベクトルで類似度計算を行い、値が低くなりそうな5文書を選定するという流れで構築しました。

1でほんの少し手動での入力調整が出ますが、まだギリ許容範囲内でしょう。

では、修正したやり方で鬼滅データに対して形態素解析→ラベル付けまでGPTにやってもらった最終結果がこちらです!

topic_gpt_wakachi_kimetsu_gpt.png

鬼滅映画 GPTでのトピックラベリング結果(改)

【トピック0ラベル候補】

キャラクターの成長と苦悩、時代背景と物語のオリジナリティ、感謝とポジティブなメッセージ

【トピック1ラベル候補】

映画製作過程、映画評価、原作ファンの反応

【トピック2ラベル候補】

映像美、作画クオリティ、声優演技

【トピック3ラベル候補】

映像表現、感動エンターテイメント、キャラクター描写

【トピック4ラベル候補】

鬼滅の刃の映画の評価、アニメと映画の比較、鬼滅の刃のファン層

トピック分類自体は元々と同じような分かれ方で、形態素解析をGPTにお願いしたことにより新しい単語も幾つか拾い上げることが出来ていて、かなりいい感じに見えます!

ラベリングの方は・・うーんどうなんでしょう。
トピック0なんかはそれこそ「作品テーマ」のようなもう少し抽象度を上げたラベル名が個人的には欲しい所ですが、具体的なものを幾つか列挙して貰うという方がGPTの使い方的には合っている気もします。
プロンプトに入力された文だけでなくトピックに所属する文章全体にある程度当てはまるのであれば、これはこれでトピックの内容把握がしやすいので良しとしておきましょう。
(見たところ、そこそこは当てはまっていました)
トピック4は「鬼滅の刃の」とかは要らないですが、内容的に本当に「鬼滅の刃の映画の評価」としか付けようがない感じなので、致し方ない部分もあります。

手放しで賞賛出来るほどではないですが、そこそこいい感じぐらいのラベリング内容でしょうか。

検証にはそれなりに時間を要しましたが、ラベリング時のプロンプトで何の文章データかを教えるところ以外は他の文章データでもある程度の流用が効くはずなので、ほぼ自動でこのクオリティのトピックモデリングが出来るというのは、個人的になかなか良いのではないかと思います。

まだまだ改善の余地はあるかもしれないですが、終わりが見えなくなりそうなので今回の実験は一旦ここまでにしたいと思います。

まとめ

ChatGPTを利用したトピックモデルの自動化実験でした!
寸評としては
・形態素解析は高精度で工数の大幅削減が出来そう
・トピックのラベリングは可能性は感じるがまだまだ改善の余地あり

ラベリングの改善は本当に、感覚的にいい感じかどうかだけなので、システムプロンプトの調整だけでこれ以上改善出来るイメージが正直なところ湧かなかったです。。。
ただ、上述したEmbeddings等、GPTの機能でまだ試していないものは沢山ありそうなので、また色々試して改善が上手く行った暁にはブログ等でご紹介したいと思います。

ちなみに書いていませんでしたが、GPTはバージョン3.5を使用しました。
GPT4.0だとラベリング作業のような感覚的な部分がより優れている可能性もあるので、もう少し気軽に検証出来る値段になったら試してみたいなと思います(笑)。

ではでは!

RELATED POST

2403_text_embeds_thum.webp
  • Tech Blog
  • 技術説明

2024.03.13

おい、AI! おすすめの筋力トレーニングはあるのかい? ~テキスト潜在変数を利用したレコメンド~

お久しぶりです!!sodaエンジニアの國田です。 突然ですが、皆さま、最近運動していますか?私たちのようなプログラマーエンジニア職は運動不足になりがちですので、毎日しっかりトレーニングをする必要があります。私の方はどうかと言われますと、週5でジムに通い、己の筋肉の研鑽に励んでいます。(今まで秘密にし...

GAN_thum14.png
  • Tech Blog
  • 技術説明

2023.11.17

Stable Diffusionでミロのヴィーナスを復元してみる

お久しぶりです!sodaエンジニアの國田です! 「ミロのヴィーナス」って不思議ですよね?両腕の無い像で、現在に至るまで、多くの芸術家や科学者が欠けた部分を補った姿を推定していますが、現在のところ、定説と呼べるようなものはありません。「どのようなポーズをとっていたのか?」想像は多岐に及びますが、これに...

SentimentSLDA_thum1.png
  • Tech Blog
  • 技術説明

2023.09.25

感情分析とSLDAで文章から感情係数付きトピックを抽出してみる

こんにちは! sodaの古橋です。 ブログ投稿の間隔が結構空いてしまいまして、気付けば世間では阪神タイガースが18年ぶりとなるリーグ優勝を決めていました。 久々の優勝ということで大いに盛り上がっていますが、我が敬愛する中日ドラゴンズは2年連続の最下位争いを繰り広げているという状態で、私は...