挙措進退

思いついたら書きます

近況

私の近況です。

 

無事21になりました

各位ありがとうございます。今年も無事に歳を重ねることができました。

 

プログラミング言語研究室に配属されました

学部4年を目前に控え、研究室配属が確定しました。

おおよそ単位なども問題なく、大学院への進学も問題なく進みそうです。

研究に不安がないと言ったら嘘になりますが、希望通りの研究室に配属されましたし、これからは研究に励んでいきたいと思います。関係各位よろしくお願いします。

 

不安障害になって通院しています

色々あってうつ状態になったりしましたが大したことではなく、これまでずっと抱えてきた問題に病名が付与されただけの話です。

今現在通院中で、抗うつや抗精神病の薬などを飲んだりしていますが、最近は薬の効果もあって比較的平穏な日々を送っています。

周りの方々には特に睡眠周りで心配をおかけすることが多かったかと思いますが、今は睡眠薬の効果もあって毎日よく眠れています。あまり寝過ぎないように気をつけたいところです。

 

お酒が飲めなくなりました

上記の薬のこともあって、お酒が飲めなくなってしまいました。悲しい。

皆さんもお酒には気をつけましょうね……

 

おわり

なんだかんだ言えど元気にやっています。また機会があれば食事にでも誘ってください。こちらから誘うかもしれませんが。

サークルでやった自然言語処理について

この記事はデジクリ アドベントカレンダー24日目の記事です。
内輪ネタですが、自然言語処理で私がやったことも書くので、もしかしたら自然言語処理をやりたい方の参考になるかもしれません。

目次

はじめに

2018年5月に趣味で論文を流し読みしながらtf-idfを利用した文章の類似度判定に基づく質問応答システムを作り、サークルの人に「デジコ」と名付けてもらってから1年半ほど経ちました。

そもそもいくつか自然言語処理の論文を読んで実装するまで2日程度しか時間を費していなかったため、当初は一回発表してそれで終わり、くらいの気持ちでめちゃくちゃなコードを書いていたのですが、サークル内外の皆様に様々な評価をいただき、少しずつ改良を加えて、成果物を先日の芝浦祭で発表することができました。

去年の初発表の後、同期の方にキャラクターデザインをしていただき*1、サークル内でも徐々にその存在が知られるようになってきました。制作者の一人としてはうれしい限りです。

今回は、そんな「デジコ」の自然言語処理について、簡単な説明を書いていきたいと思います。

自然言語処理の話

自然言語処理とは?

自然言語処理とは何でしょうか?

そのまま分割すれば自然言語を処理する、ということになります。自然言語とは、我々が日常的に使っている、人類の間で自然発生的に生まれた言語です。要は日本語や英語などのことですね。これに対して形式言語があります。C言語やGo言語などですね。

多くの形式言語はコンピュータで処理するため、コンピュータが理解しやすく、記述されたものの意味が一意に定まります。

一方我々の話す自然言語は、コンピュータに理解しにくく、記述されたものの意味が一意に定まりません。例えば、「白いひげの大きいサンタさん」という文章は、「白い/ひげの大きい/サンタさん」とも、「白いひげの/大きいサンタさん」とも、「白いひげの大きい/サンタさん」とも取れますが、文章として問題はありません。少し恣意的な文章なので、あまりいい例ではありませんが。

そもそも、私達が単語や文節で日本語を区切ることができるのも、私達が十分な数の単語を知っていて、更に文法規則からおかしな文節の区切り方を排除することができるからです。コンピュータで自然言語を処理するためにはそういった基礎知識ややり方をコンピュータに教えるところから始まります。こう書くと気が遠くなりそうですが、これらをやってくれるツールは既に存在していて、多くのプログラマがそれを利用して自然言語処理を行うプログラムを書いています。有名なのはMeCabCaboChaJumanKNPなどです。

こういった自然言語処理プログラムの恩恵を我々は日々受けています。例えば、スマホなんかに日本語で指示を出せるスマートアシスタントのようなものも、自然言語処理を行って、ユーザの発言の意図を推測して処理を行うわけです。スマートアシスタントを使っていない?でもGoogleで検索くらいはすると思います。もしかすると検索結果の画面からこのブログに来ていただいている方もいるかもしれません。検索窓に入力した日本語と関連度が高い検索結果を表示する機能も、自然言語処理の恩恵を受けています。

