(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【R言語】入力した文字列を一意の数値として出力して変換する

スポンサーリンク

はじめに

Twitterのホットトピック取得については、こちらで紹介しました。

今回は上記記事の手法でホットトピックを取得し、2017/6/17にあったAKBの総選挙の際のトピック遷移を可視化してみました。

話題ワードTop20から、24時間分のTop10を10分毎に表示しています。
大きさは、ランキング上位なものほど文字のサイズを大きくしています。
f:id:mtiit:20170819200700g:plain

この画像を作成するにあたって行った、
文字列 → 数値 への変換について当記事では紹介します。

ポイント

同じワードは同じ位置に表示させたいため、同じ文字列から同じx座標、y座標を生成する必要があります。
今回は、R言語にて Message Digest 5 を用いました。

パッケージをインストールすると、

> library(openssl)
> md5("hoge")
[1] "ea703e7aa1efda0064eaa507d9e8ab7e"

のように 文字列"hoge"から"ea703e7aa1efda0064eaa507d9e8ab7e"といったハッシュ値が生成されます。


文字列"hoge"からx座標とy座標を生成するために、md5で生成された文字列から[a-z]を抜いて、整数に変換しています。
y座標は、文字列を反転させて(hogeならegoh)同じ処理をしています。

> as.integer(substr(gsub("[a-z]","",md5("hoge")),0,5))
[1] 70371
> as.integer(substr(paste(rev(strsplit(gsub("[a-z]","",md5("hoge")),NULL)[[1]]),collapse=""),0,5))
[1] 78970

あとは、上で取得した座標位置に text 関数 で 文字を貼付けてplot画像を生成しました。
文字の色も、md5の値を使って文字列から一意になるようにしています。*1

一応、ソースコード全文は以下に掲載しておきます。
ひらがなをplotに図示するために par(family="HiraKakuProN-W3") という設定を入れています。

library(openssl)
tweet_mat <- matrix(scan("上位20位がカンマ区切りで記載されているファイルパス",what=character(),sep=","),nrow=20)
par(family="HiraKakuProN-W3")
for (i in 1:144)
  {
  plot(-10,10,xlab="",ylab="",xlim=c(-2.4,2.4),ylim=c(-1.2,1.2))
  for (j in 1:10)
  {
    tweet_x <- 2-4*as.integer(substr(gsub("[a-z]","",md5(tweet_mat[j,i])),0,5))/100000
    tweet_y <- 1-2*as.integer(substr(paste(rev(strsplit(gsub("[a-z]","",md5(tweet_mat[j,i])),NULL)[[1]]),collapse=""),0,5))/100000
    tweet_col <- as.integer(substr(gsub("[a-z]","",md5(tweet_mat[j,i])),0,5))%%8 + 1
    text(x=tweet_x,y=tweet_y,labels=tweet_mat[j,i],cex=(10-j)/5+0.5,col=tweet_col)
  }
  filename <- paste("./hoge/file",i,".png",sep="_")
  dev.copy(png,file=filename)
  dev.off()
}

また、元ファイルがSJISでない場合も文字化けする可能性があります。

# nkf -g test.csv

で文字コードを確認し

# nkf -s --overwrite test.csv

で必要に応じて変換してください。

以上です。

*1:また、気が向いたら md5 での 文字列→数字 の生成部分が乱数のように機能しているのか検証してみたいです。