Does it taste good?

「そんなことも知らないの?」って言わないでほしい。

2020年のTokyo.Rを振り返る

この記事は R Advent Calendar 2020 25日目の記事です。*1

はじめに

Tokyo.Rは、R言語の地域コミュニティ@東京です。定期的にR言語に関する勉強会を開催しています。

公式広報用Twitter @TokyoRCommunityにおいて主な告知を行っております。また集客はconnpassを用いて行っています。

Tokyo.Rはチームで運営しています。以下の運営メンバー(敬称略)の皆で協力しながら運営を進めています。自分一人の力では到底成し遂げられないもので、運営メンバーにはいつも色々な面で助けていただいています。本当にいつもありがとうございます。

今年のTokyo.Rについて、運営側からのまとめ、開催にあたって何をしたか、各回で何があったかなどをお届けしたいと思います。 この記事では自分、@kyyonko目線から語らせていただきます。

Tokyo.Rのチーム運営はどうやって行っているのか

まず、Tokyo.R運営チームがどのように活動しているのかについて簡単にお話します。

ありきたりかと思いますが、Tokyo.R運営は運営専用のSlackを持っており、そこでやり取りを行っています。皆それぞれの空き時間にSlackで連絡を取り合っています。

Tokyo.R運営チームは、詳細は割愛しますが、個々で役割を分担しています(例えば、全体のタスクの進捗管理、司会、受付、初心者セッションの登壇、金銭管理、connpassやGoogleフォーム作成、会場や登壇者との調整、その他こぼれ球を拾う雑務←これが意外とある笑)。

またリアル開催時は会の終わりに運営のみでの打ち上げ、オンライン開催時は会が終わる度運営のみでZoom会議を行ったりなどの口頭でのコミュニケーションも行っております。

今年のR勉強会一覧