制作したシステム

この1年半で私が制作したのは、自然言語による質問応答システムでした。ユーザの入力した質問に対し、コンピュータが回答するという、ありきたりなものです。

ここでは、どういった考え方を利用して該当システムを実装したのかについて、簡単な説明をしていきたいと思います。

利用した既存の考え方

tf-idf

tf-idfとは、単語の発生数から、その単語が文章中で持つ意味の重みを推定し、数値的に重み付けを行う手法としてよく用いられるものです。

tf-idfの魅力は、単純な計算で単語の重み付けを行うことができる点です。

tf-idf はtf値とidf値の積で求まります。それぞれTerm Frequency、Inverse Document Frequencyの略で、それぞれ次のような計算で求めています。

文書dに含まれる単語tの数をn_{t, d}、全文書数をN、単語tを含む文書の数をdf(t)として、

tf(t, d) = \frac{n_{t, d}}{\sum_{s \in d} n_{s, d}}

idf(t) = log\frac{N}{df(t)}

つまり、一文書中ででてくる回数が多く、文書集合全体ででてくる回数が少ないものほど、より大きな重み付けがなされる、ということになります。

Word2Vec

Word2Vecとは、ある単語の周囲にどのような単語が発生するかといった、単語の共起を元に単語の意味を推論する機械学習の手法です。

詳細については元論文を参照していただくのが一番かと思いますが、わかりやすい解説としてここの記事がおすすめです。

文章ベクトルの定義

今回開発したシステムでは、これら2つの手法を利用して、文章のベクトルを次のように定義しました。

単語w_iのWord2Vecベクトルを\vec{w_i}とすると、

\sum_{i} tf(w_i) idf(w_i) \vec{w_i}

このようにして、文章中の重み付き単語ベクトルの総和で文章のベクトルを表しました。

コサイン類似度

上で紹介した手法により、文章のベクトルを求めることができました。では、文章のベクトルがわかると何ができるのでしょうか。

ベクトルが同じ方を向いていればベクトル同士が成す角\thetaは小さくなり、cos\thetaは大きくなります。この値を用いて、2ベクトルがどれくらい類似しているかを求める考え方がコサイン類似度というものです。

ここで2つのベクトル\textbf{a}\textbf{b}のコサイン類似度を考えると、cos\thetaを求める式は次のようになります。

cos\theta = \frac{\textbf{a}\cdot\textbf{b}}{\|\textbf{a}\|\|\textbf{b}\|}

高校数学の範囲ですね。

このようにして求められるコサイン類似度が1に近ければ近いほど、似ている文章と言うことができます。

質問応答システムへの応用

ここまでで、文章に対してどのような処理ができるのかを紹介してきました。それでは、処理した文章をどのようにして応用すればよいでしょうか。

私は今回、質問文と回答文のセットを人力で登録し、ユーザの質問文に最も意味が近いと推測される質問文に対応する回答文を出力する、次のようなプログラムを書きました*2

f:id:yuu056:20191224211719p:plain

digiCo スクリーンショット

このように、回答文、コサイン類似度の値、回答文に紐付けられた質問例が出力されます。

このように、限定的な用途においては、今回紹介したような手法だけでもある程度うまく質問応答システムとして利用することができるものが出来上がりました。

さいごに

ここまでお読みいただきありがとうございました。

自然言語処理についてまだまだ知らないことが多く、知りたいことも多いため、研究とは別に*3趣味で今後も論文など追っていくようにしたいと思っています。

最後になりましたが、今回実装したシステムはこちらでソースコードを公開しています。もし何かあれば、そちらも参照していただけると良いかと思います。

また、記事の内容に誤りなどあれば、ご指摘いただけると助かります。

デジクリ アドベントカレンダーは明日が最終日です。最後までよろしくお願いします。

*1:https://digico.cordx.net/ のキャラクターがそうです

*2:実際はこれに形態素解析の結果を利用した重み付けを行っています

*3:研究で自然言語をやるのは違うなとなったので、研究はまた別のことをすることにしました

Zabbix on Docker on Raspberry Pi 4B

つい先日、ようやく日本においてもRaspberry Pi 4Bの販売が開始されました。
進化したプロセッサと4GBまで増えたRAMがあれば、なんでもできるような気がしてきます。いやそんなことはないか……

