Bag of Wordsモデルは、機械学習アルゴリズムが理解できるように、テキストデータを非常にシンプルに表現する方法です。
これは、文書分類のような自然言語処理問題の領域で非常に効果的であることが証明されています。
この記事では、pythonを使用してBOWモデルを実装します。
Understanding the Bag of Words Model モデル
単語袋モデルを実装する前に、その仕組みについて直感的に理解しておこう。
次のような文章をBOWモデルを使ってベクトル表現したいと思う。
- 彼女はピザが好きだ、ピザはおいしい。
- 彼女は良い人です。
- 良い人は最高です。
ここで、与えられたテキストに含まれる全ての単語の集合を作る。
set = {'she', 'loves', 'pizza', 'is', 'delicious', 'a', 'good', 'person', 'people', 'are', 'the', 'best'} |
我々のテキストコーパスには12種類の単語がある。
これがベクトルの長さになる。
あとは各文書に出現する単語の頻度を数えれば、文のBag of Words表現ができあがります。
#Importing the required modules import numpy as np
from nltk.tokenize import word_tokenize
from collections import defaultdict
#Sample text corpus data = [ 'She loves pizza, pizza is delicious.' , 'She is a good person.' , 'good people are the best.' ]
#clean the corpus. sentences = []
vocab = []
for sent in data:
x = word_tokenize(sent)
sentence = [w.lower() for w in x if w.isalpha() ]
sentences.append(sentence)
for word in sentence:
if word not in vocab:
vocab.append(word)
#number of words in the vocab len_vector = len (vocab)
|
上の図では、各単語が文中に出現する回数をカウントしているだけであることがわかる。
Python で単語袋モデルを実装する
それでは、上記の概念をコードに落とし込んでみましょう。
1. データの前処理
データの前処理を行い、文章をトークン化します。
(また、単語の繰り返しを避けるため、小文字に変換します。
#Index dictionary to assign an index to each word in vocabulary index_word = {}
i = 0
for word in vocab:
index_word[word] = i
i + = 1
|
2. 単語へのインデックス付与
インデックス辞書を作成し、各単語にユニークなインデックスを割り当てる
def bag_of_words(sent):
count_dict = defaultdict( int )
vec = np.zeros(len_vector)
for item in sent:
count_dict[item] + = 1
for key,item in count_dict.items():
vec[index_word[key]] = item
return vec
|
3. Bag of Wordsモデル関数を定義する
最後にBag of Words関数を定義して、入力文のベクトル表現を返す。
vector = bag_of_words(sentences[ 0 ])
print (vector)
|
4. モデルのテスト
完全な実装が終わったので、モデルの機能をテストしてみましょう。
Bag-of-Words の限界
Bag of Wordsは実装が非常に簡単なモデルですが、いくつかの欠点があります。
- スパース性。BOWモデルは疎なベクトルを生成するため、空間的な複雑さが増し、予測アルゴリズムが学習するのが難しくなる。
- 意味。BOWモデルではシーケンスの順序が保持されないため、文の文脈と意味が失われる可能性がある。
まとめ
この記事は、BOWモデルの仕組みを理解し、pythonを使用してゼロから独自のモデルを実装することに終始しました。
また、このモデルの限界に焦点を当てました。