Shikata Ga Nai

Private? There is no such things.

第10回:重複データを自動で取り除くには?

Hello there, ('ω')ノ

~LLMが同じことばかり学習しないための整理術~

LLMにデータを与えるとき、つい見落としがちなのが「重複データ」の存在です。 例えば、似たようなFAQが複数の部署で管理されていたり、メール文例が社内共有のたびにコピーされていたり……。

実はこれらの重複データを放置すると、LLMの出力に悪影響が出る可能性があります。


🔄 なぜ重複データが問題なのか?

📌 問題1:学習データの「偏り」が発生

同じフレーズばかりが大量にあると、LLMはそれを“重要な表現”だと誤解し、一部の表現を過剰に学習してしまう可能性があります。

📌 問題2:モデルの「出力の多様性」が損なわれる

重複したデータが多いと、LLMは似たような回答ばかりを出すようになります。 → 結果として「何を聞いても同じような返答しか返ってこない」状態に。

📌 問題3:無駄な学習コストがかかる

同じ情報を何度も学習させるのは、時間も計算資源も無駄に消費してしまいます。


🛠️ 重複の種類と検出方法

重複には実は2種類あります:

種類 説明
完全一致 全く同じ文章 「この商品は返品できません。」が複数回
類似(部分一致) 似ているが言い回しが違う 「この商品は返品不可です。」など微妙に違う文

⚙️ 重複検出の基本的な方法

✅ 方法1:完全一致の削除(簡単・高速)

使えるツール:

  • Excelやスプレッドシートの「重複の削除」機能
  • Pythonのset()pandas.drop_duplicates()メソッド

おすすめ用途:

  • データ件数が少なめ(数千件程度)
  • ほぼコピー&ペーストの重複が疑われるとき

✅ 方法2:類似文の検出(精度重視)

使える技術:

  • Cosine類似度(文章を数値化し、類似度を数値で計算)
  • ベクトル検索(例えばOpenAIの埋め込み+FAISS)

例:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

texts = ["これは返品できません。", "この商品は返品不可です。"]
vec = TfidfVectorizer().fit_transform(texts)
similarity = cosine_similarity(vec[0], vec[1])
print(similarity)

➡ 類似度が0.8以上など、一定の基準を超えたら「ほぼ重複」とみなして除外します。


✅ 方法3:AIによる文の意味レベルの比較

活用例:

  • OpenAIの「text-embedding-3-small」などを使って文章をベクトル化
  • 意味が近いもの同士をまとめてクラスタリング(グルーピング)

➡ より高精度に「ニュアンスが同じかどうか」を判断できます。


💡 実務での応用例

🔹 FAQシステムの学習データ整理

  • 「返品できますか?」に対する似た回答が5パターンある
  • → 意味が同じものは1つにまとめ、バリエーションは後から追加学習で対応

🔹 社内チャットのログ整理

  • 「了解しました」「了解しました!」などの微妙な違いも検出
  • → 定型表現としてまとめてフィルタリング

📋 重複削除のチェックポイント

チェック項目 説明
完全一致は削除できているか? コピー&ペーストされたものがないか確認
類似文の基準は適切か? 類似度のしきい値(例:0.85)を設定して調整
業務に必要な“バリエーション”まで削っていないか? 「完全一致だけ削る」など慎重な運用が必要
自動化ツールに頼りきりでなく人の確認もあるか? “削りすぎ”のリスクを回避するために確認体制を

✅ まとめ:重複除去は“品質と効率”を上げる下ごしらえ

  • LLMは「同じ表現ばかり学ぶ」と、応答の幅が狭くなる
  • 完全一致だけでなく、“意味が同じ”重複も削除対象に
  • ベクトル化や類似度計算で自動化が可能
  • 削除しすぎないように「人の目による確認」も忘れずに

Best regrads, (^^ゞ