私は普段使いの環境に合わせて、ラズパイに初めてArch Linux ARMをインストールしてみて、それなりにサクサク動くのでびっくりしました。折角ラズパイ4Bが手に入ったんだし、ずっとやりたいと思っていたおうちサーバ群の死活監視をやりたいと思い、ラズパイを監視サーバとして利用しようと思い立ちました。

おうちにサーバがあって当たり前といった逸般的な誤家庭にお住まいのみなさまにとっては、サーバの死活監視が問題になることは少なくないでしょう。

今回は、オープンソースの監視ツールZabbixをラズパイ上で運用するにあたって行ったことを書いていきます。

どかどかDockerの準備

最近はなんでもDocker上で立てちゃえば楽じゃん?という風潮があり、私もその一人です。できるだけ他人の書いたDockerfileを使って、あるいは公開されているイメージを使って、環境構築を楽に終わらせたい……ということで、まずはDockerをインストールすることにしました。

ここでDockerとdocker-composeをインストールする話を書こうかと思ったのですが、多分皆さんRaspbianを利用しているものと思われるので、それ用のインストール記事を探してください……

私は

sudo pacman -S docker docker-compose

で終わりました。

Zabbix on Dockerの準備

Dockerfileの準備

作業用ディレクトリに移動したら、ZabbixのDockerfile群を入手します。

Docker Hubにもイメージはありますが、全てamd64向けのビルドで、armv7で使えるビルドはありません。Dockerfileからビルドすることは可能なので、Dockerfileを準備します。

$ git clone https://github.com/zabbix/zabbix-docker.git

これでDockerfileは一通り手に入りました。

docker-compose.ymlを書く

続いて、docker-compose.ymlを書いていきます。

以下のような内容で、作業用ディレクトリに置いておきます。

gist355d796aff3645d2c8bd93b1ca3bc431

変数などの意味については、 https://github.com/zabbix/zabbix-docker にあるリンクをたどって確認していただけると良いかと思います。

docker-compose.ymlの変更が終わったら、

$ docker-compose build

でビルドをします。ビルドが終わったら、

$ docker-compose up -d

するだけ。簡単ですね。

あとはラズパイの80番ポートに接続して、諸々の監視設定をしていきます。監視対象のホストを追加したり、メールの設定をしたりすると良いでしょう。私はSlackに通知が飛ぶようにしました。上の通りだと、alertscriptsにSlack通知用のスクリプトを置いて設定できます。これもよしなに検索していただければ、いい記事がでてくると思います。

 

今回はRaspberry Pi 4B 4GBでDockerを利用してZabbixサーバを立てました。確認はしていませんが、スペックが足りてさえいれば他のラズパイでもいけるはず……多分。

皆様の快適なサーバ監視生活を祈願して、この記事の締めくくりとさせていただきます。ここまでお付き合いいただきありがとうございました。

2019年はね、魔法少女になるの。

2018年、特にここ数ヶ月を振り返って。*1

これから書く内容は個人的に色々と複雑な思いがあるので、色々ぼかして書いていきたい。また、書いていて思っていた以上に内容が雑になってしまったが、これ以上自分にはどうにも出来ないので、中学生のお悩み相談を眺めているくらいの寛大なお気持ちで読んでいただきたい*2

 

今年も年末の機会を利用して、今年1年のことをまとめて文章に落としておきたいと思う*3

この記事を書く前に読んでおく必要があるだろうと思って、このブログの一番最初の投稿を読んだ。大学に入って1年半ちょい、いくらか忘れていたことを思い出すことができた。今ならこの記事を書いた自分の本当の気持ちが少しわかる気がする。でもこのときのほうが、最近の自分よりかはちゃんと自分の苦しさを言語化できているなとは思う。

今年は自分が自分自身や周りとちゃんと向き合って来なかったことを実感させられた1年だった。

様々な失敗を通して感じたこととして、思っていた以上に自分はちゃんと自分のことを考えられていなくて、目の前にあるものをどうにかすることで必死になっていたということがあるんじゃないかと思う。このことに気付けたのは大体11月頃からで*4、その頃にもう少し自分の人間性とか生き方に気を遣おうという意思が明確に芽生え始めたからだと思う。その原因はわからないけど、流石に今のままじゃだめだと心の何処かで思っていたということだろう。

