1. Word2Vecについて
この記事を読み進める前に、よりテキストマイニングの内容を理解したい方は、下記のURLにてチェックしてみてください。
「Word2Vec」とは、文章中の語句をベクトルに変換するツールです。単語同士の繋がりに基づいて単語同士の関係性をベクトル化するわけです。
ツール名通り、単語をベクトルとして表現することで、その単語の意味を捕らえる手法となります。つまり、語句と語句の類似度を測ることができるわけですね。
2. Gensimとインストールについて
Word2Vecを実現するツールとして、いくつか挙げられるライブラリがあります。
今回は、実行速度が速く、Pythonから手軽に利用できるものを考えると、「Gensim」ライブラリを使いたいと思います。この「Gensim」は、自然言語処理のためのライブラリです。
テキスト処理のための多くの機能を備えており、Word2Vec機能も備えています。「Gensim」はのインストールは、pipコマンド一発でインストール可能です。テキストマイニングを試しに行ってみたい方は利用してみてください。
以下にインストールのコマンドを記載します。
pip install gensim
3. モデル作成
今回は、model-making.pyとword2vec.pyの二つのファイルを作成します。
それぞれに行うプログラムを記載して説明していきます。
– 3.1 プログラムの概要
1 – model-making.py
■処理の流れ
1. python解析器janome,ベクトル変換ツールword2vecをインポート
2. 作成したテキストファイルの読み込み
3. 形態素解析
4. テキストを一行ごとに処理した内容を任意の品詞で抽出
5. 書き込み先のテキストを開く
6. word2vecでモデル作成
1 2 3 4 |
# python解析器janome, ベクトル変換ツールword2vecをインポート from janome.tokenizer import Tokenizer from gensim.models import word2vec import re |
1では、今回のテキストマイニングに必要なライブラリとして、python解析器janomeとベクトル変換ツールword2vecをインポートします。
テキスト一行ごとに処理を行う(データクレンジング)ため、正規表現マッチング操作を提供しているreもついでにインポートしておきます。
1 2 3 |
# テキストファイルの読み込み - 2 bindata = open("text_1.txt").read() text = bindata |
2では、任意で用意しておいたテキストファイル(何か文章を入力してあるファイル)を読み込みます。
1 2 3 |
# 形態素解析 - 3 t = Tokenizer() results = [] |
3では、janomeを利用して形態素解析を行うため、インスタンスを作成しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# テキストを一行ごとに処理 - 4 lines = text.split("\r\n") for line in lines: s = line s = s.replace("|", "") s = re.sub(r"《#.+?》", "", s) s = re.sub(r"[#.+?]", "", s) tokens = t.tokenize(s) # 必要な語句だけを対象とする - 5 r = [] for tok in tokens: if tok.base_form == "*": w = tok.surface else: w = tok.base_form ps = tok.part_of_speech hinsi = ps.split(",")[0] if hinsi in ["名詞", "形容詞", "動詞", "記号"]: r.append(w) rl = (" ".join(r)).strip() results.append(rl) print(rl) |
4では、テキストを一行ごとに処理しています。
変数linesに対して、読み込んでおいたファイルデータをtextに代入し、その変数を単語ごとに処理しています。
forループにて、正規表現マッチング操作を行ったあと、一文字づつ形態素解析しています。
5では、得られた形態素解析後の単語の品詞を必要な形で分かち書きさせていきます。
1 2 3 4 |
# 書き込み先テキストを開く - 6 text_file = "text_2.txt" with open(text_file, "w", encoding="utf-8") as fp: fp.write("\n".join(results)) |
6では、用意しておいた任意のテキストファイルにて、結果をファイルに保存します。
1 2 3 4 5 |
# word2vecでモデル作成 - 7 data = word2vec.LineSentence(text_file) model = word2vec.Word2Vec(data, size=100, window=1, hs=1, min_count=1, sg=1) model.save("text_2.model") print("ok") |
7では、分かち書きしておいたテキストファイルを読み込み、word2vecにてモデルを作成します。word2vec()メソッドにてパラメータを与えて実行すると、モデルを生成します。生成したモデルは、save()メソッドにてファイルを保存できます。
★model-making★
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# model_making.py # python解析器janome, ベクトル変換ツールword2vecをインポート - 1 from janome.tokenizer import Tokenizer from gensim.models import word2vec import re # テキストファイルの読み込み - 2 bindata = open("text_1.txt").read() text = bindata # 形態素解析 - 3 t = Tokenizer() results = [] # テキストを一行ごとに処理 - 4 lines = text.split("\r\n") for line in lines: s = line s = s.replace("|", "") s = re.sub(r"《#.+?》", "", s) s = re.sub(r"[#.+?]", "", s) tokens = t.tokenize(s) # 必要な語句だけを対象とする - 5 r = [] for tok in tokens: if tok.base_form == "*": w = tok.surface else: w = tok.base_form ps = tok.part_of_speech hinsi = ps.split(",")[0] if hinsi in ["名詞", "形容詞", "動詞", "記号"]: r.append(w) rl = (" ".join(r)).strip() results.append(rl) print(rl) # 書き込み先テキストを開く - 6 text_file = "text_2.txt" with open(text_file, "w", encoding="utf-8") as fp: fp.write("\n".join(results)) # word2vecでモデル作成 - 7 data = word2vec.LineSentence(text_file) model = word2vec.Word2Vec(data, size=100, window=1, hs=1, min_count=1, sg=1) model.save("text_2.model") print("ok") |
2 – word2vec.py
■処理の流れ
1. ベクトル変換ツールword2vecをインポート
2. 類似する語句を表示する
1 2 |
# ベクトル変換ツールword2vecをインポート from gensim.models import word2vec |
1では、上記のファイルと同様、word2vecをインポートします。
1 2 3 4 5 6 |
# 類似する語句を表示 - 2 model = word2vec.Word2Vec.load("text_2.model") for word in ["私"]: words = model.most_similar(positive=[word]) n = [w[0] for w in words] print(word, "=", ",".join(n)) |
2では、モデル作成しておいたファイルを読み込んで、任意で決めたある単語に関する類似度を表示させます。
★word2vec.py★
1 2 3 4 5 6 7 8 9 10 11 |
# word2vec.py # ベクトル変換ツールword2vecをインポート - 1 from gensim.models import word2vec # 類似する語句を表示 - 2 model = word2vec.Word2Vec.load("text_2.model") for word in ["私"]: words = model.most_similar(positive=[word]) n = [w[0] for w in words] print(word, "=", ",".join(n)) |
– 3.2 出力結果
★用意したテキストファイル★

★形態素解析を行い、必要な品詞で分かち書きした出力ファイル★

★指定した単語の類似語句の表示結果★

最後まで読んで頂き、ありがとうございました。
機械学習や分析の分野に興味があり、pythonを学びたいと思っている方は是非こちらもどうぞ↓