2018.01.18 Thu |
テキスト解析入門その4(2-gramとネットワーク図)
この記事は、以前書いた以下の記事の続編です。
テキスト解析入門その1
http://ritsuan.com/blog/8035/
テキスト解析入門その2
http://ritsuan.com/blog/8138/
テキスト解析入門その3
http://ritsuan.com/blog/8164/
今回は、単語の2-gramとネットワーク図による可視化を行いたいと思います。
今回は、平成29年9月25日の安倍内閣総理大臣記者会見の安倍首相の演説文を扱います。
https://www.kantei.go.jp/jp/97_abe/statement/2017/0925kaiken.html
このリンク先の記事の安倍首相の発言だけを取り出し、ファイルに保存します。ファイル名を、Abe925.txt として保存します。
そして、そのファイルがあるディレクトリに移動してください。
MeCabなどの環境設定は、以下の以前の記事を参照してください。
テキスト解析入門その2
http://ritsuan.com/blog/8138/
それでは、パッケージの読み込みから始めましょう。
library(RMeCab)
以下、wordpressの仕様上ダブルクオテーションが全角に表示されてしまっています。実行の際は半角にしてください。
2-gramの実行
result = docDF(“Abe925.txt”, type = 1, pos =c(“名詞”,”形容詞”), N = 2, nDF = 1)
ここで、type = 1としているのは、形態素解析の実行の指示で、
pos =c(“名詞”,”形容詞”)としているのは、名詞と形容詞を取り出す指示で、
N = 2は、2-gramの指示、
nDF = 1は、2-gramの二つの単語を別々の列にするように指示しています。
結果の頭出し
head(result, n=20)
ここで、4列目の列名を、Freqにします。
colnames(result) = c(“N1″,”N2″,”POS1″,”POS2″,”Freq”)
次に、Freq列で降順に並び替えます。
library(dplyr)
result2 = arrange(result,desc(Freq))
結果の頭出し
head(result2, n=20)
POS2の成分の中に”数”がある行名を把握してからその行ごと消去しましょう。
ind = grep(“数”, result2$POS2)
POS2列に”数”がある行数の頭出し
head(ind, n=10)
POS2列に”数”がない行の抽出
result3 = result2[-ind,]
結果の頭出し
head(result3, n=20)
グラフ化する前に、Freq列が4以上のものだけ取り出します。
result4 = filter(result3, Freq >= 4)
さて、ここで、グラフ化してみましょう。
まずは、igraphパッケージをロードします。
library(igraph)
データ型をデータフレーム型からグラフ型へ変換します。
graph = graph_from_data_frame(result4)
作成されたグラフデータ
graph
グラフデータができたのでこれを可視化してみましょう。
plot(graph)
エッジ(→)に出現頻度を反映してみましょう。
E(graph)$weight = result4$Freq
ここでは、tkplot関数を用います。Macの方はできない方もいると思いますが、その際は、plot関数を使用してください。
tkplot(graph,edge.width=E(graph)$weight,vertex.color = “SkyBlue”)
これで出力したら、上のタブのLayoutからCircleを選択してください。
Macの方は以下コマンドを実行してください。(上とはかなり違う結果になりますが)
plot(graph,edge.width=E(graph)$weight/3,vertex.color = “SkyBlue”,vertex.size = 5)
このようにどの単語の次にどのような単語が出てくるかを集計可視化したものが、2-gramのネットワーク図になります。
今回は以上になります。
鈴木瑞人
東京大学大学院新領域創成科学研究科メディカル情報生命専攻博士課程
実践的機械学習勉強会 代表
株式会社パッパーレ 代表取締役社長
NPO法人Bizjapan テクノロジー部門BizXチームリーダー