その頃、魔法少女丈槍由紀の話をすることが多くなった。これは単純に自分が生き方を変えたいと願う中で、目指したかったものだったんじゃないかと思う。それに気付いたのが最近でも、あるいはまだ気付いていなくても、確かに私はそれぞれに何かしら意味を見出していたんだろう。「魔法少女」はまだまだ抽象的で、去年末に「魔法少女になりたい」と言葉にしてから1年、いくらか具体的な姿は見えてきただろうか?実際のところ、まだまだわからないことだらけだ……

 

先日Twitterでの友人とオフで会って色々話をした時に「日記をつけるといいよ」と言われた。年末年始の時間がある時くらいしか何かを始めることなんてできないので、この機会に日記をつけてみることにした。お陰でわかったことがたくさんある。

日記としてはその日のこととかを書く訳ではなくて、ただひたすら考えをまとめるためのノートになってしまった。中学生くらいの時にB6のノートに日々自分の考えを書き溜めておいたのを思い出した。前にやっていたのと同じ感じ。懐かしいような気持ちになると同時に、お前は中学生の頃から何も変われていないのか……という点で恐怖を感じることになった。あの時と同じようなテーマ、同じような文章、同じような悩み……

数日前の自分の日記を読み返すと面白い。永遠に突っ込んでいられる。だいたいいつも「思春期じゃん」の一言で終わる*5が、これまで考えてこなかったことが沢山見つけられて、ここから逃げられないという確信と、これらに向き合う苦しみを日々感じている。

 

今思えば、去年末か今年の頭くらいから、自分が何も考えないで生きてきたということを実感する機会が多かったように思う。自分が考えていなかったこと、勉強が足りていなかったことで他人に迷惑をかけているという自覚がようやくこの頃にできるようになってきた。どうにかして変わらなくてはいけないという思いは今年一年間常に何処か傍にあって、それが様々な形で私の前に現れては、私が追いつく前に消えていくみたいな感じだった。いや、ようやく自分の前に現れていることに気付くことが出来たというのが正しそう。このことに気付く為にこれだけ長い時間をかけてしまったのか……

 

2019年は明確にこれらと向き合っていかないといけない。2018年にどん詰まりになってしまった最悪の状態から、どうやってうまく抜け出せるのか、今は全くわからない。できれば大学生活が後半に入る前には片付けておきたいところだが……

*1:タイトル変更しました。こちらが元タイトルになります。

*2:というか読まなくていいです

*3:この文は実は2019年に書いています。間に合わなかったんですね……

*4:今になって思えば、もっとずっと前から、先輩や同期、後輩、あるいはTwitter上の関係の人から、この辺を指摘するヒントを貰っていた気がします。気付くのが遅すぎますね……

*5:遂にIMEのサジェストまでただひたすら「思春期」で片付けようとしているが、明らかにこれは最悪で、今自分がやるべきことから目をそらす原因になっている気がしています。

がっこうぐらし!初心者に贈るプレゼンテーション

大学サークルでのアドベントカレンダーの記事で、サークルで書いたプログラムの話をここ数日書いていたが、本日最終日に私が書くのは全く技術的なことから離れて、完全に趣味の、「がっこうぐらし!」の話になる。

がっこうぐらし!自体がアニメとして有名になったのはもう3年も前のことで、今更、と思われる方も多いかもしれない。人によってはもう過ぎ去ったものとして「懐かしい」と思われる方もいるかもしれない。そんな方の為に今の原作の状況をお伝えすると、物語中では大学入学、就職を経て、2019年01月12日に第11巻が発売される、というところである。アニメ放送当初から単行本6巻分ほどが新たに加わっている。

私が人前でがっこうぐらし!の話をするようになったのは、原作第10巻の発売を翌日に控えた今年06月11日に、サークル定例会開始直前に思いついて、定例会で「がっこうぐらし!おすすめLT」というLTをしたからだ。これまでの人生でオタクの存在を温かく受け入れてくれる環境下にあったことが少なく、オタクっぽい話を多くの人数に対してすることを避けがちだった自分が、色んなオタクと話をするようになった大きなきっかけになったと思う。

あれから、がっこうぐらし!を初めて読むという人にどのようにして原作を勧めるかについては考え続けてきた。サークルでは、結局サークルの部室に全10巻を置いておくことで各位に読んで頂くという形でそこそこ布教できたが、当時のLTが完璧だったとは考えられていない。LTを振り返りつつ、がっこうぐらし!を初めて読むという方に是非期待して読んでもらいたいポイントをここで振り返り、まとめてみようかと思う。

