2017.08.16

【Techの道も一歩から】第1回 「言語処理100本ノック勉強会」

こんにちは。DSOC R&Dグループの高橋寛治です。

「新卒R&D研究員によるテックレポート」というテーマで、これから連載を担当することとなりました。

はじめに簡単な私の自己紹介をさせていただくと、大学・大学院では自然言語処理研究室で、自然言語処理の研究に取り組んでいました。 Sansanには2017年4月に新卒入社し、大学・大学院で学んだ技術を生かした研究開発に取り組んでいます。

本連載では、Sansanに関係する技術イベントや勉強会などについて、自分なりの視点から紹介したいと思っています。 記念すべき第1回目は、私が主催している勉強会「言語処理100本ノック勉強会」についてお伝えします。

20170814161106 13d293619a11432e34b6ed518433f9783f5a73ff - 【Techの道も一歩から】第1回 「言語処理100本ノック勉強会」

自席にて。スタンディングで作業していることが多いです。

「言語処理100本ノック勉強会」とは

この勉強会は、言語処理100本ノックを通して、自然言語処理への理解を深めつつ、PythonやUnixコマンドについてのスキルも同時に深めていくことを目的として開催しています。

「自然言語処理」とは、人が使う自然言語をコンピュータ処理することです。 例えば、機械翻訳やかな漢字変換には自然言語処理技術が使われています。 また、Pythonやシェルは自然言語処理に取り組む上で、重要な技術となります。 これらを勉強することで、自然言語処理に取り組むことができるようになります。

ここで一つ、社内制度の紹介となりますが、実は社内のエンジニア同士がイベントを実施する場合、Sansanでは一人当たり1000円を上限にした費用補助がなされます。 この制度を活用し、社内ではお昼休みに昼食を食べながらの勉強会や意見交換会が盛んに行われています。

それでは、実際にこの勉強会でどういったことをしているのか、ご紹介したいと思います。

モグモグモクモクコーディング

お弁当をモグモグと食べながら、100本ノックの課題にモクモクと挑戦します。

下の写真をご覧ください。 みなさん真剣なまなざしで、パソコンに向き合って課題を解いています。

今回の取り組んでいる課題は、「UNIXコマンドの基礎」という題目で、ある処理をPythonおよびUnixコマンドにより実現します。 自然言語処理とUnixコマンドって関係あるの? と思われた方も多いかもしれませんが、それに関しては、後ほど技術小話で言及します。

20170814161435 3795ccf6cb178a7be1b34e078e83f58841b221ce - 【Techの道も一歩から】第1回 「言語処理100本ノック勉強会」

課題に真剣に取り組むメンバー。各部署からテーマに興味のある人が集まります。

お披露目レビュー

モクモクとコーディングを45分ほどした後、みんなで自分の書いたコードを見せ合い、互いにレビューします。 こんな実装の方法があったのか! というような気付きを得て、互いにコーディング力を刺激し合います。

以下は、勉強会参加者が書いたコード例です。 このように記録を残すことで、それぞれの成長が実感できます。

コード1 
コード2 
コード3

技術小話

Unixコマンドは便利なんです

自然言語処理では、単語の頻度や種類数を数え上げたり、置換したりする機会が非常に多くあります。 それをプログラミング言語で実現することも可能ですが、いちいちプログラムを書くことは意外と時間を要するものです。

そんなとき、実はUnixコマンドを用いると、なんとたったの1行で終わることもあるのです。 ちょっとUnixコマンドに興味が湧いてきたのではないでしょうか?

いくつか例を挙げてみましょう。

お題「10. 行数のカウント」

一見簡単に見えます。 Pythonだと以下のように書けるかと思います。

def line_count1():
    with open('./hightemp.txt') as fin:
        lines = fin.readlines()
        return len(lines) 

def line_count2():
    with open('./hightemp.txt') as fin:
        return len(fin.readlines())

def line_count3():
    with open('./hightemp.txt') as fin:
        number_of_lines = 0
        for line in fin:
            number_of_lines += 1

        return number_of_lines

どれも数え上げることができますが、line_count1メソッドの場合は、小さいサイズのテキストであれば大丈夫ですが、大きいサイズになるとfin.readlines()が実行された際に、多くのメモリーを消費します。

line_count2ですと、iterableにlenが評価されますが、多少のメモリー消費があります。

line_count3は、メモリー消費が少ないですが、書くコードが多少増えます。

ここで、Unixコマンドを用いると以下の1行で終わります。 しかもメモリー消費量は、line_count3の半分ほど(約18MB)です。

wc -l ./hightemp.txt

・・・たったのこれだけで実現できてしまいます。 しかも、しっかりした実装であるため、メモリーの利用率なども考える必要がありません。

おわりに

社内勉強会である「言語処理100本ノック勉強会」の雰囲気は感じていただけたでしょうか? 本連載では、このようなイベントや勉強会を紹介しつつも、少し技術に踏み込んだ話も併せて書いていきたいと思っています。

拙い文章ではございますが、これからお付き合いいただけますと幸いです!

執筆者プロフィール

text:DSOC R&Dグループ 高橋寛治

Pickup