第83回R勉強会@東京(#TokyoR)

  • 2020/01/25(土) 14:30 〜 19:00
  • リアル開催

第84回R勉強会@東京(#TokyoR)

  • 2020/04/04(土) 14:30 〜 19:00
  • オンライン開催(初)
  • 応用セッションなし、LT主体で行いました。

第85回R勉強会@東京(#TokyoR)

  • 2020/05/23(土) 14:30 〜 18:30
  • オンライン開催
  • この会から100円参加費をいただくようにしました(詳細は後述)
  • 自己紹介にチャレンジした(詳細は後述)
  • 初心者セッション、応用セッション、LTといういつもの構成

第86回R勉強会@東京(#TokyoR)

  • 2020/06/27(土) 14:30 〜 18:30
  • オンライン開催
  • 自己紹介にチャレンジした(詳細は後述)
  • 初心者セッション、応用セッション、LTといういつもの構成

第87回R勉強会@東京(#TokyoR)

  • 2020/08/01(土) 15:00 〜 18:00
  • オンライン開催
  • 自己紹介を諦めてアンケート形式にした(詳細は後述)
  • 初心者セッション、応用セッション、LTといういつもの構成

第88回R勉強会@東京(#TokyoR)

  • 2020/09/19(土) 12:30 〜 15:00
  • オンライン開催
  • ゲストとしてExploratoryCEOの西田さんがご登壇してくださいました!(米国からリモート出演!)(開催時刻が若干変則的だったのはそのため)
  • その後は初心者セッション、応用セッション、LTといういつもの構成

2020年、Tokyo.Rは上記の通り、6回開催致しました。

これに加え、

がありました。

こちら2つの勉強会については、Tokyo.R運営チームと運営母体が若干異なる(運営協力は行っています!)ので詳しい話は致しませんが、これらと時期がかぶらないよう、Rの勉強会としては全8回、うまく約1.5ヶ月に1回、という例年通りのペースでできたのではないかと思っています。

各回振り返り

この章では主な起こったできごとについて振り返って行きたいと思います。(裏話多め)

1月、2020年唯一リアルでできた回:第83回

リアル(会場をお借りして、現地に集まって)発表→全員一言ずつ自己紹介→発表→会場内で立食形式の懇親会、という過去約82回行ってきたいつもの流れで行いました。

前節の役割分担において、自分は2019年までは主に受付と雑務周りを担当することが多かったのですが、運営内で役割分担の変化があり、2020年から司会(オープニングも)を自分が担当することになりました。 過去司会補助は行ったことがあるもの、本格的にメインとして司会を行うのは初めてで緊張しましたが、無事に会を実施でき、懇親会も楽しくできたと思います。

4月、オンライン開催に踏み切るに至るまでと初オンライン開催開催:第84回

2月、リアル開催のピンチ

本当は従来どおり、2月か3月に会場をお借りしてリアルでの開催を予定しており、お借りいただく会場も決まっており、2月中旬にはスムーズに調整を進めていました。

しかし、皆さん御存知の通り、2月下旬頃から新型コロナウィルスが猛威を振るい始め、大人数が集っての勉強会の開催ができなくなりました。

当然Tokyo.Rもこの影響で、2月に開催を予定していた会場様より「開催を見送りたい」との連絡が入り、世情を鑑みても2月のリアルでの開催を見送らざるを得ませんでした。

kyyonko個人として忘れられない記憶としては、2/17〜2/22から会社の出張でインドネシアに行っていました(人生初の海外出張)。この時期はまだコロナが出始めた頃で、諸々の自粛要請が出るギリギリ直前の時期でした。インドネシアでは感染者ゼロな時期でした。*2

2/17日本時間夜にインドネシアの空港に到着し、やっと現地の空港でwifiが繋がってスマホを開くと、Tokyo.RのSlackに大量の通知があり、会場を借りての実施が難しいとの旨について皆が大混乱を起こしており、自分自身も肝心の会社のSlackには「とりあえず無事到着しました」とだけ報告し(あとは同行していた先輩社員に色々任せて)、空港からホテルに向かうタクシーの中でひたすらTokyo.R運営とこれからどうするか必死でSlackしていた記憶しかないです笑(念願の初の海外出張だったのに…笑)

4月のオンライン開催に至るまで

コロナの影響で、これまで定期的に開催していた勉強会が今年度はぴったり止まってしまうものも多くあると思います。

Tokyo.Rもこれからどうするかについて色々考えました。 結果、オンラインツールを用いてのオンライン開催を実施することに決めました。

オンラインツールといえど色々種類もあり、無料で使える範囲、有料で使える範囲(とくに許容できる人数)・機能など様々で、当然ながらこういった状況は運営メンバー全員初体験だったので、色々話し合いました。

結果、Zoomの少々の有料プランを用いて行うことに決定しました。

4月、初オンライン開催

少し1月から間をおいてになりましたが、無事オンライン開催にこぎつけることができました。

自分個人としてはオンライン初司会に非常に緊張しました。 何か話しても反応が返ってこない(視認できない)というのはとてもやっていて難しいと思いました。

この回では、参加枠を無料にしており、多数ご希望をいただき一瞬で参加枠が埋まったのはよかったのですが、あまりに希望数が多すぎたこと、「無料だからとりあえず参加した」という方が多く、実際の出席率が低く、これまで何度かいらしていたり、本気で参加をご希望されていた方の参加ができなくなってしまった、という事象が発生してしまいました。 もちろん気軽に参加登録していただくことについて強く否定はしませんが、やはり本気で「R勉強会に参加したい!」という方の参加がかなわないのは悲しいことだと思いました。

LT主体で、多数の方に発表していただき、ありがたいことに勉強会自体は有意義なものになりました。 これなら継続してオンライン開催もやっていけるのでは、という機運になりました。

5月、参加費の導入、自己紹介のチャレンジ:第85回

参加費の導入

上記の「本気で参加したい人が参加できない」「無料にしてしまうと出席率が著しく低下してしまう」という問題の解決のため、恐縮ですが、参加費としてconnpassでの参加登録の時点で100円を参加者の皆様にいただくことに致しました。(発表者は無料) 少額とはいえ金銭が発生することに加え、connpass登録時にPayPalでの決済処理を挟むので、「無料だから気軽に〜…」という方にとって少しだけ参加へのハードルを上げさせていただき、可能な限り本気で参加したい方々、出席をしていただける方々に参加いただけるようにした次第です。

この効果はあり、ありがたいことに出席率が上昇し、参加者の方にもご満足いただけるようになりました。

「参加者全員に数秒自己紹介タイム」のチャレンジ

これまで、リアル開催時は、「自己紹介タイム」を設け、参加者全員にマイクを渡し、「(あれば)SNS名、職種、業種、その他Rについて思っていること」などについて数秒で自己紹介いただき、参加者同士も同業種・職種の方であれば同志を見つけあったり、異業種・職種の方々も見聞を広げるいい機会として大事にしておりました。 また、リアル開催時には懇親会で直接語り合い、その後の繋がりを作るきっかけともなっていました。

Tokyo.Rにおいてこの自己紹介タイムはとても大事なものであると考えており、オンライン開催になっても実施したいと考え、Zoom上で参加者の名前を順番に読み上げて、自己紹介を数秒でしていただく(そのときだけZoomのマイク音をONにして話してもらう)ということにチャレンジしました。

結果起こったこととしては

  1. リアル開催の場合、マイクが隣の人に順番に回っていくので、ある程度自分の番が予測でき、参加者も心構えができたが、Zoom開催の場合、いつ自分が呼ばれるかわからないので各自、自己紹介の準備ができない
  2. 1の影響もあり、マイクがミュートになったままであったり、参加者それぞれの視聴環境によってはマイクが起動しない、機器の不具合などがあり、自己紹介がスムーズに進まない
  3. 「〇〇さん、お願いします!」と呼んでもいらっしゃらない方がいたりする(機器トラブルなのか、実際に不在なのかがわからない)

という現象でした。 この回(第85回)はなんとか自己紹介タイムをやりきったのですが、あまりにスムーズにいかず、これは再考が必要だという話になりました。

6月、自己紹介タイムの改善と再チャレンジ:第86回

自己紹介タイムについて、前節の「1」(自分の自己紹介順番がいつ回ってくるのかわからない)のために、スプレッドシートに参加者を記載し、それを投影して、順番に自己紹介をしていただきました。

それでも機材トラブルの影響などで自己紹介がスムーズに行かないケースが多発しました。 この回から勉強会実施後にGoogleフォームを用いて参加者にアンケートを行うようになり、その項目の1つに「自己紹介タイムは必要か?」という項目を入れてみたところ「あったら嬉しいが、なくても支障はない」というご意見を一定数頂いたので、次回からは、参加者にマイクONで自己紹介してもらうことは見送るという決断をしました。

8月、自己紹介アンケート化とオンライン開催の慣れ:第87回

このあたりになってくると、徐々に運営メンバーのオンライン開催の主催も慣れてはきました。

自己紹介タイムについては撤廃し、代わりに会の始まり時、参加者Zoomに入室していただいた際に、Googleフォームでアンケート形式で職種や業種、どこの地域からご参加されているかなどを回答していただき、その結果を休憩時間に画面共有で投影したりしてみました。

これと前述の運営の慣れもあり、会の運営自体はスムーズに進んだと思います。

9月、ExploratoryCEOの西田さんアメリカからのリモート登壇:第88回

この回では、特別ゲストとしてExploratoryCEOの西田さんアメリカからリモートでご登壇いただきました。 こういった国を跨ぐ柔軟性はオンラインならではだと思います。素晴らしい発表でした。 時差のため、多少開催時間が従来と異なるのでその点の告知だけは気をつけました。

10月、12月、10年RとJapanR

前述の通り、 * 10月に10年.R * 12月にJapan.R があり、一旦「Tokyo.R」の開催としては9月がラストということになりました。

そう、今年はTokyo.R第1回の開催からちょうど10年のアニバーサリーイヤーなんです…! (自分は10年丸々の参加ではなく、5年ほど前からの参加ですが) 10年間、続いていることは素晴らしいことです。10年.Rの主催のakiaki5516さん、お疲れ様でした。 どうやら10年.Rは第2回がある…(!?)そうなので、そちらも楽しみです。 (Toky.oR運営チームもまた協力できると嬉しいです)

オンライン開催での大変だったこと、良かったこと

大変だったこと

Zoomの扱い

まずはやはりZoomの扱いですね…扱ったことのないツール、プランはどれがいいのか、各種機能…新たに学ばなければならないことがたくさんありました。 Zoomに関しては@kotatyamtemaさんを中心に、@wonder_zoneさん、@y__mattuさんが主に担当してくださいました。ちなみに司会・雑務担当の自分はZoom全くわかりません…苦笑。メンバーで役割分担できてよかったと思っています。

参加者のリアルタイムの反応

司会として、反応が視認できないということに関してのやり辛さはやはりなかなか慣れないものでした。発表者の方も同じ気持ちではないでしょうか。各セッションにおいてもリアル開催の場合、笑いが起こったり、真剣に聞いている表情が見られたりして良いのですが、Zoomでのチャット、あるいは#TokyoRでのTwiiterでの投稿でしか参加者のリアルタイムの反応が視認できません。こういったところに書き込むことが苦手な方もいらっしゃいます。(仕方のないことと思います)

自己紹介タイム、懇親会の断念

Tokyo.Rはただセッションを聴講してRに対する知見を深めることだけではありません。 自己紹介やその後の懇親会を通じて「仲間」「友人」など様々な「縁」を作り出すことが、ある意味前者よりも大切にしています。 しかし、オンライン開催という制約上、そういったことが困難であり、断念せざるを得ませんでした。 自己紹介は前述の通り、懇親会も可能といえば可能ですが、やはりリアル開催ほどカジュアルにならないこと、そしてツールをまだ使いこなせていないということで今年度は断念しました。

発表者探し

オンライン開催での発表はリアル開催に比べ、なかなかハードルが高いのか、発表をしていただく方を探すのが少し大変でした。 特に応用セッションに関しては特定の方々に発表が集中してしまったかなと思いますし、LT枠もなかなか埋まらず自分が泣きついてお願いしたこともありました笑(しかも誤字ってる) (この回はご厚意でLTしてくださる方が声掛けてくださってとても助かりました&この場を借りて感謝致します…)

良かったこと

毎回しっかり定員が埋まった

80人という、毎回それなりの数の定員を設けているのですが、ありがたいことにほぼ全部の回で満席になりました! オンラインなのでどうかとはじめは不安でしたが、毎回枠が埋まっていくのを見ていくのはとても嬉しいものでした。

関東圏在住以外の方以外の参加者が多かった

会の始まりに行っている自己紹介代わりのアンケートから、関東圏以外の方の参加者がコンスタントに4分の1程度いらっしゃることがわかりました。

そして会の終わりのアンケートにおいても「関東から離れたところに在住しているので、オンライン開催が嬉しかった」とのコメントをいただけており、それについても嬉しく思っております、

R勉強会としての「質」を維持できた

リアル開催時から、毎回Tokyo.Rはありがたいことにご好評いただいていたのですが、オンライン開催になっても各種セッション・コンテンツにおいてご満足いただけていることに非常に安堵しております。 こちらについては、運営側だけでなく、ご発表いただいている方のお力も大きいと思います。 運営側としては、初心者セッションの質の維持と、発表者の方が円滑にご発表いただける環境作りに今後も努めて行きたいと思っております。

Tokyo.Rの今後

やはりリアル開催がしたいが、おそらくしばらくはオンライン開催が続く

リアルで発表し、自己紹介を行い、懇親会を行い、知見と人と人との縁を作るのがTokyo.Rの大切なことだと考えているので、やはり事態が落ち着いたらリアルでの開催ができたらいいなと思っています。 ただ、現状新型コロナウィルスの状況が落ち着く見込みがありませんので、しばらくはオンライン開催が続くことになると思います。

リアル開催になったとき、地方在住の方に向けての配信はどう行うか?

前述の通り、「関東から離れたところに在住しているので、オンライン開催が嬉しかった」とのコメントを多くいただいております。こういったコメントをいただくと嬉しく思う反面、リアル開催が復活した場合、こういった方のご参加が難しくなってしまうことは避けられず、心苦しくも思います。 ライブ配信すればええやん、と思うかもですが、そうなってくると機材や配信環境の整備にまた頭を悩ますことになり、発表者の方にも多少の苦労をかけてしまうことになるかと思います。

しばらくはオンライン開催が続くことになると思うので、今はあまりこの点について頭を悩ますことにしないことにしていますが、時間が経つにつれ、しっかり向き合っていかない課題だと思っています。

開催頻度

開催頻度は以前から1〜1.5ヶ月に一度程度で、今年もこれを保つことができました。 次年度もこの程度の開催頻度を維持しようと思っています。ちなみに次回は1/23(土)オンライン開催予定です。(connpassなどでの募集は後日スタート予定です) 是非Tokyo.R告知用Twitterconnpassなどをチェックしてみてください!

さいごに

今年の、この未曾有のコロナの状況下においてもTokyo.Rを開催できたのは、運営メンバー全員のチームワーク、ご登壇いただく方のお力、そしてなによりご参加いただいている皆様のおかげです。 来年以降も頑張っていきたいと思っておりますので、引き続きよろしくお願い致します!

*1:2日ほど遅れました。申し訳ございません。

*2:これは本当にどうでもいい話ですが、出張期間中に各種自粛要請(出張禁止令など)が出始め、思わず上司に「あの…私達、日本に帰れますよね?」と相談してしまった(もちろん帰れた)

Tesseract-OCRとPyOCRで遊ぼう_2019秋

きっかけ

  • 画像ソースしかないコードをテキスト(ってか.Rや.sql)で取得したかったけれども、全文打ち込むのが面倒だった

tesseract概要

punhundon-lifeshift.com

  • 画像から文字起こしする技術を光学文字認識(Optical Character Recognition)という。略してOCR
  • OCRを実施できるソフトウェアに、Googleが開発元の「テッセラクト(tesseract)」というものがある。「tesseract-OCR」とも呼ばれる。
  • tesseract-OCRオープンソース
  • tesseract-OCRPythonで使えるようにするためのライブラリが「pyocr」

インストール

MacなのでHomebrewで入れる。

github.com

依存パッケージ①

brew install automake autoconf libtool
brew install pkgconfig
brew install icu4c
brew install leptonica
brew install gcc

ちなみに、

In order to prevent conflicts with Apple's own libtool we have prepended a "g"
so, you have instead: glibtool and glibtoolize.

と出たので、

brew install glibtool glibtoolize

とやったけど、そんなのないよって言われた。。

依存パッケージ②

brew install pango

本体

このあたりを参考にしつつ、

git clone https://github.com/tesseract-ocr/tesseract/
cd tesseract
./autogen.sh
./configure
make
sudo make install  # if desired
sudo ldconfig
make training # if installed with training dependencies

あとpyocr

sudo pip install pyocr

で入った。

辞書

日本語の辞書はここ。

github.com

本体インストール時に入っていなかったら

/usr/local/Cellar/tesseract/4.1.0/share/tessdata

に入れておく。*1

実践

まずはコマンドラインから

Pythonで日本語OCRを行うときのメモを参考に「笑顔が一番!れにちゃん」の画像を用意して、

tesseract ocr_test.png out -l jpn

と実行すると結果が以下(※外部テキストout.txtに出力される)

笑 顔 が 一 番 ! れ に ち ゃ ん

tessteractのバージョンが上がったからか、Qiitaのときよりも精度上がってる気がする。

Python

Pythonで日本語OCRを行うときのメモTesseract+PyOCRで簡易OCRを試してみるを参考に。

引数で画像ファイルと使用言語指定できるようにした。

import pyocr
import pyocr.builders
import argparse
from PIL import Image

parser = argparse.ArgumentParser(description='tesseract ocr test')
parser.add_argument('image', help='image path')
parser.add_argument('lang', help='choose language')
args = parser.parse_args()

tools = pyocr.get_available_tools()

if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
# The tools are returned in the recommended order of usage
tool = tools[0]

res = tool.image_to_string(Image.open(args.image),
                           lang=args.lang,
                           builder=pyocr.builders.TextBuilder(tesseract_layout=6))

print(res)

これをexample_2.pyとし、*2

$ python example_2.py ocr_test.png jpn
笑 顔 が 一 番 ! れ に ち ゃ ん

他にも色々試してみたけれども、なかなか英語中心に使える感じ。

終わりに

この手の話はPythonだろうなと思ったけど、やっぱりRでもできるんですよね! 近くRでもやってみたい。

qiita.com

*1:4.1.0のところはそのとき入れたバージョンの数字でお願いします

*2:ナンバリングされているのはオリジナルが1だからで特に意味はないです

PostgresqlでJSONと少し戦う

やりたいこと

"[{"id":"hoge", "content":"hogehoge",...}]"

というtext形式の列(列名sections(仮))の中のcontent部分を抽出したい。 あんまり実践的な資料がなかったので書いときます。

抽出方針

  1. 一旦この文字列をJSONに変換
  2. その中のcontent要素を抽出する

結論

色々詰まったけども

with

cont as (
  select
    sections::json -> 0 ->> 'content' as content
  from
    contents_table
  where
    created_at between '2018-04-01' and '2018-04-07'
)

select
  *
from
  cont
;

こんな感じでいける。

  1. sections::jsonsections列をまるっとJSONに変換
  2. -> 0で0番目(最初)の要素を抽出する
  3. ->> 'content'contentオブジェクトのフィールドをtextとして抽出

詰まったポイントは

  • 最初からJSONで入ってる列じゃなかったから一旦text→JSONの変換が必要
  • JSON変換のところでrow_to_jsonなど他の関数を使ったほうがいいのかと思って色々試す
  • JSON変換してcontentの中身取得すればいいわけではなく、一旦-> 0で0番目(最初)の要素を抽出する、という工程が必要だった

でした。

参考文献

Macでinstall.packagesでRMeCabをインストールしてそのまま使うとRStudioが爆死する(タイトル)

※数日前のできごとなのでエラーの詳細とか曖昧です。すみません…

先日オフラインのWindows環境にRMeCabを導入する話を書きました。

kyyonko.hatenablog.com

ただ、オンライン環境(普段使ってる方)のMacの方にRMeCabを入れてなかった(本末転倒じゃん)ということをすっかり忘れていたので、入れました。

http://rmecab.jp/wiki/index.php?RMeCab

こちらを参考にして、

install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source")

インストールが完了してRMeCabを入れて実行すると、懐かしの爆弾が出てRStudioが落ちるという事案が発生。

ターミナルの方でRを立ち上げてやってみると、うろ覚えだが下リンク先の質問と同じようなエラーが。

rmecab.jp

‘memory not mapped’

ググっても↑のリンクくらいしか有用なヒントは見当たらず、結局結論としては先程の質問に対する一番下のコメントが解決策であった。

Macには/usr/lib/にlibmecab.dylibがあり、これがリンクされてしまうようです。

ls -l /usr/lib/libmecab*
-rwxr-xr-x 1 root wheel 2536912 4 29 2017 /usr/lib/libmecab.1.0.0.dylib
lrwxr-xr-x 1 root wheel 20 4 28 2017 /usr/lib/libmecab.dylib -> libmecab.1.0.0.dylib
-rwxr-xr-x 1 root wheel 6302048 4 29 2017 /usr/lib/libmecabra.dylib

export LD_LIBRARY_PATH=/usr/local/lib
としてからRを起動しても同じでした。

http://rmecab.jp/R/にあるソースコードをダウンロードし、RMeCab/src/MakevarsのMECABの行に-L/usr/local/libを加えて、

> install.packages(“RMeCab”, repos = NULL, type = “source”)

としてローカルディレクトリからインストールすると、RMeCabCが正常に動きました。

とのこと。たしかにls -l /usr/lib/libmecab*したらそうなるな…ただ

http://rmecab.jp/R/にあるソースコードをダウンロード

とあるがここのソースコードがどこにあるのかわからない…

とりあえず石田先生のgithubにレポジトリがあるのでここを見てみる。

https://github.com/IshidaMotohiro/RMeCab

件の/src/Makevars にはすでに-L/usr/local/libが加えられているので、とくに自分で追記しなくてもいいらしい。

https://github.com/IshidaMotohiro/RMeCab/blob/master/src/Makevars

これをgit cloneしてきて作業ディレクトリで

install.packages("RMeCab", repos = NULL, type = "source")

したら正常に動いた。なんだったんだろう…?

ともあれ、無事にRMeCab入ったのでRMeCabを使ってもRStudioは落ちないです。よかったね!

> library(RMeCab)
> res <- RMeCabC("すもももももももものうち")
> unlist(res)
    名詞     助詞     名詞     助詞     名詞     助詞     名詞 
"すもも"     "も"   "もも"     "も"   "もも"     "の"   "うち" 

WindowsにRMeCabを導入する 2019年夏の陣

オフライン環境のWindows10にR環境を作る 2019年夏の陣 の関連記事です。

kyyonko.hatenablog.com

オフライン環境のWindows10への導入が前提ですが、オフラインに限らず汎用的な内容だと思います。

基本的に以下リンク先の方法を追えばOKです。 ただ、手前味噌だけれどもこれを最後まで読んでからインストールするのを推奨します。

MeCabをインストール

こちらからインストーラーをオンライン環境でダウンロードし、オフライン環境に置き、オフライン環境で実行する。

http://taku910.github.io/mecab/#download

いくつかの参考先ではMeCab本体のインストールと辞書のインストールはそれぞれ別に行う必要があると書いてあるところもあるけれど、この作業で辞書も一緒にダウンロードされてくるらしい。

詰まりポイント その1

デフォルトのMeCabのインストール先はC:\Program Files hogeになっているけれども、セキュア環境のようなところは案外環境構築者がフルに権限を持っていないパターンがあるので、C:\Program Files hogeの書き込み権限がなく、MeCabインストールエラーになる場合がある。自分はなった。

その場合は、 こちらの参考先に書いてあるように、C:\MeCabに変更しても大丈夫。自分はそれでいけました。

インストール先変えたので(かは知らないが)、パスを通しておく。これもこちらの参考先参照して、

  • コントロールパネル>すべてのコントロールパネル項目>システム>システムの詳細設定
  • システムのプロパティ>詳細設定>環境変数
  • PathでC:\MeCab\binを追加
  • MECABRCでC:\MeCab\etc\mecabrcも追加しておく

詰まりポイント その2

こちらの参考先ではWindows10にMeCabを入れるところまでで終わりだが、今回の自分の目的はRMeCabを使えるようにすることである。

文字コード選択画面で みんな大好き UTF-8を指定してMeCabを入れてしまうと、RMeCabを実行したらエラーになる。 みんながあまり好きではない SHIFT-JISを選択しましょう。

dictionary_sjis

動作確認

こちらの参考先と同じように

in.txt

これはカルビ、ロースとは別次元の旨さだ

を作成し、コマンドプロンプト

mecab in.txt -o out.txt

を実行すると、こんな感じになる。

mecab_res

そう、文字コード選択画面でSHIFT-JISを選択したがゆえに文字化けするのだ。 一旦はMeCabが動くことが確認できたので一旦これでOK。

②RMeCabをインストール

WindowsRMecabパッケージのファイルをオンライン環境にダウンロードする。

http://rmecab.jp/R/bin/windows/contrib/3.5/RMeCab_1.00.zip

これをオフライン環境に置き、こちらの「⑥オフライン環境でzipファイルをソースにしてパッケージをインストールする」に従いインストールする。

動作確認

[こちら]を参考に動作確認。ちなみにMeCab本体の文字コード選択画面でUTF-8を選んだときの失敗例も出てます。自分もUTF-8で入れちゃったときはこうなりました。(https://noneme.hatenablog.com/entry/2019/04/03/190356)

library(RMeCab)
unlist(RMeCabC("すもももももももものうち"))

rmecab_res_1

良い感じ。ちなみにunlistをつけなかったらこうなる。

rmecab_res_2

とりあえずRMeCabのおおよその環境構築はこれで完成だと思います。

オフライン環境のWindows10にR環境を作る 2019年夏の陣

背景など

  • オフラインのセキュア環境下(以下、「オフライン環境」もしくは「セキュア環境」)に分析環境を作りたい(R, Python等問わず)
  • オンライン環境→セキュア環境への(安全な)ファイルの転送手段はある
  • OSはWindows10
  • 2019年8月末現在
  • 個人の経験に基づくものです
    • なお普段はMacユーザーかつたまにLinuxかな?程度なのでオフラインどころかWindows自体に不慣れ

めちゃくちゃ参考にさせていただきました

やること

  1. R自体の導入、簡単なサンプル・スクリプトの実行確認
  2. RStudio Desktopの導入、起動
  3. Rパッケージの追加インストール(tidyverse環境を作る)
  4. RMeCabの導入、起動(※別記事

簡単な言語処理も行いたいので、MeCab導入までがゴールです。 長くなったのでRMeCabは別の記事に分けます。

kyyonko.hatenablog.com

1. Rのインストール

RのexeファイルはここからダウンロードすればOK。これをセキュア環境に運んで、そこでこれをexeファイルを実行すれば良い。

https://cran.r-project.org/bin/windows/base/

注意!!

2019年8月末時点でのRの最新バージョンは3.6.1であるが、後のパッケージ導入などでエラーになるので、3.5系にしたほうが良い。古いバージョンはここから。

https://cran.r-project.org/bin/windows/base/old/

動作確認

RGuiを起動してRが実行できるか確認する。自分はだいたいこんな感じのことをします(描画の確認もしたいので)。

head(iris)
plot(iris$sepal.Length)

Rtoolsのインストール

WindowsでパッケージをインストールするためにRtoolsを入れる必要がある、らしい(普段Macユーザーなのでよく知らなかったけれども、パッケージインストールのときにエラーでたりなどしたので)。

Rtoolsも公式からexeファイルをインストールする。

https://cran.r-project.org/bin/windows/Rtools/

また注意!!

2019年8月末時点でのRの最新バージョンはRtools35であるが、どうやら不安定らしいので、「Rのバージョン3.5系 ✕ Rtools34以下」が良いらしい(伝聞)。Rtools35の説明には「R 3.3.x and later」とあるが… なので、一旦ここではRtools33にしました。

2. RStudio Desktopの導入、起動

別にRGuiがあればええやろ、って感じなんですが、セキュア環境のWindows10がもっさりしているうえにRGuiも操作がしにくいので、Rstudioを入れることを優先します。

Rstudio公式からOSに合わせてインストールします。これはバージョンはなんでもよかったです。とくに詰まることもなし。

https://www.rstudio.com/products/rstudio/download/#download

3. Rパッケージの追加インストール(tidyverse環境を作る)

Rに限った話ではないけれども、入れたいパッケージがあってもそれについての依存パッケージがあることがある。その依存パッケージにもまた依存パッケージがあることがある。こうなると網羅するのが難しくなる。

依存パッケージを含めてRのパッケージをインストールするにはminiCRANパッケージを使うのが良い。以下が参考にさせていただいたリンクです。

まずはminiCRANパッケージでの実行コード全体です。詳細はそれぞれ解説します。

ちなみにRMeCabパッケージはこれではインストールできません。詳細は後述します。

# miniCRANパッケージをインストール
install.packages("miniCRAN")

# 必要なパッケージ
install.packages("tidyverse")
install.packages("lubridate")
install.packages("ltm")
install.packages("RMeCab", repos = "http://rmecab.jp/R")

# 依存パッケージを網羅する
library(miniCRAN)

p1 <- pkgDep("tidyverse")
p2 <- pkgDep("lubridate")
p3 <- pkgDep("ltm")
p4 <- pkgDep("RMeCab") # これは依存パッケージないらしい

pkgs <- c(p1, p2, p3, "RMeCab")
print(pkgs)

# パッケージのダウンロード
download.packages(pkgs, destdir = "./R_pkgs")

miniCRANパッケージのインストール

オンライン環境でminiCRANパッケージのインストールを行う(入ってなければ)。

# miniCRANパッケージをインストール
install.packages("miniCRAN")

②オフラインで使用したいパッケージをリストアップする

今回自分が欲しかったのは、一旦最低限tidyverse, lubridate, RMeCab。 参考リンクにltmがあったのと、もしかすると項目反応理論使うかもしれないのということでこちらも。

③パッケージの依存関係をpkgDep関数で調べる

miniCRANパッケージのpkgDep関数を用いて入れたいパッケージの依存パッケージを調べる。例えばtidyverseは以下のようになる。(多い)

> pkgDep("tidyverse")
 [1] "tidyverse"    "broom"        "cli"          "crayon"       "dplyr"       
 [6] "dbplyr"       "forcats"      "ggplot2"      "haven"        "hms"         
[11] "httr"         "jsonlite"     "lubridate"    "magrittr"     "modelr"      
[16] "purrr"        "readr"        "readxl"       "reprex"       "rlang"       
[21] "rstudioapi"   "rvest"        "stringr"      "tibble"       "tidyr"       
[26] "xml2"         "backports"    "generics"     "nlme"         "reshape2"    
[31] "assertthat"   "DBI"          "glue"         "R6"           "tidyselect"  
[36] "pkgconfig"    "Rcpp"         "BH"           "plogr"        "ellipsis"    
[41] "digest"       "gtable"       "lazyeval"     "MASS"         "mgcv"        
[46] "scales"       "viridisLite"  "withr"        "vctrs"        "curl"        
[51] "mime"         "openssl"      "clipr"        "cellranger"   "progress"    
[56] "callr"        "fs"           "rmarkdown"    "whisker"      "selectr"     
[61] "stringi"      "fansi"        "pillar"       "lifecycle"    "processx"    
[66] "rematch"      "Matrix"       "lattice"      "askpass"      "utf8"        
[71] "prettyunits"  "plyr"         "knitr"        "yaml"         "htmltools"   
[76] "evaluate"     "base64enc"    "tinytex"      "xfun"         "labeling"    
[81] "munsell"      "RColorBrewer" "zeallot"      "sys"          "highr"       
[86] "markdown"     "colorspace"   "ps"           "feather"    

④パッケージのダウンロード

これらのパッケージをzip形式でダウンロードし、オフライン環境に持っていってパッケージをインストールすれば使えるようになる。 あらかじめzipファイルを格納するディレクトリを作っておくと良いです。 今回はカレントディレクトリ下に./R_pkgsディレクトリを作りました。

# パッケージのダウンロード
download.packages(pkgs, destdir = "./R_pkgs")

入れたいパッケージを一気に入れたいのでとりあえず全部の依存パッケージをとりあえず連結。なおRMeCabには依存パッケージがないらしいのでエラーになりますが焦らず。

> p1 <- pkgDep("tidyverse")
> p2 <- pkgDep("lubridate")
> p3 <- pkgDep("ltm")
> p4 <- pkgDep("RMeCab") # これは依存パッケージないらしい
 pkgDep("RMeCab") でエラー: No valid packages in pkg
> 
> pkgs <- c(p1, p2, p3, "RMeCab")
> print(pkgs)
  [1] "tidyverse"    "broom"        "cli"          "crayon"       "dplyr"       
  [6] "dbplyr"       "forcats"      "ggplot2"      "haven"        "hms"         
 [11] "httr"         "jsonlite"     "lubridate"    "magrittr"     "modelr"      
 [16] "purrr"        "readr"        "readxl"       "reprex"       "rlang"       
 [21] "rstudioapi"   "rvest"        "stringr"      "tibble"       "tidyr"       
 [26] "xml2"         "backports"    "generics"     "nlme"         "reshape2"    
 [31] "assertthat"   "DBI"          "glue"         "R6"           "tidyselect"  
 [36] "pkgconfig"    "Rcpp"         "BH"           "plogr"        "ellipsis"    
 [41] "digest"       "gtable"       "lazyeval"     "MASS"         "mgcv"        
 [46] "scales"       "viridisLite"  "withr"        "vctrs"        "curl"        
 [51] "mime"         "openssl"      "clipr"        "cellranger"   "progress"    
 [56] "callr"        "fs"           "rmarkdown"    "whisker"      "selectr"     
 [61] "stringi"      "fansi"        "pillar"       "lifecycle"    "processx"    
 [66] "rematch"      "Matrix"       "lattice"      "askpass"      "utf8"        
 [71] "prettyunits"  "plyr"         "knitr"        "yaml"         "htmltools"   
 [76] "evaluate"     "base64enc"    "tinytex"      "xfun"         "labeling"    
 [81] "munsell"      "RColorBrewer" "zeallot"      "sys"          "highr"       
 [86] "markdown"     "colorspace"   "ps"           "feather"      "lubridate"   
 [91] "stringr"      "Rcpp"         "glue"         "magrittr"     "stringi"     
 [96] "cli"          "crayon"       "digest"       "evaluate"     "praise"      
[101] "R6"           "rlang"        "withr"        "assertthat"   "highr"       
[106] "markdown"     "yaml"         "xfun"         "mime"         "jsonlite"    
[111] "rex"          "httr"         "curl"         "openssl"      "lazyeval"    
[116] "askpass"      "sys"          "testthat"     "knitr"        "covr"        
[121] "ltm"          "MASS"         "msm"          "polycor"      "survival"    
[126] "mvtnorm"      "expm"         "Matrix"       "lattice"      "RMeCab"  


> download.packages(pkgs, destdir = "./R_pkgs")
 URL 'https://cran.rstudio.com/src/contrib/tidyverse_1.2.1.tar.gz' を試しています 
Content type 'application/x-gzip' length 61647 bytes (60 KB)
==================================================
downloaded 60 KB
...
(中略)
       [,1]           [,2]                                
  [1,] "tidyverse"    "./R_pkgs/tidyverse_1.2.1.tar.gz"   
  [2,] "broom"        "./R_pkgs/broom_0.5.2.tar.gz"       
  [3,] "cli"          "./R_pkgs/cli_1.1.0.tar.gz"         
  [4,] "crayon"       "./R_pkgs/crayon_1.3.4.tar.gz"      
  [5,] "dplyr"        "./R_pkgs/dplyr_0.8.3.tar.gz"       
  [6,] "dbplyr"       "./R_pkgs/dbplyr_1.4.2.tar.gz"      
  [7,] "forcats"      "./R_pkgs/forcats_0.4.0.tar.gz"     
  [8,] "ggplot2"      "./R_pkgs/ggplot2_3.2.1.tar.gz"   
...

⑤zipパッケージをオンライン環境→オフライン環境に持っていく

セキュアサーバーだったりUSBだったり。./R_pkgsごと持っていってしまえば楽だと思います。

⑥オフライン環境でzipファイルをソースにしてパッケージをインストールする

オフライン環境で⑤で置いたパッケージのgzファイルを指定してinstall.packages関数を実行する。

install.packages("hoge.tar.gz", repos = NULL, type = "source")

大量のパッケージ1つずつ実行するのが大変なので1列目にパッケージ名、2列目にgzファイルが書かれたデータフレームpkgs_listを作ってfor文で回したりしていた。もっといい方法ありますか?(質問を投げかけるスタイル)

for(1 in 1:nrow(pkgs_list)){
  install.packages(pkgs_list[i, 2], repos = NULL, type = "source")
}

注意:入らないパッケージについて

miniCRANを利用してインストールしたいくつかのパッケージに関するgzファイルは、install.packagesを実行すると外部のgithubを呼びに行ったりする。こうなってしまうとオフライン環境ではパッケージをインストールすることができない。

自分が遭遇したのは以下のパッケージ。

  • stringi
  • curl
  • xml2
  • openssl

例えばstringiを入れようとするとこんな感じのエラーになる。

stringi_error

これについては参考先

このパッケージはCRANのサイトで提供されているPackage Sourceファイルだけでは足りず、このインストールプロセスの中で外部のWebサイトを参照してファイルを勝手にダウンロードしようとします。そこでインターネットにアクセスできないとエラーになります。(まったく嫌がらせとしか思えない...) そのため"stringi"については、CRANのサイトではなく以下のサイトから、tar.gzファイルを入手する必要があります。 https://github.com/gagolews/stringi/releases ここから入手したものには、必要な全てのファイルが含まれているので外部サイトのアクセスは行われないようです。

つまり、miniCRANを利用してインストールしたバージョンのgzファイル(パッケージファイル)だとwebサイトを参照しようとするらしい。(最新だとダメなのか…?と思ったけれどもそういうわけでもないらしい)

stringiについては、↑のリンク先のgithub.comから入手したが、CRANにあるr-oldrelでもいける。stringi以外はそうした。 r-oldrelは、、CRANのパッケージ説明サイト下図の一番右のもの。(※これはcurlの例)

curl_r_oldrel

依存パッケージを全部入れたらtidyverse環境の完成です。

4. RMeCabの導入、起動

長くなりましたし、RMeCabだけで独立した話のような気もするので、別の記事に分けました。こちらです。

kyyonko.hatenablog.com

スペシャルサンクス

詰まったところ(主にパッケージインストール関連の部分)は、r-wakalangで丁寧に教えていただきました。ありがとうございます!

qiita.com

【ポエム】2018年を振り返る、2019年に向けて

気づけば2018年も終わり…ブログあるのに書いてなかったので&今年はちょっと振り返っておきたかったので、ポエムでも書いてみる。 自己満です。

一言でサマリー

  • 技術面に手応えアリ的な成長はあまりなし
  • TokyoR運営頑張ったと思う
  • 英語できるんだかできないんだかわからない不思議な年
  • 自分の意外な一面を見つけた
  • 体調崩すことが多かった
  • 以上を受けて来年に向けて

各項目について以下に詳細を書くけれど、文章まとめるのはあまり上手くないので、 各項目に「来年に向けて」的な要素が入ってくるかもしれないけれど、見逃してください。

技術面

サマリーのところにも書いたけれど、残念ながら技術面で自分的に「身についた!!」という手応えを感じるほどには成長してないなと…

自分的手応えってどんなもんよ、って思われるかもしれないけれど、 それは前職(ベンチャー)時代かなと。まぁ、当時は0→1(※100点満点)になったから(だってSQL自体知らなかったし、Mac買ったのも、iTerm2に初めて触ったのもこの頃……)であって、傍から見ると大したもんじゃないんだろうけど。

ただ、現職3年目がそろそろ終わろうとしている中で、集計マンとしての十分なスキルはぼちぼちついてきたかもしれない。 だって3年間の90%は集計業務だったから。

  • SQL(弊社の場合はTeradata(これはバリバリ))
  • Hadoop(というかHiveQL(これはバリバリ)、ちょっとHadoop Streaming←今年やっとまともなものが書けるように)
  • Spark(今年デビュー。そこそこ)
  • Presto(今年デビュー。そこそこ)
  • TreasureData(顧客のをちょっと使った)

あとオマケだけど、Tableau。これも本格デビューは今年。 9月までいた部署で、避け続けてたけど、最後の1ヶ月くらいで集中的に使ったらなんだかんだ身について、 現部署で最大の武器になって(しまって)いる。

こうしてみると、けっこう今年デビューもあった笑 ということは、伸びている技術もあるのでは…と思いつつ、ぼちぼち集計マン卒業したいところ。 あと集計マン的に悲しいのは現職にいるとAWSとかBigQueryとかなかなか触る機会ないことなんだよなぁ…

この項書き終わって思ったけど、タイトル技術面→開発面とすべきだったかもしれない。 個人的に身についてないな…と思ったのは、R, Pythonでの分析スキル…。

TokyoR

これまでなんとなく受付設営など手伝ってきたけれど、7月のHadley会 は会場的なこともあって、 ここから本格的に運営チームとしてやらせていただいてます。 運営チームの皆さん、本当にいつもありがとうございます。

件のHadley会の裏話について、TokyoRで話させていただきました。 speakerdeck.com

じつはこれがTokyoR初登壇でした。今まで避け続けていた…。Rのプログラミングや分析話でなくて申し訳ないです…

登壇したり、ブログ書いたりできる人ってホントすごいなって思うんです。 仕事上のconfluence(社内ドキュメント的な)ものはめっちゃ書くんですけど、仕事のことだから外に出せないし、 かといってプライベートで勉強するにあたって、本読んだりするだけでなかなか発表できるものなんてないしな…と思ってしまうのです。

自分にはクリエイティビティ的なものが不足していてほとほと自分自身が呆れている。 どうにも問題解決型人間なようで(ストレングスファインダーでも学習欲の次に回復志向が来る)。 現職入社して最初に言われたのが「(なにもないところから)分析企画持ってきて」で、結局大したものはできなかった。 新規事業とか起業とかは学生時代からずっと興味がない…今後気が変わるかもしれないけれど… 与えられた役割を全うしたり、誰かのサポートをするほうが個人的には向いている気がしているんだけれども、これをどう登壇に活かせばよいのやら…

英語について

今年の4月〜9月に配属された部署で、ベルリッツ英会話のレッスンを会社のお金で受けさせてくれる、という機会を頂いたので受講しました。グループレッスン。英会話なんて何年ぶりか…。

事前にレベル決める面接があって、どうやら一番レベル高いグループに配属された模様。 英語しばらく使ってなくて心配だったけど、案外大丈夫で安心した。 そしてHadley会でもまぁまぁ司会いけた。

だけど夏頃、縁あってとある企業の面接受けていて(記念受験)、けっこういいところまで行ったのだけど、結果うまく行かず。 もらったフィードバックで「業務を100%遂行するにあたって英語が十分でない」とあったので、やっぱり不十分であると痛感。

そして10月から配属された部署に海外から派遣された人がいて(もう帰国してしまったけれど)、 その人達と楽しく会話できる+ちょっと仕事の話できるくらいには十分だった。

なので、自分が英語できるんだかできないんだかわからなくなった1年だった笑 でも少しでも「できる」側に振っていくの大事!と思ったので、2019年は定期的に英会話通うことにした。

今まで弱点補強型で生きてきたけど、これはどう転ぶか。

自分の意外な一面

4〜9月では、やっと広告でのビジネスアナリシス部署を脱して「サイエンス」と名がつく部署に移った…のに、 そこは結局顧客相手のコンサルみたいなことをやっている新規事業部署だった…

そこでいわゆる「データ分析業務のつらみ」(「あれデータ分析でなんとかしてよ!」「なにやりたいかわかんないんだよね〜」etc.)を経験したのもあるけれど、個人的に最も苦労したのは社内調整

プロジェクトをやっていくにあたって、営業(というか顧客向き合い)とアナリスト(自分)という役目が主にあったけれど、なかなかいい関係を築くのが難しかった(精一杯の社会性フィルター)。 本来もう一方がやるはずだった社内MTGの調整、議事録取り、顧客との連絡…やるだけだったら全然良かったのだけれども、やったらやったで「私がやるべき役目ですから!!(テメーがやるな)」と言われる…いや、あなたがやらないからやってるですけどね? (※念の為、全員がこうであったわけではありません)

ただ自分的に意外だったのは、こうしてプロジェクト的なものを遂行するにあたって、

  • 全体を見渡して不足している部分を補ったりする力とか
  • 超基本事項だけどチャット/メールの返信を早くするとか(1つのレス遅れがプロジェクトの遂行の遅延の原因になるので)
  • 自分がやったことはドキュメントに残して、次に同じようなことをやる人が困らないようにするとか、
  • 人が困っていたりするのを放っておけないで声かけるとか、

そういう力が自分にあるのかもしれないな…と初めて思ったのが今年。

「人が困っていたりするのを放っておけないで〜」的なことの源泉は、社会人になって自分がずっと困ってきたからだろうけど笑 ただ、誰しも初めてのことや、わからないことで困ることはあっても「喉元過ぎれば熱さを忘れる」で、その後に続く人のことを考えられない人のほうが多いんだな、と確信したのも今年。だからこそ偉くなると下っ端だった頃のことを忘れる人が多いんだなぁ

それと、TokyoRの運営やらせていただいて身についたことも多かった気が。こまめに連絡取るとか(遅れることもありますが…)。 逆に、今年業務がこんな感じだったので、それがTokyoR運営に活かされてる面もあるかも。

(人見知りなのもあって)割と個人プレーが多かった自分としてはとても意外な一面を発見できた年でした。 これは来年以降もずっと磨き続けて…というか、忘れずにいたい。

体調面

今年は非常〜〜に体調面がひどかった。

TokyoR、Hadley回の終わったその日の夜〜2日後までに高熱で倒れる。(39.4度まで上がった) まぁこれは極端な例かつネタ的に面白いからいいとして、体調崩しまくりだったのは変わりない。

  • 人生初救急車で病院へ(深夜だったから、点滴打って終了だったので大したことない)
  • 定期通院での薬の服用量増加
  • マジでふらっときて一瞬失神する(夏頃)
  • 健康診断血液項目2つ引っかかる(1つはその日だけだったらしい、もう1つは貧血確定)

などなど。そろそろちゃんと運動しないといけないな…と思いつつ、家の周りホント何もなくてジムにも行けない…(ジムまで徒歩40分はかかる、体験行ったら帰路で体が冷えて逆に風邪をひいて大変だった)

来年に向けて

と、ずらずら書いてきたけれど、これらを踏まえて来年どうしたいか。

  • 分析的なスキル(技術面、理論面)を上げたい
  • TokyoR運営は引き続き頑張る(よろしくお願いします)
  • 英語力もう一歩上げたい
  • 来年以降も周りのこと・先のことを考えることを忘れないようにする、困っている人が一人でも減るようにすることは続けたい
  • 体調管理したい
  • 無理なく楽しく過ごしたい(勉強と仕事だけでなく)

来年の抱負を具体的にそれ自体を記事にして、年末それができたか振り返る人も多くて、そういう人を尊敬しますが、自分にそこまでの高い意識はないので、「〜したい」系でまとめました(TokyoRは除く)。あと、自分の時間も楽しみたい。

今年もたくさんの人にお世話になりました。来年もよろしくお願いいたします。