2019/03/31
word2vecで自分のblogを分析する
あっという間に3月も終わりですね。この1か月超多忙でblogの更新回数も激減しました・・。今回も前回に引き続いて「word2vec」を使います。自分の書いたblogの内容を題材に分析しました。分析手順は以下の通りですが、作業のほとんどが前処理(2〜6)です。
1.blogのデータファイルをダウンロードする。
管理ページの「ツール」-「データバックアップ」を選択し、「全ての記事」の横の「ダウンロード」ボタンを押します。


2.ヘッダとフッダを削除する。
ヘッダとフッダを削除することは、「BODY:」〜「EXTENDED BODY:」の内容を抽出することと同じなので、以下の簡易なPythonコードで処理をしました。
inputfilename = "takacity.txt"出力ファイル(この場合はout_takacity.txt)は以下の通りです。
outputfilename = "out_takacity.txt"
Writeflg = False
with open(outputfilename, mode='w') as fo:
with open(inputfilename) as fi:
for s_line in fi:
print(Writeflg)
if s_line.strip() == 'BODY:':
Writeflg = True
elif s_line.strip() == 'EXTENDED BODY:':
Writeflg = False
if Writeflg == True and not (s_line.strip() == 'BODY:' or s_line.strip() == '-----'):
fo.write(s_line)

3.文章中の改行コードを削除する。
blog中のタグ類を削除する前に文章中の改行コードを削除して「1行の文」にしておきます。 VS codeの置換機能を使えば、簡単にできます。VS codeの「編集」ー「置換」を選択し、検索ワードに改行コード(\n)を入力します。この時、「正規表現」を利用するボタンを押しておきます。


4.文章中のプログラム部分(Syntax Highlighterを使っている部分)を削除する。
blogの中にはプログラムをSyntax Highlighterを用いて読みやすくした部分があります。<pre class=・・・>で始まり、</pre>で終わる中身です。この部分を削除するのに、再度VS codeの正規表現を用いた置換を行います。検索ワードは「<pre class=.*?</pre>」で置換ワードは何もなしで置換すると、Syntax Highlighterを用いた部分が一括で削除されます。大変便利です!

5.文章中のhtmlタグ類を削除する。
文章中にはまだhtmlタグ類が残っているので削除します。ネット情報を参考に以下のPythonコードを実行しました。
# coding: utf-8結果は以下の通りで、うまく取り除けました。
import io
from html.parser import HTMLParser
class MyHtmlStripper(HTMLParser):
def __init__(self, s):
super().__init__()
self.sio = io.StringIO()
self.feed(s)
def handle_starttag(self, tag, attrs):
pass
def handle_endtag(self, tag):
pass
def handle_data(self, data):
self.sio.write(data)
@property
def value(self):
return self.sio.getvalue()
inputfilename = "out_takacity2.txt"
outputfilename = "out_takacity3.txt"
with open(inputfilename) as fi:
s=fi.read()
with open(outputfilename, 'w') as fo:
string = MyHtmlStripper(s).value
fo.write(string)

6.1行の長い文を句点で分ける。
5.で前処理は一通り終わったのですが、mecabで処理する際に以下の「入力バッファサイズが大きい」と怒られたので、句点で一文一文改行してサイズを分ける処理を行いました。
input-buffer overflow. The line is split. use -b #SIZE例のごとく、VS codeの正規表現の置換を使います。大変重宝しています。


7.word2vecで分析する。
前回の『三国志』と同じように、以下のコマンドで「分かち書きファイル」を作成した後に(入力ファイル:out_takacity4.txt、分かち書きファイル:out_takacity4_wakachi.txt)、
$ cat out_takacity4.txt | mecab -Owakati >> out_takacity4_wakachi.txt以下のコマンドにてword2vecで学習させるとbinファイルが作成されます。
$ word2vec -train out_takacity4_wakachi.txt -output takacity.bin -size 200 -window 5 -sample le-3 -negative 5 -hs 0 -binary 1最後に、以下のコマンドで分析実行です。
$ distance takacity.bin結果は以下の通りでした。

R、Pythonの関連のあるワードを分析すると、お互いにPython、Rであることから、それなりに結果が導けているように思いました。的外れのワードもありますが、元々のテキストデータがblogのいろいろなトピックスをごちゃ混ぜにしているためだと考えました。カテゴリ別にテキストデータを整備し、分析すると違った結果が見えてくるかもしれません。そういう意味で、データの準備から入念に行う必要があると思いました。今回も大変勉強になりました。