fc2ブログ

word2vecで自分のblogを分析する

 あっという間に3月も終わりですね。この1か月超多忙でblogの更新回数も激減しました・・。今回も前回に引き続いて「word2vec」を使います。自分の書いたblogの内容を題材に分析しました。

 分析手順は以下の通りですが、作業のほとんどが前処理(2〜6)です。

1.blogのデータファイルをダウンロードする。
 管理ページの「ツール」-「データバックアップ」を選択し、「全ての記事」の横の「ダウンロード」ボタンを押します。blogdata1_190331.png過去書いたblogの内容がテキストファイルでダウンロードされます。ファイルの中身は以下の通りで、各投稿につき、ヘッダとフッダが付いていました。blogdata2_190331.png
2.ヘッダとフッダを削除する。
 ヘッダとフッダを削除することは、「BODY:」〜「EXTENDED BODY:」の内容を抽出することと同じなので、以下の簡易なPythonコードで処理をしました。
inputfilename = "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)
出力ファイル(この場合はout_takacity.txt)は以下の通りです。preprocess1_190331.png
3.文章中の改行コードを削除する。
 blog中のタグ類を削除する前に文章中の改行コードを削除して「1行の文」にしておきます。 VS codeの置換機能を使えば、簡単にできます。VS codeの「編集」ー「置換」を選択し、検索ワードに改行コード(\n)を入力します。この時、「正規表現」を利用するボタンを押しておきます。preprocess2_190331.png置換ワードは何もなしで置換すると、改行コードがすべて削除され、こんな感じになります。preprocess3_190331.png
4.文章中のプログラム部分(Syntax Highlighterを使っている部分)を削除する。
 blogの中にはプログラムをSyntax Highlighterを用いて読みやすくした部分があります。<pre class=・・・>で始まり、</pre>で終わる中身です。この部分を削除するのに、再度VS codeの正規表現を用いた置換を行います。検索ワードは「<pre class=.*?</pre>」で置換ワードは何もなしで置換すると、Syntax Highlighterを用いた部分が一括で削除されます。大変便利です!preprocess4_190331.png
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)
結果は以下の通りで、うまく取り除けました。preprocess5_190331.png
6.1行の長い文を句点で分ける。
 5.で前処理は一通り終わったのですが、mecabで処理する際に以下の「入力バッファサイズが大きい」と怒られたので、句点で一文一文改行してサイズを分ける処理を行いました。
input-buffer overflow. The line is split. use -b #SIZE
例のごとく、VS codeの正規表現の置換を使います。大変重宝しています。preprocess6_190331.png置換後は以下の通りです。preprocess7_190331.png
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
結果は以下の通りでした。BlogAnalysisResult_190331.png
 R、Pythonの関連のあるワードを分析すると、お互いにPython、Rであることから、それなりに結果が導けているように思いました。的外れのワードもありますが、元々のテキストデータがblogのいろいろなトピックスをごちゃ混ぜにしているためだと考えました。カテゴリ別にテキストデータを整備し、分析すると違った結果が見えてくるかもしれません。そういう意味で、データの準備から入念に行う必要があると思いました。今回も大変勉強になりました。
スポンサーサイト



コメント

非公開コメント

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: