言語学者が学ぶべきプログラミング言語

概要
言語学者はプログラミング言語を学ぶべきか、学ぶとしたらどんなプログラミング言語を選ぶべきか、そしてどうやって学べば良いかということについての情報。

はじめに

「言語学者が学ぶべきプログラミング言語」というタイトルをつけておきながら恐縮だが、ほとんどの言語学者にとってプログラミング言語を学ぶ必要はないと私は思う。言語学の研究の分野のほとんどで、プログラミングを用いる場面は出てこない。自分でプログラムを書くことで研究が効率的になる面もあるかもしれないが、それもたかがしれている。プログラミング言語を勉強している暇があるのならば、言語学の研究論文を読んだ方がよほど有益であろう。

ただし、コーパスを元に言語を研究する人は、何かプログラミング言語を使えないと非常に困ることになる。自分でプログラムを書かずに、既製のプログラムを持ってきて研究している人もいるが、やはりそれでは突っ込んだ研究はしづらい。以下ではコーパス処理をする必要がある言語学者に向いたプログラミング言語を紹介していこうと思う。

どの言語を学ぶべきか

先にまとめを書いておこう。これはあくまでも私見である。誰もがこれでうまくいくというわけではない。ただ、そう大きく外してはいないと思う。

プログラミング言語と言ってもさまざまなものがあり、どのプログラミング言語を学ぶかが問題になってくる。マイナーなプログラミング言語を学んでも意味がない。他に使っている人が少ないプログラミング言語だと、他の人とプログラミングの資源 [1] を共有しづらい。

重いプログラミング言語と軽いプログラミング言語

プログラミング言語には重いプログラミング言語 [2] と軽いプログラミング言語 [3] がある。重いプログラミング言語は、言語そのものを覚えるのもプログラムを書くのも難しいが、できあがったプログラムのスピードは速い。これに対して、軽いプログラミング言語は、手軽だが、できあがったプログラムのスピードはさほどでもないという特徴を有している。どちらかと言えば、重いプログラミング言語は大規模なプログラムに向いており、軽いプログラミング言語は小規模のプログラムに向いている。

プログラミングが得意な人は、プログラムの目的に応じて、重いプログラミング言語と軽いプログラミング言語を使い分けていることが多い。言語学者も重いプログラミング言語と軽いプログラミング言語から1つずつ学んでおけば、様々な状況に対応できるだろう。

しかし、言語学の研究では、重いプログラミング言語が必要となるような複雑なプログラムを書く機会はほとんどないと思われる。軽いプログラミング言語を1つ覚えておけば、それで大概の用は足せるのだ。

以前、私は軽いプログラミング言語でコーパス処理のプログラムを書いたことがある。そのとき、処理が終わるのに10時間近くかかりそうだということが分かった。「これは時間がかかりすぎるな」と思って、プログラムを書き直すか、重いプログラミング言語で処理させようかと考えた。しかし、少し考えて、「プログラムが走っている間、寝ていれば良いじゃないか」ということに気づいた。どうせ夜は8時間寝るのであるから、寝る前にプログラムを開始すれば、朝起きてしばらくしたころには処理が終わっているという寸法である。別にそのときは、即座に処理を終える必要はなかったし、悠長に構えていればそれで十分だったのである。もちろん、GoogleでのWeb検索のようにすぐに答えが返ってこなくてはこまるという場面もあるのだが、それは自然言語処理を行う工学者の課題であって、言語学者の課題ではない。

軽いプログラミング言語の選び方

軽いプログラミング言語にも色々なものがあるが、言語研究に当たっては、PythonかPerlを学ぶのが良いだろう。

Python

軽いプログラミング言語のうち、Pythonを学ぶことを私はおすすめする。

Python をすすめる理由は複数ある。1つの理由は、Pythonが比較的覚えやすい言語であるからである。また、もう1つの理由は、自然言語処理の界隈でよく使われているからである。先に触れたように、多くの人が使っていると、さまざまな便利な資源を手に入れやすい。

また、Pythonには、NLTK (Natural Language Toolkit)という素晴らしい自然言語処理用のリソースがある。これが使える面でもうれしい。Pythonそのものが分からなくても、NLTKだけ使えればそれで良いと主張する人もいるかもしれない。なお、NLTKの解説書として『入門 自然言語処理』という本が出ている。

さらに、Pythonは、関数型言語としての側面もある。関数型言語の考え方は、意味論などを見る際に多少は役に立つかもしれない。

Perl

Perlは、軽いプログラミング言語の1つである。これも、なかなか良い言語である。自分の周りを見る限り、このプログラミング言語を研究に使っている人が多い。また、コーパス処理のためのPerlの教材が、英語・日本語を問わず出版されており、勉強はしやすいと思う。

ただ、Pythonと比べると、Perlはあまりおすすめできない。

Perl が登場したのは1980年代で、90年代の初めに登場したPythonに比べれば、設計思想がやや古い。現代のプログラミングでの重要な考え方として、オブジェクト指向 [4] というものがあるのだが、Pythonが最初からこのオブジェクト指向に則っていたのに対し、Perlはそうではなかった。Perlも今ではオブジェクト指向に基づいてプログラムを書けるのだが、やはり使いづらい面が残っている。

