sklearnのCountVectorizerを用いて単語の出現頻度を数えてみる。
今回は単語の出現頻度を数えてみます。単語の出現頻度とは文章中に出てくる単語について何回使用されたかをカウントするもので、sklearnのCountVectorizerを用いて簡単に求めることが出来ます。出現頻度を求める方法は特徴量抽出という手法を用います。特徴量抽出とは、学習データにどのような特徴があるかをベクトル化したもので、今回のケースでは単語の出現頻度がベクトル(数値)にあたります。
使用する文章は以前青空文庫の三国志を分かち書きしたものがあるので、そちらを使用して行っていきます。
分かち書きした文章を使用する理由としては一般的に日本語の場合は英語と異なり、単語と単語の間にスペースがないことから単語の抽出が難しいためです。分かち書きの手法により単語の分割を行うことで、単語の抽出を容易にしています。
なお、使用する文章はwakachi_text.txtという名前で保存されていることにします。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#文章のオープン with open('wakachi_text.txt', 'r', encoding='UTF-8') as f: print(f.read()[:394]) #sckitlearnよりCountVectorizerをインポートする from sklearn.feature_extraction.text import CountVectorizer #CountVectorizerの実行 txt_vec = CountVectorizer(input='filename') txt_vec.fit(['wakachi_text.txt']) #抽出した単語を確認する txt_vec.get_feature_names() #単語の数を求めてみる len(txt_vec.get_feature_names()) #特徴量の抽出 word = txt_vec.transform(['wakachi_text.txt']) #特徴量ベクトルに変換(出現頻度) vector = word.toarray() #単語の出現頻度を確認 for word,count in zip(txt_vec.get_feature_names()[:], vector[0, :]): print(word, count) |
ソースコードの詳細
文章のオープン
1 2 3 |
#文章のオープン with open('wakachi_text.txt', 'r', encoding='UTF-8') as f: print(f.read()[:394]) |
sckitlearnよりCountVectorizerをインポートする
1 2 |
#sckitlearnよりCountVectorizerをインポートする from sklearn.feature_extraction.text import CountVectorizer |
CountVectorizerの実行
1 2 3 |
#CountVectorizerの実行 txt_vec = CountVectorizer(input='filename') txt_vec.fit(['wakachi_text.txt']) |
1 2 3 4 5 6 |
ountVectorizer(analyzer='word', binary=False, decode_error='strict', dtype=<class 'numpy.int64'>, encoding='utf-8', input='filename', lowercase=True, max_df=1.0, max_features=None, min_df=1, ngram_range=(1, 1), preprocessor=None, stop_words=None, strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b', tokenizer=None, vocabulary=None) |
抽出した単語を確認する
1 2 |
#抽出した単語を確認する txt_vec.get_feature_names() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
['ああ', 'あい', 'あいさつ', 'あいだ', 'あいつ', 'あいにく', 'あいまい', 'あう', 'あえ', 'あえい', 'あえて', 'あおっ', 'あおり', 'あか', 'あがっ', 'あがら', 'あがり', 'あく', 'あくび', 'あくまで', |
単語の数を求めてみる
1 2 |
#単語の数を求めてみる len(txt_vec.get_feature_names()) |
1 |
8348 |
特徴量の抽出
1 2 |
#特徴量の抽出 word = txt_vec.transform(['wakachi_text.txt']) |
特徴量ベクトルに変換(出現頻度)
1 2 3 4 5 6 |
#特徴量ベクトルに変換(出現頻度) vector = word.toarray() #単語の出現頻度を確認 for word,count in zip(txt_vec.get_feature_names()[:], vector[0, :]): print(word, count) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
正確 1 正統 2 正義 4 正規 5 正邪 1 正面 5 此処 1 此方 4 此身 1 武人 7 武力 6 武功 2 武勇 9 武勲 1 武名 1 武器 1 武士 7 武夫 2 |
このように簡単に単語の出現頻度を求めることができました。日本語の場合は単語の抽出が難しく一部において不自然な単語がありますが、分かち書きの手法を工夫することで自然な単語として抽出することもできます。英語の場合は比較的簡単に単語の抽出ができるのでいろいろ試してみましょう。