「ヤマダ電機」と「ヤマダデンキ」:表記ゆれと重複の原因は 3 つ重なっていた(包含だけの比較・59 秒の差・手動専用のジョブ)
トレカダッシュ 開発の記録 / 2026年8月
iOS アプリ「トレカダッシュ」の記事では、同じ店の名前が、「ヤマダ電機」と「ヤマダデンキ」のように、書き方がバラバラでした。報告は、2 つ来ました。「表記揺れしている」「同じ理由で、記事が重複している」。指示は、「他の店でも同じことが起きないように、徹底的に」でした。
この記事は、原因が 3 つ重なっていたことと、「言い換えの表を作らず、一般則で直す」過程の記録です。
この記事は、2026 年 8 月 25 日の作業の記録から書いています。
原因は、3 つ重なっていた
- 店名の比較が、「含んでいるか」だけだった。「ヤマダ電機」と「ヤマダデンキ」は、どちらも、もう一方を含まないので、別の店になります。
- 締切を、ミリ秒まで一致で比べていた。同じ「8/26 まで」でも、まとめサイト由来は 23:59:00、X 由来は 23:59:59 で、59 秒の差のせいで、重複と判定されませんでした。実データの 4 商品が、これでした。
- 重複を整理するジョブが、手動で動かす専用で、一度も自動で走っていなかった。「一度きりの修復」のつもりで作っても、記事は毎日入るので、重複も毎日生まれます。
直し方:言い換えの表は、作らない
店名の比較のキー(storeNameComparisonKey)を作りました。法人格、記号、空白、全角と半角を落とし、カタカナをひらがなにし、「電機、電器、でんき」を 1 つに寄せます。
店名の言い換えの表は、作りません。新しい店が増えるたびに、再発するからです。読みが同じになる書き分けを、まとめる一般則にしました。
- 締切は、日付として(日本時間の日付で)比べ、代わりに販売の形式の一致を求めます。同じ日でも、先着と抽選は、別の案件だからです。
- 店名(
sellerName)が無く、カテゴリにしか店名が無い記事も、対象に含めます。入荷情報のサイトや公式サイト由来の記事は、こちらが多く、まるごと見落としていました。 - 重複で隠すときは、必ず隠した印(
hiddenByDuplicate)を付けます。 - 1 時間おきの定期実行を、足しました。
- 表記そのものも、実データの多数派に寄せます。正しい表記の一覧は、持ちません。同数のときは、カタカナ表記、次に文字列の順で固定して、実行のたびに答えが変わる、書き換え合戦を防ぎます。
テストで見つけた、2 つの危険
どちらも、直したあとに、テストで見つけました。
- 「@」の前だけをキーにすると、店名に@を含む店が、極端に短いキーになる。「カードショップ@ほ~む。鹿児島店」が「かーどしょっぷ」というキーになり、別の店と同一視されます。比較のキーでは、@で切りません。(宣伝文が付いた名前は、包含の判定で拾えます。)
- 「片方がもう片方の先頭部分なら、同じ名前」にすると、支店名が消える。「イエローサブマリン」と「イエローサブマリン秋葉原店」が統合され、支店名が消えます。付け足しが、「@」「【」「(」で始まる注記のときだけ、同じ名前とみなします。
実データ 17 パターンで確かめて、食い違いは 0 件でした。
実行結果
| 前 | 後 | |
|---|---|---|
| 店名の表記揺れ | 2 件 | 0 件 |
| 同じ商品・同じ締切・同じ店の重複 | 7 組 | 0 組 |
ついでに、「○○@スタッフ募集中」のような宣伝文の付いた店名 23 件も、そろいました。重複のとき、残す側は、値段と当落発表日を持つほうです。
分かったこと
一覧で直さず、一般則で直す。そして、直す処理は、自動で走らせる。
- 「含んでいるか」だけで比べない。書き分けは、含みません。
- ミリ秒まで一致で比べない。日付と、販売の形式で比べます。
- 「一度きりの修復」は、毎日生まれるものには足りない。自動で、定期的に走らせます。
- 言い換えの表は、新しい店で再発する。読みが同じになる、書き分けの一般則にします。
- 統合は、注記のときだけ。支店名を、消してはいけません。
この話に出てくるもの
- トレカダッシュ — トレカの抽選・予約・先着の情報を集める iPhone アプリ
- 「同じ応募ページ」なら「同じ店」と決めつけていた — 店名の別の問題
- 「重複は実質ゼロ」と数えたのに、監査は 112 組を出していた — 重複の別の話
- あいまいな店名で地図を引くと、日本の真ん中の静岡が返る — 店名と位置の話
ほかの記録
- あいまいな店名で地図を引くと、日本の真ん中の静岡が返る:チェーン名を並べず、Google 自身の答えで判定した — 店名を Google の地図検索に渡すと、あいまいな名前では日本全体の矩形の真ん中(静岡・愛知)が返った。ヤマダデンキが浜松、サンエーが掛川の工場に。チェーン名の一覧は作らず、答え自身で信用できるかを 4 つの規則で判定した。
- 「1 ページ = 1 案件」ではなかった:1 つのフォームで 6 商品を受け付ける店の記事が、リンクが同じというだけで消されていた — リンクだけで重複と決めるジョブが、1 つの Google フォームで 6 商品を受け付ける店の記事 5 件を消していた。「リンク + 商品」に直した。サーバが作った「応募枠」をアプリが一度も読んでいなかったことも見つかった。
- 英語表記とカタカナ表記は、1 文字も重ならない:正しい照合 42 件を、指紋の関門が却下していた — 相場の紐付け率が 39% に低下。相場のサイトに商品はあったが、自社の英語表記とカタカナ表記では指紋が一致せず、26 時間で 42 件が却下されていた。関門は弱めず、この照合だけに狭い 2 つ目の判定を足した。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。