著者:中央大学 教授 飯尾淳
今回は、いかにもデータ分析といった例題に取り組みます。題材は、簡単な自然言語処理。数十篇のコラム記事を対象として、記事の自動分類に挑戦します。対象とする記事群を、クラスタリングという処理で分類します。クラスタリングとは、特定の多次元空間にマップされたデータ群を、様々な方法でいくつかのまとまりに整理する方法です。
それぞれのデータは、「距離の近さに応じて」まとめられます。ここで計算される距離を、数学では絶対値の記号を用いて|x| と表します。ほら、バーティカルバーが出てきましたね。
また、近いデータを集めて樹形図としてまとめていく方法もよく用いられます。このようにして描く樹形図のことを、デンドログラムといいます。今回、描いてみようとするデンドログラムは図 1 のようなものです。ここにも多数の棒が描かれています。
今回のバーティカルバー劇場、役者は「距離」と「デンドログラム」の二人です。
記事本文掲載のシェルスクリプトマガジンvol.49は以下リンク先でご購入できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#!/bin/bash num=(`seq -w 1 99`) i=0 echo ==== step 1 ============================================================= if [ ! -d HTM ]; then mkdir HTM; mkdir HTM/originals fi echo -n preparing config file "... " while read line do echo url = \"${line}\" echo output = \"HTM/originals/file${num[$i]}.html\" i=$(($i + 1)) done < links.txt > curl_config.txt echo done curl --config curl_config.txt vim -es HTM/originals/file14.html +':norm 7GJ' +':wq' echo ==== step 2 ============================================================= i=0 for f in HTM/originals/* do echo -n processing `basename $f` "... " fname=`grep '<title>' $f | sed -e 's/<title>//' -e 's/ |.*//' \ -e 's/ /_/g' -e 's/\?/?/'`.html cp $f HTM/${num[$i]}_$fname i=$(($i + 1)) echo done done echo ==== step 3 ============================================================= if [ ! -d TXT ]; then mkdir TXT; fi for f in HTM/[0-9]* do echo -n processing `basename $f` "... " output=TXT/`basename $f .html`.txt cat $f | \ ruby -e 'require "nokogiri"; \ puts Nokogiri::HTML(STDIN) \ .css(".entry")[0].content' | \ awk '/本文中のリンク・関連リンク/ { exit } { print }' > $output echo done done echo ==== step 4 ============================================================= if [ ! -d MPA ]; then mkdir MPA; fi for f in TXT/* do echo -n processing `basename $f` "... " output=MPA/`basename $f .txt`.dat cat $f | juman | \ grep -v '^@' | grep -v EOS | \ grep -E '名詞|形容詞' | \ grep -v -E '非自立|接尾辞|接頭辞|指示詞|形式名詞|固有名詞|数詞' > $output echo done done echo ==== step 5 ============================================================= if [ ! -d WRD ]; then mkdir WRD; fi for f in MPA/* do echo -n processing `basename $f` "... " output=WRD/`basename $f` cat $f | cut -f 1 -d ' ' | grep -v '^$' | sort > $output echo done done cat WRD/* | sort | uniq -c | sort -nr | \ awk '($1 >= 5) { print $2; }' > freq_5.csv echo ==== step 6 ============================================================= if [ ! -d DAT ]; then mkdir DAT; fi for f in WRD/* do echo -n processing `basename $f` "... " output=DAT/`basename $f .dat`.csv ./wrdvec.rb $f > $output echo done done cat DAT/* > all.csv echo ==== step 7 ============================================================= R < mkgraph.R --no-save convert -rotate 90 cluster.png cluster2.png |