BoWとは
BoWは、Bag-of-Wordsの略です。
BoWは、テキストを数値の特徴ベクトルに変換する方法です。
テキストデータに対して、テキスト中の特定の単語の出現回数を特徴量にする。
PythonでBoW-CountVectorizer-
日本語の場合、文は、単語もしくは形態素にスペース等ではっきり分かれていない。
そのため、日本語のテキストをそのままBoW処理すると以下のような結果になってしまう。
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer import MeCab text_list = ["私の名前は、βshortです。", "私は、ブログを書いています。", "ブログの内容は、データ分析に関するものです。", "ブログは、不定期で更新をしています。"] #==== bow ==== bow = CountVectorizer() count = bow.fit_transform(text_list) vec = count.toarray() name = bow.get_feature_names() #==== pandasで出力を確かめる===== pd.DataFrame(vec, columns=name)
これを防ぐために、日本語テキストでは、まず初めに”分かち書き”をする。
分かち書き+CountVectorizer
この分かち書きについては、下のページで紹介する。
Pythonで日本語の分かち書き|βshort Lab
分かち書き後のBoWの結果は下のようになる。
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer import MeCab def clear(text): text = re.sub(r'、', '', text) text = re.sub(r'。', '', text) text = re.sub(r'\n', '', text) return text text_list = ["私の名前は、βshortです。", "私は、ブログを書いています。", "ブログの内容は、データ分析に関するものです。", "ブログは、不定期で更新をしています。"] for i in range(len(text_list)): tagger = MeCab.Tagger("-Owakati") text_list[i] = tagger.parse (text_list[i]) text_list[i] = clear(text_list[i]) bow = CountVectorizer() count = bow.fit_transform(text_list) vec = count.toarray() name = bow.get_feature_names() pd.DataFrame(vec, columns=name)
これらの文章は、”ブログの話をしているものだろう”ということが予測できる?
BoWは、文章中の単語の数を特徴量として扱う。
従って、文章の特性に限らず、頻繁に使われる単語は意味がない。
例えば、”です”、”ます”など
頻度による制限-min_dfとmax_df
全ての文書に登場する単語は意味がない(特徴がない)と考えられるので、max_dfで制限します。
全く出現しないような単語は意味がない(特徴がない)と考えられるので、min_dfで制限します。
max_dfとmin_dfは、0~1.0の数値で指定します。
n-gram
#====1gram==== ngram_range(1,1) #もしくは、指定しない #====2gram==== ngram_range(2,2) #====3gram==== ngram_range(3,3) #====1と2gram==== ngram_range(1,2)
ngramは、大体1~3gram程度にします。
多くても4gramぐらいな印象です。