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のいろいろなトピックスをごちゃ混ぜにしているためだと考えました。カテゴリ別にテキストデータを整備し、分析すると違った結果が見えてくるかもしれません。そういう意味で、データの準備から入念に行う必要があると思いました。今回も大変勉強になりました。
スポンサーサイト



word2vecで『三国志』を分析する

 テキストデータの分析に以前から興味があります。先日、参加したセミナーで「word2vec」が話題に出たこともあり、早速使ってみました。

 まずは、word2vecのインストールです。以下の書籍やネット上にも情報がたくさんありますね。githubからファイル類をダウンロードし、ビルドする方法です。以下のコマンドを順に実行します。
$ git clone https://github.com/svn2github/word2vec.git
$ cd word2vec
$ make
簡単にインストールできました。書籍にはWikipedia英語版の全テキストデータを用いたデモプログラムがありますので、実行して動作確認しました。ワードを英語で入力すると、その関連語をリストアップしてくれたり、3つのワードA、B、Cを入力し、AとBの関係性からCに関係するワードを見つけてくれたりします。もの忘れが気になる今日この頃、大変便利です。

 次のステップはやはり、自分の分析したいテキストに対して、学習して実行させたいですね。ネット上には定番なのか?「青空文庫」のデータを使った事例が多くあります。そこで今回は、以前青空文庫で読み直したことのある、吉川英治著『三国志』の「桃園の巻」を題材にしました。劉備・関羽・張飛三人の出会いから、曹操による董卓暗殺未遂までのストーリーですね。

データ分析の流れは以下の通りです。
 ①テキストデータのダウンロード
 ②前処理(UTF-8変換、ヘッダー、フッダー、ルビ削除、第三水準の漢字の置換等)
 ③形態素解析(今回はmecabを利用して、分かち書きファイルを作成)、 
 ④word2vecで学習
 ⑤分析実行。
この中で②、③が大変面倒な作業です。②はネット上にPythonで自動化されている事例を見かけます。今回試してみましたが、完全にうまく行かなかったので、結局エディタを用いて手間をかけて、手作業で文字置換や削除を行いました。結構大変でした。

 ②の前処理したテキストはこんな感じです。前処理の話は後日、自動化がうまく行った時点で改めてお話しします。preprocess_text_190324.png ③の形態素解析は以下のコマンドで行いました。
$ cat sangokushi1.txt | mecab -Owakati >> sangokushi1_wakachi.txt
入力テキストファイル(sangokushi1.txt)に対し、mecabを実行して「分かち書きファイル(sangokushi1_wakachi.txt)」を作成します。「分かち書き」は英文のように単語単位で区分しスペースを入れた書き方です。wakachi_text1_190324.pngこんな感じです・・。コンピュータにとっては分かりやすくなるのかもしれませんが、正直、読みにくくなりました・・。
 ④は以下のコマンドを実行しました。
$ word2vec -train sangokushi1_wakachi.txt -output sangokushi1.bin -size 200 -window 5 -sample le-3 -negative 5 -hs 0 -binary 1
③で作成した「分かち書きファイル」を読み込み、ベクトル次元200で学習し、学習後のデータをバイナリファイル(*.bin)で出力します。テキスト容量が小さいせいか(本来の学習にはさらに膨大なテキストデータが必要なのか)?、瞬時に実行終了しました。
 ⑤は以下のコマンドを実行しました。
$ distance sangokushi1.bin
Enter word or sentenceに対し「ワード」を入れて実行しますが、「Out of dictionary word!」というエラーが出ました。word2vec_run1_190324.png原因は、学習に使った「分かち書きファイル」で姓・名(劉・備、関・羽等)が分断されていました。ある意味では正しいのかもしれませんが・・・。wakachi_text2_190324.png姓名を一つにまとめた形で取り扱いたいので、分かち書きファイルをエディタで編集し、④から再処理し、⑤を再実行しました。結果は以下の通りです。word2vec_run2_190324.png入力ワードに関連のあるワードが抽出されました。抽出されたワードのほとんどは「登場人物」でした。人物の人間関係の良/悪、敵/味方はともかく、何らかの形で関わりのあるワードが導き出されている結果は大変面白いですね。学習させるテキストの量が増えればそれなりに精度が上がり、異なる結果が得られると思います。ただし、前処理のやり方については、結果にダイレクトに効いてくるので、丁寧かつ慎重に行わなくてはならないと思いました。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

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

月別アーカイブ

メールフォーム

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