概要
テキスト文章をMeCabで形態素解析し、gensimでword2vecのモデルにする方法を整理しました。
必要なライブラリのインストール
1. gensim
gensimはpipで簡単にインストールできます。
pip install gensim
2. MeCab
MeCabは少し手間です。以下にまとめているので参考にしてみてください。
word2vecとは
word2vecとは単語をベクトルとして表現することで、似通ったベクトルを類似語として抽出したり、単語同士の意味的な足し算・引き算等を可能にするアルゴリズムです。word2vecを使うことで、文章を要約するテキストを抽出したり、文章同士の類似度を評価することも可能になります。
– ベクトル化のイメージの理解には以下の方のサイトがわかりやすかったです。
米googleの研究者が開発したWord2Vecで自然言語処理
– 技術的なイメージの理解には以下の方のサイトがわかりやすかったです。
絵で理解するWord2vecの仕組み
word2vecモデルの学習
学習までの手順は以下の通りです。
テキストデータ読み込み
ここはどんなライブラリを使っても構いませんので、まずはword2vecで使いたい文章を用意し、読み込みましょう。
データ整形
split等の関数を使って、以下のように、1文ごとのリストになるようにデータを整形します。
doc = ["よう、4年ぶりだな、ライナー", "エレン", "故郷に戻れてよかったな", ・ ・ ・ ]
形態素解析
まずは1文(sentence)を受け取り、分かち書き結果(texts)を返すファンクションを定義します。以下では、名詞だけを使う例を記載しています。
#形態素解析 #sentence(文章)を受け取り、texts(形態要素)を返すファンクション。 def tokenize(sentence): try: mecab = MeCab.Tagger("-Ochasen") data = mecab.parse(sentence) data = StringIO(data) data = pd.read_csv(data, sep='\t', header=None) #名詞のみを使う場合。 data = data.loc[(data[3].str.find("名詞") >= 0)] texts = list(data.iloc[:, 0]) return texts except: return []
上記のファンクションを用いて以下のように形態素解析を実施します。
tokeData=[] for sentence in doc: tokeData.append(tokenize(sentence))
tokeDataには、以下のような1文ごと、1テキストごとの2次元配列が入っているはずです。
print(tokeData) [['4', '年', 'ぶり', 'ライナー'], ['エレン'], ['故郷']]
word2vecを学習
ここまでできればあとは簡単です。以下のようにword2vecにデータを渡して学習・保存しましょう。学習は結構時間がかかります。
from gensim.models import word2vec #Word2Vecモデルの学習 #sizeは特徴量の数、min_count以下の登場数の単語を無視、前後window幅の単語との関係を考慮、iter回数分繰り返し計算 model = word2vec.Word2Vec(tokeData, size=100, min_count=5, window=5, iter=3) #モデルの保存 model.save("word2vec.gensim.model")
モデル作成のパラメータについては以下のサイトが参考になりました。
word2vec のオプション一覧
出来合いのモデルを使いたいあなたに
上記のような処理でword2vecモデルを学習することができますが、データを集めたり、学習を待ったり、その妥当性を確認するのは結構大変です。そこで、この部分について、出来合いのモデルをダウンロードして使ってしまうという手があります。
私がよく使わせていただいているのは、以下のサイトのモデルです。情報収集アプリのカメリオで使われているモデルということで、かなり学習されています。
word2vecの学習済み日本語モデルを公開します | カメリオ開発者ブログ
まとめ
テキスト文章をMeCabで形態素解析し、gensimでword2vecのモデルにする方法を整理+出来合いモデルを使う方法を整理しました。便利なライブラリはどんどん活用していきたいですね。