また、かつてPerlは、日本語を簡単に扱うことができなかった。古い教材での日本語の処理方法を今のPerlで行おうとするとうまく動かない。そういった面でも少し面倒である。

その他の軽いプログラミング言語について

Ruby はしっかりとオブジェクト指向に基づいているという面で、優秀な言語であるはずなのだが、言語研究で使っている人はあまり見ない。AWK は、かつては使っている人がそれなりにいたようだが、今はあまり見ない。いずれにせよ、これらの言語をわざわざ選択する必要はないだろう。

プログラミング言語をどう学べば良いか

さて、プログラミング言語を学ぶ際に注意しておきたい点をいくつか挙げたいと思う。

教材の選び方

市販のプログラミングの入門書の中には、いい加減なものも少なくない。誤植 [5] が多かったり 、あまり適切でないプログラムの例を出していたりする入門書もあるのだ。練習問題が付いていない入門書もある。ただ説明を読むだけでは身につきづらいので、やはり練習問題 [6] があった方が良い。

だから、適当に教材を選べば良いというわけではなく、ちゃんとした教材を選ばなくてはならない。とは言え、そのプログラミング言語をまったく知らない人が適切な教材を選ぶのは難しいだろう。私からのアドバイスは、「先達に聞きなさい」、ただこれだけである。(ちゃんとした)経験者の弁ほど参考になるものはない。しかも、周りにそうした経験者がいたら、教材に対するアドバイスだけでなくて、勉強法についても色々とアドバイスをもらえるかもしれない。

周りにアドバイスをしてくれる人がまったくいない場合は、とりあえずプログラミング関係で有名な出版社(例えば、オライリー)の本を買えば、あまり失敗しないと思う。例えば、Pythonだと、『初めてのPython 第3版』のような本がある(この文、2015年5月8日に修正) 。

自分の取り組みたい問題に取り組む

プログラミングの入門書は、言語学者向けに書かれているわけではない。だから、入門書に出ている例は、誰にでも分かるようなつまらない例 [7] が多い。そういった例で練習するのも良いのだが、そればかりやっていると、言語研究に生かせなくなってしまう。

ここは、学んだ知識を、自分の取り組みたい問題に生かすようにしたい。自分で言語研究に必要となる課題を設定して、それに取り組むようにする。

最初は単純なことからで良い。例えば、英文が書かれたテキストファイルを1つ用意して、そのファイルの中で使われている“fine”という単語だけを抽出するといったプログラムを書いてみる。それができたら、単独のテキストファイルでなく、複数のテキストファイルを読み込んで同じように単語を抽出するプログラムを書いてみる。さらに、“fine”という単語そのものでなく、その前後の文脈も一緒に抽出するプログラムを書いてみる。こういった具合に、だんだん複雑化させていけば良い。

もっとプログラミングがうまくなったら、他の人が論文などで紹介しているアルゴリズムを自分で実装してみるといった練習をしてみると良いかもしれない。

付記1:統計処理言語としてのR

以前、「言語研究者のための統計の学び方―基礎を身につける」という記事を書いたときに触れたが、言語研究で、統計処理を行うときはRを使うのが良い。忘れられがちだが、Rもプログラミング言語の1つである。これを学んでおくことも重要である。

言語によらず、プログラミングには共通する部分もあるので、Pythonなどを学んだ経験がRの学習に(あるいはその逆)役立つこともあるかもしれない。

付記2:関数型言語

プログラミング言語の中には、関数型言語というタイプのものがある。関数型言語の考え方を知っていると、関数型言語にも意味論にもラムダ計算とかが出てくるぐらいであるし、意味論の理解に役立つこともあるかもしれない。代表的な関数型言語としては、LISPがある。Pythonも関数型言語的な側面を有する。

付記3:言語実験を行う人のために

言語実験を行う人も、プログラミングめいたことをすることはある。例えば、Praatという音声分析用のソフトがある。このソフトでは、簡単なスクリプトを書いて、音声実験を行うことができる。こういったスクリプトを書くことはプログラミングをすることと似ている。ただ、それは本式のプログラミング言語というわけではないし、マニュアルやサンプルなどを見れば、容易に理解できる程度のものである。また、GUIで処理できるツールも色々と開発されているので、それを使うという選択肢もある。つまり、総じて言えば、言語実験を行う人にとって、何かちゃんとしたプログラミング言語を学ぶ必要は薄い。

脚注
  1. 多くのプログラミング言語では、パッケージとかライブラリと呼ばれるものがあり、それらを使うことで複雑なことを簡単に行うことができる。そのプログラミング言語の開発者の層が厚いほど、パッケージやライブラリは多くなるので、ますます便利になるというわけだ。 []
  2. 重いプログラミング言語には、C言語やJavaなどがある。 []
  3. 軽いプログラミング言語には、AWK, Perl, Python, Rubyなどがある。 []
  4. オブジェクト指向に基づいてプログラムを書くと、色々と能率が上がる。 []
  5. プログラムを書くとき、1文字でも違っているとうまく動かないという場合は多々あるので、プログラミングの入門書での誤植は致命的である。 []
  6. 私が以前買った書籍は練習問題は付いていたのだが、その解答が一切記載されていなかった。回答もちゃんと付いているか確かめてから買おう。 []
  7. 三角形の三辺の長さを与えるとその面積を返すプログラムなど。 []