【コード公開】【Python】テキストマイニングしてみた〜モデル作成〜





 


汎用性の広いPythonを0から習得するためのフロー及び実際にPythonで開発を行い開発案件を獲得するまでの筋道について解説しているチュートリアル資料と

コーディングの参考となる実際にPythonを使って作ったツールのソースコードを無料で配布していますので、こちらも併せてご覧ください。

初心者・入門者でも30日間で学習できるおすすめPython学習方法

 


おすすめのプログラミングスクールの比較・特徴をまとめた記事を執筆しております。

挫折することなく一直線にエンジニアを短期集中で目指している人はこちらから確認してください。

【比較表・無料体験あり】おすすめのプログラミングスクール3選!オンライン学習で完結!

 

Word2Vecについて

この記事を読み進める前に、よりテキストマイニングの内容を理解したい方は、下記のURLにてチェックしてみてください。

【Python】テキストマイニングとは〜分析の重要性〜

2018.03.28

「Word2Vec」とは、文章中の語句をベクトルに変換するツールです。単語同士の繋がりに基づいて単語同士の関係性をベクトル化するわけです。

ツール名通り、単語をベクトルとして表現することで、その単語の意味を捕らえる手法となります。つまり、語句と語句の類似度を測ることができるわけですね。

 

Gensimとインストールについて

Word2Vecを実現するツールとして、いくつか挙げられるライブラリがあります。

今回は、実行速度が速く、Pythonから手軽に利用できるものを考えると、「Gensim」ライブラリを使いたいと思います。この「Gensim」は、自然言語処理のためのライブラリです。

 

テキスト処理のための多くの機能を備えており、Word2Vec機能も備えています。「Gensim」はのインストールは、pipコマンド一発でインストール可能です。テキストマイニングを試しに行ってみたい方は利用してみてください。

以下にインストールのコマンドを記載します。

 

pip install gensim

 

モデル作成

今回は、model-making.pyとword2vec.pyの二つのファイルを作成します。

それぞれに行うプログラムを記載して説明していきます。

プログラムの概要

 

1 – model-making.py

 

■処理の流れ

1. python解析器janome,ベクトル変換ツールword2vecをインポート
2. 作成したテキストファイルの読み込み
3. 形態素解析
4. テキストを一行ごとに処理した内容を任意の品詞で抽出
5. 書き込み先のテキストを開く
6. word2vecでモデル作成

 

# python解析器janome, ベクトル変換ツールword2vecをインポート
from janome.tokenizer import Tokenizer
from gensim.models import word2vec
import re

 

1では、今回のテキストマイニングに必要なライブラリとして、python解析器janomeとベクトル変換ツールword2vecをインポートします。

テキスト一行ごとに処理を行う(データクレンジング)ため、正規表現マッチング操作を提供しているreもついでにインポートしておきます。

 

# テキストファイルの読み込み - 2
bindata = open("text_1.txt").read()
text = bindata

 

2では、任意で用意しておいたテキストファイル(何か文章を入力してあるファイル)を読み込みます。

 

# 形態素解析 - 3
t = Tokenizer()
results = []

 

3では、janomeを利用して形態素解析を行うため、インスタンスを作成しておきます。

 

# テキストを一行ごとに処理 - 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では、得られた形態素解析後の単語の品詞を必要な形で分かち書きさせていきます。

 

# 書き込み先テキストを開く - 6
text_file = "text_2.txt"
with open(text_file, "w", encoding="utf-8") as fp:
	fp.write("\n".join(results))

 

6では、用意しておいた任意のテキストファイルにて、結果をファイルに保存します。

 

# 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★

 

# 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. 類似する語句を表示する

 

# ベクトル変換ツールword2vecをインポート
from gensim.models import word2vec

 

1では、上記のファイルと同様、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))

 

2では、モデル作成しておいたファイルを読み込んで、任意で決めたある単語に関する類似度を表示させます。

 

★word2vec.py★

 

# 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))

出力結果

 

★用意したテキストファイル★

 

 

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

 

 

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

 

 

最後まで読んで頂き、ありがとうございました。

 

機械学習や分析の分野に興味があり、pythonを学びたいと思っている方は是非こちらもどうぞ↓

誰でも30日間で習得出来るpython学習法



ABOUTこの記事をかいた人

sugi

大学卒業後、IT企業に就職を果たす。システム開発・人工知能に触れながら大手企業と業務をこなす。2年半後脱サラし、現在フリーランス活動中。 2019年2月から起業する予定。 自社サービス及び製品を開発し、売り上げを立てている。