BigQuery の AI で口コミを理由別に数える進め方|分類の基準を書き、答えの分かる50件で2回試してから全件へ
口コミやアンケートの自由記述を BigQuery の AI 関数で理由別に数える前に、分類と、理由が2つあるときにどちらに分類するかを決め、人が正解を付けた50件で同じ指示を2回実行して、AI に任せる分類と人が確認する分類を分ける進め方です。分類名だけで実行すると、いちばん多い分類が入れ替わった例を図で示します。
目次 クリックで開く
通販の口コミを BigQuery の AI 関数に読ませ、理由別に数えたら「品質」がいちばん多かった。商品の改良に手を付ける前に、確かめたいことがあります。その数は、人が1件ずつ読んで数えた件数と合っているでしょうか。
口コミやアンケートの自由記述を AI で理由別に数えたい、マーケティングや CS の担当の方に向けて、全件を AI に任せる前の進め方を書きます。分類とその基準を先に決め、人が正解を付けた口コミで試して、件数が合い、答えが揺れない分類だけを AI に任せれば、理由別の件数をどこまで施策に使えるかが分かります。
このあとの図は、BigQuery の導入とデータ分析を支援している当社が、検証用の BigQuery で作ったものです。口コミ50件は、確かめ方を説明するために、取り違えやすい言い方を含めて作った架空のものです。
上の図は、口コミ50件に先に決めておいた理由(正解)の件数と、AI が付けた理由の件数を、分類ごとに並べたものです。正解でいちばん多いのは価格の11件です。ところが、分類名だけを指示に書いて AI に分類させると、品質が10件から13件に増え、価格を抜いていちばん多くなりました。その他は6件から3件に減っています。3本目の棒は、分類ごとにどんな口コミを入れるかを指示に書き足し、もう一度実行した結果です。品質とその他の差は縮みますが、まだ正解とは同じになりません。
この入れ替わりをそのまま報告に載せると、商品の改良の優先順位が、数え方のずれで決まってしまいます。ここからは、分類を決めるところから全件を AI に分類させるところまでを、進める順に書きます。
分類は6つ。1件に1つと決め、理由が2つあるときにどちらに分類するかも決めておく
最初に決めるのは、口コミをどの理由に分けるか、つまり分類です。ここでは、価格、発送・配送、品質、問い合わせ対応、使い方・説明書、その他の6つにしました。分類は、数えたあとに対策を受け持つ部署ごとに分けておくと使いやすくなります。価格なら値付けや販促、発送・配送なら物流、品質なら商品企画、問い合わせ対応なら窓口、使い方・説明書なら説明書や商品ページの担当、という具合です。分類ごとに対策の担当が決まっていれば、件数をそのまま渡して話を始められます。
「その他」も省かずに作ります。「二度と買いません。」のように理由が書かれていない口コミを、ほかの分類に無理に入れないためです。BigQuery で文章を分類する AI 関数の公式ドキュメントにも、どの分類にも当てはまりにくい口コミに備えて「その他」を入れるとよい、という記述があります。
次に、1件に付ける理由は1つと決めます。目的が件数を数えることだからです。1件に2つ付けてよいことにすると、分類ごとの件数を足しても口コミの件数にならず、「品質の口コミが全体の何割か」が言えなくなります。
1件に1つと決めると、理由が2つ書いてある口コミをどちらに分類するかのルールが要ります。「配送は早かったです。ただ、本体に傷がありました。」なら、不満のほう、つまり品質に分類する、とここでは決めました。改良の手がかりを数えるのが目的なので、褒め言葉より不満のほうを優先します。もう1つ、値段に関する言葉が入っていても、不満が物そのものにあれば品質とします。「安かろう悪かろうでした。」は、値段ではなく物の出来への不満として数えます。
理由とは別に、口コミ全体がポジティブかネガティブか(以下、感情)も判定します。ポジティブ・ネガティブ・混在の3つで、混在は、良い点と悪い点が混在する口コミか、どちらとも言えない口コミです。理由と感情を分けておくと、同じ品質の分類の中で、不満と褒め言葉を分けて数えられます。
理由が2つあるときのルールは、数え方の取り決めです。ルールを変えれば件数も変わるので、報告する数字には、どの取り決めで数えたかを添えます。
50件を選んで人が先に分類し、迷ったときの基準を書き留める
AI に分類させる前に、手元の口コミから50件ほどを選び、人が先に理由と感情を付けます。これが答え合わせに使う正解になります。
選ぶときは、新しい順に上から取るのではなく、期間や商品をばらけさせ、短い口コミや理由が2つ書いてある口コミも入るようにします。全件で実行したときに出てくる言い方がこの中に無ければ、その言い方に AI がどう答えるかを確かめられないからです。
分類していくと、どれに入れるか決めにくい口コミが出てきます。この50件で言えば、「値段なりです。」は価格なのか品質なのか。「タイマーが勝手に止まる。説明書を読んでも原因が書いていない。」は品質なのか使い方・説明書なのか。「母の誕生日に贈りました。とても喜んでくれました。」はどの分類にも当たらないのか。ここでは、「値段なりです。」は値段に見合うかの話として価格に、タイマーの口コミは止まること自体が不満なので品質に、贈り物の感想はその他にしました。決めにくい口コミがあったら、選んだ分類と、そう決めた理由を1行で書き留めておきます。このメモが、あとで AI に渡す分類の説明になります。
50件だと、分類ごとの口コミは6〜11件しかありません。この数で決められるのは、どの分類を AI に任せ、どの分類を人が確認するかまでです。全件で AI の答えが何割合うかは、この数からは言えません。
分類名だけで実行すると、理由が書かれていない口コミが品質に入った
まず、理由の6つの分類名と、感情の3つの値だけを書いた短い指示で実行します。結果は、口コミの横に、AI が付けた理由と感情の列が1列ずつ加わった表で返ってきます。
正解と並べると、理由が合ったのは50件中45件でした。9割が合っていれば十分に見えます。ところが分類ごとに数えると、最初の図のとおり、品質が10件から13件に増え、いちばん多い分類が入れ替わっていました。
外れた5件のうち4件が、品質に入っていたためです。「文句なし。また買います。」「母の誕生日に贈りました。とても喜んでくれました。」「期待していたほどではなかったです。」の3件は、正解ではその他です。どれも、何が良くて何が悪いのかが書かれていません。「払った分以上の価値はありました。」は値段に見合うかの話なので、正解では価格にしていました。反対に、正解が品質なのに別の分類に入ったのは「タイマーが勝手に止まる。説明書を読んでも原因が書いていない。」の1件で、使い方・説明書になりました。
外れた答えがいくつもの分類に散らばっていれば、分類ごとの件数は打ち消し合って、大きくは動きません。外れが1つの分類に集中すると、合った件数が多くても、その分類の件数だけが膨らみます。理由別の件数を使うなら、合った件数とは別に、分類ごとの件数を正解と並べて確かめます。
どの分類の口コミがどの分類に入ったかは、正解を行に、AI の答えを列に取った表にすると一目で分かります。表の作り方と読み方は問い合わせの振り分けを AI に任せる進め方の記事に書いたので、ここでは結果だけを載せます。「分類名だけ」の結果と、次の節で説明する「分類の説明あり」の結果を並べています。
書き留めた基準を分類の説明として指示に加え、もう一度実行する
次に、正解を決めたときの基準を、分類ごとの説明として指示に加えます。加えたのは次の内容です。
| 価格 | 値段・送料・割引・ポイント・値段に見合うか |
|---|---|
| 品質 | 壊れ・傷・性能・重さ・音など、物そのもの |
| 発送・配送 | 届くまでの日数・日時指定・梱包・配達の人・届いた物の色や品の取り違え |
| 問い合わせ対応 | 電話・メール・チャット・店員・返品や交換の手続き |
| 使い方・説明書 | 使い方の分かりやすさ・説明書・付属のレシピや動画 |
| その他 | 理由が書いていないもの、贈り物の感想など上のどれにも当たらないもの |
| 理由が2つあるとき | 不満の側を選ぶ |
| 値段に関する言葉があるとき | 不満が物そのものにあれば品質 |
| 感情の混在 | 良い点と悪い点の両方、またはどちらとも言えない |
もう一度実行すると、理由が合ったのは48件になりました。「分類名だけ」で外れた5件のうち、「文句なし。また買います。」と贈り物の感想の2件はその他に、「払った分以上の価値はありました。」は価格に、タイマーの口コミは品質に入っています。品質は12件、その他は5件で、正解との差は2件と1件に縮みました。
残った2件は「値段なりです。」と「期待していたほどではなかったです。」で、どちらも品質に入りました。「値段なりです。」は短く、値段の話とも、物の出来の話とも読めます。「期待していたほどではなかったです。」は、何に期待していたのかが書かれていません。分類の説明を加えても、この2件は品質に分類されました。
ただし、この改善は割り引いて受け取る必要があります。分類の説明は、この50件の正解を決めた基準を、そのまま言葉にしたものです。同じ基準で正解を決めた50件に合いやすいのは、当然と言えます。説明がほかの口コミにも通用するかは、説明づくりに使っていない別の50件に人が正解を付け、同じ指示で実行して確かめます。この記事の50件では、その確認はしていません。
同じ指示でもう一度実行し、答えが変わる口コミを探す
「分類の説明あり」の指示を、そのままもう一度実行します。指示も口コミも同じなら答えも同じになりそうですが、ここは確かめておきます。全件で実行した結果は保存して使い回すので、そのときに返る答えが、試したときと同じとは限らないからです。
「分類名だけ」「分類の説明あり」「同じ指示で再実行」の3つの結果を正解と比べて数えると、次のようになりました。
| 理由が正解と合った | 感情が正解と合った | |
|---|---|---|
| 分類名だけ | 45件 | 46件 |
| 分類の説明あり | 48件 | 45件 |
| 同じ指示で再実行 | 49件 | 46件 |
再実行では、理由が合ったのは49件で、外れたのは「値段なりです。」だけでした。ただ、1件増えたことを改善とは見なしません。指示は同じなので、違うのはもう一度実行したことだけです。
2回の答えを1件ずつ比べると、答えが変わった口コミが2件ありました。「期待していたほどではなかったです。」の理由が品質からその他に、「最初は高いと思ったけど、毎日使うので元は取れそう。」の感情が混在からポジティブに変わっています。そのぶん、その他は5件から6件に、品質は12件から11件に変わりました。同じ指示でもう一度実行しただけで、品質とその他の件数が1件ずつ動いたことになります。
2回とも同じ答えだった口コミが、次に実行しても同じだとは言えません。2回の実行で分かるのは、少なくとも答えが揺れる口コミがある分類はどれか、ということです。答えが揺れた分類は、全件で実行したときにも件数が動く分類として扱います。ここまでに正解と違う答えが返った口コミを、どの実行で外れたかと一緒に並べると次のようになります。
良い点と悪い点が混在する口コミの一部は、AI がどちらか一方に分類した
感情は、合った件数が46件・45件・46件で、分類の説明を加えても上がりませんでした。どの指示でも外れたのは、正解が混在の3件です。「サポートの方の説明は丁寧でしたが、結局直りませんでした。」と「配送は早かったです。ただ、本体に傷がありました。」はネガティブに、「初期不良でしたが、問い合わせから3日で新品が届きました。」はポジティブに分類されました。「分類の説明あり」と「同じ指示で再実行」の2回では、「他の店より千円高いですが、保証が長いのでこちらにしました。」もポジティブになっています。
どれも、良い点と悪い点が1つの口コミの中に並んでいて、AI はそのどちらか一方に分類しています。「分類の説明あり」の指示では、混在を「良い点と悪い点の両方、またはどちらとも言えない」と説明しましたが、3回とも外れた3件は一度も混在になりませんでした。「他の店より千円高い」の口コミは、「分類名だけ」では混在で合っていましたが、説明を書き足したあとはポジティブになっています。正解が混在の9件のうち、合ったのは「分類名だけ」で6件、「分類の説明あり」で5件です。
件数が合い、2回の実行で答えが揺れなかった分類だけを AI に任せる
ここまでの結果を分類ごとにまとめ、AI に任せる分類と人が確認する分類に分けたのが次の表です。
AI に任せるのは、「分類の説明あり」と「同じ指示で再実行」の2回とも件数が正解と同じで、答えも変わらなかった分類です。この50件では、発送・配送、問い合わせ対応、使い方・説明書の3つでした。品質とその他は、ほかの分類の口コミが入ったり、再実行で答えが変わったりしたので、人が確認します。
価格は少し事情が違います。AI が価格に分類した口コミは、2回とも、すべて正解どおり価格でした。足りない1件の「値段なりです。」は品質に入っていました。品質を人が見直せば価格の件数も直るので、価格は品質を確認したあとで数えます。感情は、混在の口コミがポジティブかネガティブに紛れ込むので、感情別の件数を施策に使うなら、人が確認します。
最初の図で、品質がいちばん多く見えたことを思い出してください。品質は、この表では人が確認する分類です。「分類名だけ」で実行したときに誤って品質に入った4件は、理由が書かれていない口コミ3件と、値段に見合うかを書いた口コミ1件でした。品質の件数を商品の改良の優先順位に使うのは、品質に入った口コミを人が読んで直してからにします。発送・配送や問い合わせ対応のように AI に任せた分類は、全件で実行して行数を突き合わせたあと、物流や窓口に渡して話を始められます。
人が確認する分類を作れば、その件数のぶん読む手間が残ります。この50件を「分類の説明あり」で実行したとき、品質とその他に入ったのは17件で、3件に1件ほどを人が読むことになります。感情まで人が確認するなら、手間はさらに増えます。手間を減らしたいなら、分類を作り直す(理由が書かれていない口コミを、その他とは別の分類にする、など)か、分類の説明を書き足して、別の口コミで同じ確認をやり直します。どの分類で答えが揺れるかは口コミの書かれ方で変わるので、この表の分け方は、手元の口コミで作り直します。
全件で実行するときは、対象の行を先に表に書き出し、失敗した行と件数を突き合わせる
AI に任せる分類と人が確認する分類が決まったら、全件で実行します。ここからは手順の説明で、この記事では全件での実行はしていません。
- 対象の口コミを、先に別の表に書き出す。期間や商品の条件で絞った結果を表として保存してから、その表に AI 関数をかけます。公式ドキュメントには、表を結合する処理や、並べ替えて上から何件と絞る処理の中で AI 関数を呼ぶと、AI が処理する行の数が想定と違うことがあるので、先に結果を別の表に書き出し、その表に対して実行するよう勧める記述があります。
- 少量で実行して、費用を見積もる。100件ほどで実行し、ジョブの情報に表示されるトークン数(入力・出力・思考など)を見て、全件の件数に換算します。口コミの長さで1件あたりのトークン数は変わるので、手元の口コミで測った値を使います。
- 全件で実行し、結果を別の表に保存する。報告に使うのは、この保存した結果です。同じ指示でも再実行すると答えが変わる口コミがあるので、件数を出し直すたびに実行し直さず、保存した表から数えます。
- 失敗した行を数え、その行だけ再実行する。AI 関数は、上限に達したときなど、1行ずつ失敗することがあり、失敗した行は結果が空で返ります。この記事で使った関数では、失敗の理由が入る専用の列が付くので、その列に文字が入っている行を数え、その行だけをもう一度実行します。
- 件数を突き合わせる。書き出した表の行数が、結果の入った行と失敗した行を足した数と同じかを確かめます。合わなければ、どこかで行が増えたか減ったかしています。
- 人が確認する分類を読んでから数える。品質とその他に入った口コミを人が読んで直し、価格と、使う場合は感情も数え直してから、分類ごとの件数を出します。報告には、どの分類の説明で、いつ実行した結果かを添えます。
費用は2種類あります。BigQuery の処理の料金(オンデマンドなら読んだデータの量で決まります)と、AI 関数が呼び出す Gemini の料金です。Gemini の分は、請求では Vertex AI の項目に計上されます。Gemini の料金は読んだ文字と返した文字の量(トークン)で決まり、この記事で使ったモデル(名前は作り方の節に書きます)では、100万トークンあたり入力 0.30 米ドル、出力 2.50 米ドルです(地域を指定しない Global の価格、2026年10月時点)。AI が答えを出す前に考える分も、出力の料金で数えられます。請求に反映されるまで最大24時間かかることがあるので、少量で実行した直後は、請求の画面ではなくジョブの情報のトークン数で確かめます。この50件で実行したときは、失敗した行は0件でした。Gemini の料金は、この50件では確かめていません。
口コミがどこで処理されるかも、実行する前に確かめます。東京のデータセットから、地域を付けないモデル名で呼び出すと(作り方の節の書き方もこれです)、地域を指定しない Global の呼び出し先が使われ、処理される地域は指定することも知ることもできません。データを国内で処理することが契約や社内規程で決まっているなら、使う前に確かめてください。学習については、Vertex AI の Gemini の場合、Google は事前の許可や指示なしにデータを学習に使わないとしています。ただし同じ公式のページに、不正利用を見つけるために、AI に送った内容(この使い方なら口コミの本文も含みます)が記録されることがあるという但し書きもあります。
この図の作り方
図は、当社の検証用の BigQuery(東京のデータセット)で、口コミ50件と、口コミを作るときに決めた正解を1つの表に入れ、AI.GENERATE で理由と感情を返させて作りました。モデルには gemini-3.5-flash-lite(2026年10月時点で AI.GENERATE が既定で使うモデル)を指定し、output_schema で reason(理由)と sentiment(感情)の2列を返すようにしています。指示では、感情のポジティブ・ネガティブ・混在を positive・negative・mixed と書いています。接続は作らず、実行する人の権限で呼び出しています。必要な役割は BigQuery ジョブユーザーと Vertex AI ユーザーで、プロジェクトのオーナーなら追加する必要はありません。「分類名だけ」「分類の説明あり」「同じ指示で再実行」の3つを、2026年10月に、それぞれ結果を表に保存する形で実行し、正解と比べて数えました。表を作る SQL、数える SQL、並べる SQL を合わせて7本で37秒かかり、失敗した行は3回とも0件でした。「分類名だけ」で実行した SQL は次のとおりです(表の名前を置き換え、メモの列、表の保存期限とラベルの指定、数える SQL の版の列は省いています)。「分類の説明あり」は、指示のうち分類を並べたところと感情の選び方のところに、前の節の表の説明を加えたものです。
CREATE OR REPLACE TABLE mydataset.reviews_ai_1 AS
SELECT id, review, gold_reason, gold_sentiment,
g.reason AS ai_reason, g.sentiment AS ai_sentiment, g.status AS status
FROM (
SELECT *, AI.GENERATE(
CONCAT('次の通販の口コミを読み、評価の主な理由を次の6つから1つだけ選んでください:価格、発送・配送、品質、問い合わせ対応、使い方・説明書、その他。あわせて、口コミ全体の良し悪しを positive、negative、mixed から1つだけ選んでください。口コミ:', review),
endpoint => 'gemini-3.5-flash-lite',
output_schema => 'reason STRING, sentiment STRING') AS g
FROM mydataset.reviews_50);
SELECT COUNT(*) AS n,
COUNTIF(ai_reason = gold_reason) AS reason_ok,
COUNTIF(ai_sentiment = gold_sentiment) AS sentiment_ok,
COUNTIF(status != '') AS errors
FROM mydataset.reviews_ai_1;
公式ドキュメントによると、output_schema では、返す値を決めた分類名だけに限る指定(enum)もできます。今回は使っていませんが、50件とも、理由は6つの分類、感情は3つの値のどれかで返りました。分類するだけなら AI.CLASSIFY という関数もありますが、理由と感情を1回で2列取るために AI.GENERATE を使いました。
まずは、手元の口コミから50件を選び、人が先に分類する
明日やることは1つです。手元の口コミから、期間や商品をばらけさせて50件を選び、AI に分類させる前に、人が理由と感情を付けてください。付けながら迷った口コミと、そこで決めた基準を1行ずつ書き留めておけば、それがそのまま分類の説明になります。付けた理由と感情は、答え合わせに使う正解になります。
分類と基準づくりから、BigQuery の表の上で全件を AI に分類させて数える仕組みづくりまでを進めるなら、当社のBigQuery の導入支援でお手伝いします。
AI活用支援
Claude・ChatGPT・Gemini・Copilotのどれをどの業務に使うかの見極めから、社内のAIチャット環境、権限と情報の扱いの設計、MCPやAPIでの既存システム連携、研修・伴走までを支援します。
