商品名の「個数」の読み間違いで、偽の最安1位が生まれていた話
📌 記事の取り扱いについて(公開当時の内容を含みます — タップで詳細)
本記事は公開当時の体験・気づきをまとめたものです。現在のツール数・プラン数・対象年齢・記事数・仕様とは異なる場合があります。最新の内容は各ツールページをご確認ください。ツールや外部サービスの仕様・料金は変更されることがあるため、利用前には各公式情報も併せてご確認ください。記載に誤りを見つけられた場合はお問い合わせフォームよりご連絡いただけると助かります。
私の作った買い物比較ツールは、日用品を「1個あたり」「1ロールあたり」「100gあたり」など、その商品に合った単位の単価に直して安い順に並べるものです。トイレットペーパーでも洗剤でも、まとめ買いの箱でもバラ売りでも、同じ物差しに揃えて比べれば、どれが割安そうかを見つけやすくなります。そういう狙いで作りました。
ところが公開してしばらくして、並び順の一番上に、単価が異様に安い商品がちょくちょく現れるようになりました。「1個あたり数円」みたいな、明らかにおかしい数字です。クリックして商品ページを見に行くと、全然そんな値段ではありません。偽の最安1位が、堂々と表彰台に立っていたのです。
原因は「商品名から個数を読み取る処理」でした
このツールでは、通販サイトの商品名の文字列から「何個入りか」を読み取って、価格を個数で割って単価を出しています。「24個セット」と書いてあれば24で割る、という具合です。
人間なら商品名を見た瞬間に「ああ、これは12個入りが2袋ね」と分かります。でも機械は、商品名に出てくる数字を拾って解釈するしかありません。そしてこの解釈が、想像以上に間違えるのです。
一番びっくりしたのが、範囲表記の誤認でした。商品名に「1〜24個 配送不可:北海道」のように、注文できる範囲や配送条件が書いてあるだけの出品。その右端の24を拾って「24個入り」と読んでしまう。当然、価格を24で割るので単価は本来の24分の1になり、偽の最安1位が誕生します。書いた本人(お店)はただ注文条件を案内しているだけなのに、機械は「個」という字と数字を見つけて飛びついてしまうんですね。
私が実際に見つけたのは、トイレクリーナーや替ブラシ、ポケットティッシュなど、まとめ買いの表記が多い商品でした。まとめ買い商品は商品名に数字がたくさん出てくるので、拾い間違いの機会もそれだけ多くなるのだと思います。
別シリーズが混ざると、計算そのものが狂います
もうひとつの原因は、検索結果への「別シリーズの混入」でした。
このツールは商品ごとに検索の言葉を決めて通販サイトに問い合わせているのですが、その検索に、名前が似ているだけの別シリーズの商品が混ざることがあります。中身の量や規格が違うものを同じ土俵で単価計算すると、比較として成立しません。安く見えているだけの別物が上位に食い込んでしまいます。
これは読み取りの工夫だけではどうにもならなかったので、除外リストで弾くという地道な対応にしました。混ざってくる別シリーズを名前の一部で除外し、売り切れが常態化しているお店は URL で除外しています。かっこいい解決策ではないのですが、見つけた範囲には効きました。
対策は、パターンをひとつずつ潰すしかありませんでした
範囲表記は個数として拾いません。「24個セット(12個入り×2袋)」のように、括弧の中の掛け算が外側の数と一致する書き方は、二重に数えません。「お一人様○点まで」のような購入制限の文は個数ではありません。
ただ、書き方が少し違うだけで、また読み違えます。実際、この記事を書くためにデータを見直していたら、「24個 セット……12個入 2個セット」を 24×12×2=576個と数えて、1個2.2円という現実にはあり得ない単価にしてしまった出品が見つかりました。総数と内訳が括弧なしで同居する書き方を、ルールが取りこぼしていたのです。これも読み取りルールに追加して直しました。それでも新しい書き方は今後も現れるはずなので、安全網として、楽天と Yahoo! で単価が大きく食い違う商品は「要確認」と表示して、単価順ではなく価格順で並べるようにしています。
こうやって、間違いを見つけるたびに読み取りのルールを一つずつ足していきました。一気に全部を賢くする方法は、私には思いつきませんでした。おかしな1位を見つけては商品ページと見比べて、「今回はどの読み間違いだ?」と調べます。その繰り返しです。
正直、この作業は探偵ごっこみたいで、途中からちょっと面白くなってきた部分もあります。犯人はいつも商品名の中にいますので。
なお、個数ではなく重さで比べる登録済みの生鮮品には、また別の読み取りルールを使っています。この話は第104回に詳しく書きました。
「推測で補う」処理は、きっぱりやめました
対策を重ねる中で、方針として一番大きかった決断がこれです。
自分用のローカル版では一時期、商品名から個数がはっきり読み取れないときに「1ロールあたりの単価が高すぎる。これはケース売りだろう」と推測して、ロール数を8倍する処理を入れていました。親切のつもりでした。ところがこの推測が外れると、実際には割高な出品の単価が実態より安く計算されて、これまた偽の最安1位を作ってしまうことが分かったのです。
8ロールで3,732円という、正直かなり割高な出品がありました。それを「64ロール入りに違いない」と勝手に読み替えて、1ロール58円の最安1位に押し上げていたのです。実在する出品を、実際より安く見せてしまう。これは比較ツールとして一番やってはいけないことだと思いました。
それでこの処理は廃止して、**「商品名に書かれた数のまま扱う。割高なものは割高なものとして、素直に下位に並ぶ」**という方針に確定しました。気を利かせた推測より、書いてあることだけを信じる愚直さの方が、比較の信頼性には効くのだと学びました。
振り返り:日本語の商品名は自由すぎます
一連の騒動を振り返って思うのは、日本語の商品名は自由すぎる、ということです。
個数の書き方ひとつとっても、セット、パック、入り、ケース、掛け算記号、括弧の内訳と、お店ごとに流儀が違います。そこに注文条件やキャンペーン文まで同じ一行に同居してくる。人間なら一瞬で読み分けられるこの雑多さが、機械にとっては罠だらけの地雷原でした。
今も新しい書き方の商品に出会うたびに、読み取りルールを少しずつ直しています。たぶんこの作業に終わりはありません。それでも、おかしな1位が出るたびに一つ賢くなっていくと思えば、悪くない付き合い方かなと感じています。
← 他の制作記を見る | トップ | お問い合わせ