最終更新日:2026年7月18日
gk nlp machine_learning
まず結論
- Bag of Words(BoW)とは、文書を語彙ごとの出現回数を並べたベクトルとして表す手法です。
- 単語の順序を捨てるため、語順や文脈は表現できません。
- G検定では、TF-IDF・n-gram・Word2Vec・BERTとの違いを切り分けることが重要です。
直感的な説明
BoWは、文章を袋の中に入れて、単語の並びを崩してから数えるイメージです。
たとえば、
私は AI を学ぶ
AI を私は学ぶ
この2文は語順が違いますが、含まれる単語と回数は同じです。
BoWでは、両方とも同じ特徴量になります。
一方、
犬が人をかむ
人が犬をかむ
も単語の集合は同じです。 しかし意味は大きく異なります。
この違いを表せないことが、BoWの代表的な弱点です。
定義・仕組み
BoWでは、まず対象文書全体から語彙を作ります。
例として、語彙を次の3語とします。
- AI
- 学ぶ
- Python
文書ごとの出現回数を並べると、次のように表現できます。
| 文書 | AI | 学ぶ | Python |
|---|---|---|---|
| AIを学ぶ | 1 | 1 | 0 |
| Pythonを学ぶ | 0 | 1 | 1 |
| AIとPythonを学ぶ | 1 | 1 | 1 |
各行が1つの文書を表すベクトルです。
0と1だけで表す場合もある
単語が何回出たかではなく、出たかどうかだけを表す方法もあります。
- 出現した:1
- 出現しない:0
これはバイナリBoWと呼ばれます。
したがって、BoWは必ず生の出現回数だけを使うとは限りません。 本質は、固定した語彙に対して文書を数値ベクトルへ変換することです。
疎な高次元ベクトルになりやすい
語彙数が10,000語なら、文書ベクトルも10,000次元になります。 しかし1文書に実際に出る単語は一部だけなので、多くの要素が0になります。
このようなベクトルを、
- 高次元:要素数が多い
- 疎(スパース):0が多い
と表現します。
前処理の影響を受ける
BoWを作る前には、通常次の処理を検討します。
- 単語分割
- 大文字・小文字の統一
- ストップワード除去
- ステミングやレンマ化
たとえば「学ぶ」「学んだ」を別の単語として数えるか、同じ語として扱うかで特徴量が変わります。
いつ使う?(得意・不得意)
得意
- 文書分類
- スパム判定
- 感情分析の簡単なベースライン
- 単語の出現傾向が重要なタスク
- 学習結果を説明しやすい特徴量が必要な場合
不得意・注意点
- 語順を考慮できない
- 同じ単語でも文脈による意味の違いを表せない
- 同義語を別の特徴として扱う
- 語彙数が増えると次元数が大きくなる
- 未知語は既存の語彙ベクトルでは表現できない
G検定ひっかけポイント
BoWとTF-IDF
- BoW:単語の回数や有無を特徴量にする
- TF-IDF:文書内で多く、他文書では珍しい単語を重くする
TF-IDFも語順や文脈を直接は表現しません。
TF-IDFにすれば意味を理解できる
という説明は誤りです。
BoWとn-gram
通常のBoWは単語を1つずつ数えるため、語順を無視します。 一方、n-gramでは連続する複数語を1つの特徴として扱います。
例:
- unigram:
機械、学習 - bigram:
機械 学習
n-gramを使えば局所的な並びは一部保持できますが、長い文脈を理解するわけではありません。
BoWと分散表現
| 手法 | 表現 | 語順・文脈 |
|---|---|---|
| BoW | 語彙ごとの回数 | 基本的に無視 |
| TF-IDF | 重要度で重み付けした語彙ベクトル | 基本的に無視 |
| Word2Vec | 単語を低次元の密なベクトルで表現 | 周辺語から意味的関係を学ぶ |
| BERT | 文脈に応じた単語表現 | 前後の文脈を考慮 |
よくある誤解
- ❌ 単語の意味を直接表現する
- BoWは単語の位置ごとの回数を表します。
- ❌ 語順を保持する
- 通常のBoWでは語順を捨てます。
- ❌ 低次元で密なベクトルになる
- 一般に高次元で疎なベクトルです。
- ❌ TF-IDFは文脈を理解する
- TF-IDFは単語の重要度を調整する手法です。
選択肢を切る判断基準
- 「語彙ごとの出現回数」→ BoW
- 「語順を無視」→ BoW
- 「珍しい単語を重くする」→ TF-IDF
- 「連続する複数語を特徴にする」→ n-gram
- 「単語を低次元の密なベクトルにする」→ Word2Vecなど
- 「前後の文脈によって単語表現が変わる」→ BERTなど
まとめ(試験直前用)
- BoWは文書を語彙ごとの出現回数ベクトルで表す
- 語順・文脈・意味を直接は考慮しない
- 高次元で疎なベクトルになりやすい
- TF-IDFはBoW系の表現に重要度を加える
- 「回数」「語順を無視」ならBoW