PythonでBoW(Bag-of-Words)によるエンコード

自然言語処理




BoWとは

BoWは、Bag-of-Wordsの略です。

BoWは、テキストを数値の特徴ベクトルに変換する方法です。

テキストデータに対して、テキスト中の特定の単語の出現回数を特徴量にする。

PythonでBoWエンコード

日本語の場合、文は、単語もしくは形態素にスペース等ではっきり分かれていない。
そのため、日本語のテキストをそのまま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)

これを防ぐために、日本語テキストでは、まず初めに”分かち書き”をする。
この分かち書きについては、下のページで紹介する。
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は、文章中の単語の数を特徴量として扱う。
従って、文章の特性に限らず、頻繁に使われる単語は意味がない。
例えば、”です”、”ます”など

これらの語句は、「ストップワード」と呼ばれ、まず先に削除しておいた方が良いだろう。

参考

タイトルとURLをコピーしました