e-Stat でGoogle Custom Search APIを使おう(4)

Google Custom Search APIの検索結果と統計名の列名をマッチンングさせる

今回は、前回取得したGoogle Custom Search APIの検索結果と統計名の列名をマッチンングさせて社会的に関心の高い列名を取得してみたいと思います。

今回は「人権侵犯事件統計」 を取り扱ってみたいと思います。
人権侵犯事件統は、法務省の人権擁護機関で取り扱った人権侵犯事件及び人権相談に関する統計報告を集計したものとのことです。

e-Stat から統計データを取得する

まずはe-StatのAPIにアクセスして統計データを取得します。
将来的には新着の統計データを日時で取得して処理するようにしますが、今回は「人権侵犯事件統計」だけ取得します。

curl -s "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?appId=xxxxxxxxxxxxxxxxxx&lang=J&statsDataId=0003286680&metaGetFlg=Y&cntGetFlg=N&explanationGetFlg=Y&annotationGetFlg=Y&sectionHeaderFlg=1&replaceSpChars=0" -o "$STCSV"

統計データの中身を見てみる

"RESULT"
"STATUS","0"
"ERROR_MSG","正常に終了しました。"
"DATE","2022-01-21T09:58:51.856+09:00"
"RESULT_INF"
"TOTAL_NUMBER","403425"
"FROM_NUMBER","1"
"TO_NUMBER","100000"
"NEXT_KEY","100001"
"TABLE_INF","0003286680"
"STAT_NAME","00250010","人権侵犯事件統計"
"GOV_ORG","00250","法務省"
"STATISTICS_NAME","人権侵犯事件統計"
"TITLE","","人権侵犯事件 種類別 人権侵犯事件の受理及び
処理件数 (月次)"
"CYCLE","月次"
"SURVEY_DATE","201801"
"OPEN_DATE","2022-01-20"
"SMALL_AREA","0"
"COLLECT_AREA","該当なし"
"MAIN_CATEGORY","14","司法・安全・環境"
"SUB_CATEGORY","01","司法"
"OVERALL_TOTAL_NUMBER","0"
"UPDATED_DATE","2022-01-20"
"STATISTICS_NAME_SPEC","人権侵犯事件統計","","","","",""
"TITLE_SPEC","人権侵犯事件","種類別 人権侵犯事件の受理
及び処理件数 (月次)","処理の合計件数と,その内訳であ
る措置,措置猶予,侵犯事実不存在,侵犯事実不明確,打切>り,中止,移送及び啓発の各件数の合計とが一致しない場合>があるのは,1つの事件につき複数の措置を採る場合がある>こと等による。","","",""
"VALUE"
"tab_code","表章項目","cat01_code","人権侵犯事件の受理>・処理別","cat02_code","人権侵犯事件の種類別","time_code","時間軸(月次)","unit","value","annotation"
"100","件数","100","総数","100","総数","2021001111","2021年11月","件","1430",""
"100","件数","100","総数","100","総数","2021001010","2021年10月","件","1329",""

データの中身を見てみると"VALUE"から上がヘッダー的な項目で、データは"VALUE"以下にありそうです。
VALUE より上の行を削除しましょう。
sed でマッチした行より上を削除する方法ががあると良いのですがわからないのでgrepと組み合わせます。

grep -n でマッチした行数を取得できます。

sed -e “1,26d” で1行目から26行目までを削除できます

"tab_code","表章項目","cat01_code","人権侵犯事件の受理・処理別","cat02_code","人権侵犯事件の種類別","time_code","時間軸(月次)","unit","value","annotation"
"100","件数","100","総数","100","総数","2007000101","2007年1月","件","2170",""
.
.
"100","件数","100","総数","130","私人等に関するもの","2021001111","2021年11月","件","1230",""

VALUE以下の内容を見てみると「_code」はコードが入るだけなので無視して良さそうです。
表章項目も「件数」しかないので無視して良さそうです。
時間軸、unite、value、annotationもいらなそうです。
「人権侵犯事件の受理・処理別」は

"旧受"
"総数"
"新受_計"
"新受_申告_委員受"
"新受_申告_職員受"
"新受_人権擁護委員の通報"
"新受_関係行政機関の通報"
"人権侵犯事件の受理・処理別"

これは一旦は総数だけ使えば良さそうです

「人権侵犯事件の種類別」は

"総数"
"私人等に関するもの"
"私人等に関するもの_売春"
"私人等に関するもの_その他"
"私人等に関するもの_村八分"
"私人等に関するもの_交通事故"
"私人等に関するもの_人身売買"
.
.
.

人権侵犯事件の種類が並べられています。この部分から社会的関心の高いものを抽出できると良さそうですね。