念の為注意をすると、本記事は多少のネタバレを含むこととなる。ただ、物語として事前に伏せておくべきであろう部分については配慮して書いているつもりなので、がっこうぐらし!について全く何も知らない状態で、どういう作品か全く知らずに読み始めたいという方でなければ問題ないであろうと思う。

 

がっこうぐらし!の世界

がっこうぐらし!について語るには、まずその世界について知っておく必要があるだろうと思う。アニメ1話放送の段階ではこの世界観について視聴者に意図的に一部伏せられた状態で放送され、その衝撃的な世界観で一躍有名な作品となったことは多くの人が知ることではないかと思う。

ご存知の通り、がっこうぐらし!は「荒廃した世界を生きる少女たちの物語」である。「荒廃した世界」には様々な種類のものがあると思う*1が、がっこうぐらし!の少女達が生きるのは「かれら」と呼ばれる”蠢く死者”によって、多くの人々が死んだ世界だった。がっこうぐらし!では、崩壊した世界を生きる少女達の生存をかけた日常が描かれている。

所謂きらら系で異色に思われるかもしれない本作であるが、がっこうぐらし!は決して単純な「ゾンビもの」でも「日常系」でもない*2ように思われる。本作で描かれているものは、サバイバルと日常の繰り返しの中で少女達の前に立ちはだかる困難と、それを乗り越えて成長する彼女達の、弱いながらも強く生きる姿であった。

がっこうぐらし!が私達に見せるもの

がっこうぐらし!に登場する主人公たる少女達は、過酷な現実を受け入れ彼女達の日常を過ごす為に、共に生き残った唯一の教員と「学園生活部」を立ち上げ、部活動としての合宿生活を始めることとなる。これが本作における「日常」の中心となる。

学園生活部と「平和な学校」に生きる丈槍由紀の中では、世界は全く変わりなく日常が繰り返される。彼女の行動は現実から乖離しており、そんな彼女を巡って学園生活部の面々が疲弊しつつも、そんな丈槍由紀の行動に助けられながら生きていく姿が描かれる。丈槍由紀の存在はこの物語の最も重要なポイントの1つで、学園生活部が何故彼女を必要としたのか、そして彼女が学園生活部と共に成長していく姿を、是非ご覧頂きたい。

 学園生活部の「生き方」

崩壊した世界を生きる少女達は必然的に「どう生きるか」というテーマと向き合うことになる。何故生き抜くのか、生き抜いた先に何をするのか。多感な少女達の生き方への問いは、私にとっても大切な問いかけであった。

 

がっこうぐらし!は特にネタバレが怖いので、少しふわふわした文章になってしまったが、ここまでが私が伝えたかったがっこうぐらし!の魅力となる。詳しくは是非本編を読んで頂きたい。また、それについて感想も頂ければ大変ありがたい。

がっこうぐらし!の見せる世界が皆様の心を動かせれば、本記事がそのきっかけとなれれば幸いである。

 

 

ここから先は大学サークルのアドベントカレンダーについてのコメントとなるので、がっこうぐらし!とは無関係の話になる。不要であれば読み飛ばして頂きたい。

今回のアドベントカレンダー企画は、私は企画担当者から直接のお誘いで参加させて頂く形となった。その上でサークル内告知などの一部をお手伝いさせて頂いて、最終的に21人の寄稿者が集まり25日分のカレンダーが埋まることとなった。

一部告知をさせて頂いた側として、時間がないであろう中参加してくれたサークルの寄稿者各位にこの場を借りてお礼申し上げたい。また、企画者さんには企画発表、カレンダーやSlackチャンネルの作成、参加者への説明ドキュメントの用意と様々な準備をしていただいた。サークルメンバーが参加しやすい環境を作ってくれたこと、また私に直接勧誘をしてくれたことについて彼にも感謝している。また、寄稿者以外にも多くの人が今回の企画について言及してくれたことにも、併せてお礼を申し上げたい。

本年のサークル活動はこれで最後となる。最終発表は2月の頭、サークルメンバー各位、来年以降の活動もよろしくお願いしたい。

*1:例: 少女終末旅行など

*2:これは単純に私ががっこうぐらし!を特定のジャンルとして分類してまとめて表現されたくないだけだが