抽出対象の列をどこにするのかも将来的に自動化したいのですが今回は固定で「人権侵犯事件の種類別」の列を抽出対象にしたいと思います。

mecabを使ってマッチングキーワードを最適化する

  cat "$STCSV"|$SED -e "1,$((vnum+1))d"|$AWK -F, '{print $6;}'|sed -e "s|\"||g"|sort|uniq;
"私人等に関するもの_売春"
"私人等に関するもの_その他"
"私人等に関するもの_村八分"
"私人等に関するもの_交通事故"
"私人等に関するもの_人身売買"
"私人等に関するもの_医療関係"
"私人等に関するもの_私的制裁"
"私人等に関するもの_差別待遇_女性"
"私人等に関するもの_差別待遇_その他"
"私人等に関するもの_差別待遇_外国人"
"私人等に関するもの_差別待遇_性自認"

「私人等に関するもの_交通事故」という文字列はニュースなどではそのまま使われないでしょうからそのままgoogle custom search  の検索結果にマッチングをかけてもダメそうです。
mecab   を使って文字列を分解してマッチングをかけたいと思います。

mecabはオープンソースの形態素解析エンジンです入力した文字列を構文解析してくれます。

echo "私人等に関するもの_差別待遇_女性"|mecab
私人	名詞,一般,*,*,*,*,私人,シジン,シジン
等	名詞,接尾,一般,*,*,*,等,トウ,トー
に関する	助詞,格助詞,連語,*,*,*,に関する,ニカンスル,ニカンスル
も	助詞,係助詞,*,*,*,*,も,モ,モ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
_	名詞,サ変接続,*,*,*,*,*
差別	名詞,サ変接続,*,*,*,*,差別,サベツ,サベツ
待遇	名詞,サ変接続,*,*,*,*,待遇,タイグウ,タイグー
_	名詞,サ変接続,*,*,*,*,*
女性	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
EOS

取り出すのは名詞だけで良さそうですし、名詞でも1文字だけのものは除外したほうが良さそうですね

echo "私人等に関するもの_差別待遇_女性"|mecab|grep "名詞"|awk '{print $1;}'|grep -v ^.$
私人
差別
待遇
女性

マッチングしてみる

このキーワードでgoogle custom search  の検索結果にマッチングをかけカウント数を取得して見ましょう。

11,私人等に関するもの_強制・強要_家族間のもの_親の子に対するもの
11,私人等に関するもの_社会福祉施設関係_施設職員によるもの
14,私人等に関するもの_差別待遇_同和問題(うち公務員によるもの)
18,私人等に関するもの_社会福祉施設関係_施設職員によるもの(うち公営の施設に従事する職員によるもの)
19,私人等に関するもの_プライバシー関係_インターネット(うち同和問題に関する侵犯)

インターネットがマッチしたのは良いのですが「同和問題」の中の「問題」の部分でカウント数を稼いでしまって思うような感じにはなりません。
「もの」とかもカウント数を稼いでいるので汎用的なキーワードを除外する処理を入れる必要がありそうです。

自動化の道のりは遠いですね。

プログラム

function getStatistics(){
  :
  #curl -s "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?appId=$ESID&lang=J&statsDataId=0003286680&metaGetFlg=Y&cntGetFlg=N&explanationGetFlg=Y&annotationGetFlg=Y&sectionHeaderFlg=1&replaceSpChars=0" -o "$STCSV"
}
function matchGcs(){
  #VALUEより上の行を削除する 
  vnum=$(cat "$STCSV"|grep -n "VALUE"|$AWK -F: '{print $1;}')
  echo "$vnum"
  cat "$STCSV"|$SED -e "1,$((vnum+1))d"|$AWK -F, '{print $6;}'|$SED -e "s|\"||g"|sort|uniq|while read line;do
    local mcnt=$(echo "$line"|mecab|grep "名詞"|awk '{print $1;}'|grep -v -e ^.$|while read word;do
      cat "$GCSCSV"|grep "$word"|wc -l      

    done| awk '{sum+=$0} END{print sum;}');
    echo "$mcnt,$line"

  done|sort|uniq|sort -n  

}
function main(){
  #統計名でgoogle cloud searchを検索する
  getGcs;<---前回作成したもの
  #統計データを取得する
  getStatistics;
  #統計データの列情報とgoogle cloud searchの検索結果をマッチングする
  matchGcs;

}

main;
exit;

書籍の紹介

【grep特集】ざっくりわかるシェルスクリプト4

【grep特集】ざっくりわかるシェルスクリプト4

e-Stat でGoogle Custom Search APIを使おう(3)

e-Stat でGoogle Custom Search APIを使おう(3)