BlogKLabは、多くのスマートフォン向けゲームを開発・提供しています。スマートフォン向けゲームの開発と運用は、Webソーシャルゲームと比べて格段に複雑で、またコンシューマゲーム開発とも異なったノウハウが求められる領域もあります。このブログでは、KLabのゲーム開発・運用の中で培われた様々な技術や挑戦とそのノウハウについて、広く紹介していきます。12/24の記事です。2015年新卒の本堂です。この記事ではロシア語テクストを統計的に分析することについて紹介します。コンピュータを使って言語を分析することについて興味をもっていただけたら著者として幸せです。ロシア語を少しでも勉強したことのある方ロシア語を数量的に分析することに興味のある方を読者として想定しています。はじめに僕の専門は言語学、特に言語獲得で、さまざまな言語獲得を実験する過程でロシアにも2年ほど住んでいました。言語獲得というのは、乳幼児の言語習得や外国語習得などです。乳幼児と大人の言語獲得スピードの差は今だに人類の謎です。乳幼児が言語獲得していく過程と、僕が外国語としてロシア語を習得していく過程を数量的に表現したいと思いました。乳幼児は覚えた語彙の使用頻度が高いのに対し、大人は滅多に使わない語彙から覚えるなど。いうようなことを数量化できるかもしれない。プログラミングは知らなかったので、最初は身近にあったMicrosoftのエクセルで始めました。このように(どうやったかはもう覚えていませんが)一行に一文、一列に一語ずつ入力して、エクセルの関数を組み合わせて、なんとか目的の語を入力して出現回数を表示させることができました。"я"と"мне"が別々にカウントされています。"мне"は"я"の与格で"私に"の意。)格ごとに数えたい場合はこれでもいいですが、僕は語を数えたかったのでどちらも"я"としてまとめてほしいわけです。"я"などはまだ曲用が少ない方なので、格それぞれの出現回数を合計するといいでしょう。ご存知のように"идти"のような動詞は形動詞も含めると数十パターンの変化をするので、これを手作業で行うのは大変です。エクセルはロシア語の語形変化など知りませんから、教える必要があります。自分で教えるなら自分でプログラムを書こう、と勉強を始めました。ロシア語の自然言語処理について日本語で書かれた情報が全くないので、最初はとても苦労しました。今後勉強される方のために情報を残しておこうと思います。自然言語処理とはコンピュータでロシア語など人の話す言語を処理する分野を総称して「自然言語処理」といいます。"мне"を"я"に自動で変換することも自然言語処理の一部です。プログラムもなんらかの言語によって書きます。この分野ではPython(パイソン)というプログラミング言語がよく使われます。自然言語処理やPythonについての説明は、すでに優れた書籍や解説記事がいくつもあるのでそれらを参照してください。自然言語処理という書籍は特におすすめです。自然言語処理だけでなくPythonの入門書としてもわかりやすく、プログラミングの経験がない僕でも楽しく読み進められました。英語版であればこちらからPDFで読むことができます。実際にロシア語テクストを分析してみよう・用語編それでは実際にPythonを使ってチェーホフの戯曲「かもめ」の使用語彙を分析してみましょう。その前に、これから使う用語を重要なものだけ整理しておきます。「トークン」は、テキスト中に現れる語そのものです。句読点の間には適宜スペースをいれてあげます。черном?"という文は、"Отчего"、"вы"、"всегда"、"ходите"、"в"、"черном"、"?"という7つのトークンからなります。「レマ」は、そのトークンが見出し語として辞書に載っている語形のことだと思って大丈夫です。トークンは必ず1つのレマをもちます。トークン"мне"のレマは"я"、トークン"я"のレマも同じく"я"です。トークン"шедщий"のレマは"идти"です。「レマ化」とは、トークンをレマに変換することです。トークン"шедщий"をレマ"идти"に変換することです。「タグ」は、トークンに対しての付加情報です。?/句読点"というように記します。「形態素解析」は、トークンに対して品詞、態、性別など形態論的に解析することです。実際にロシア語テクストを分析してみよう・事前準備編プログラミング言語にはPythonを使います。Pythonについては、Macをお使いの場合最初からインストールされていますし、Windowsであればこちらから簡単にインストールできます。Windowsの場合はPython3.5と書いてあるものをインストールしましょう。今回の分析にはPython上にさらに2つのソフトウェアをインストールします。自然言語処理』に丁寧な説明がありますが、どちらもPythonの"pip"というものを使うと簡単にインストールすることができます。pipはPythonで作られたソフトウェアのインストールを簡単にしてくれるものです。Macの場合はターミナルを開いて以下のコマンドを実行します。pymorphy2Windowsの場合はコマンドプロンプトから以下のコマンドを実行するだけです。pymophy2事前準備はこれで終わりです。実際にロシア語テクストを分析してみよう・実践編それではいよいよ「かもめ」の使用語彙を分析してみましょう。Pythonを起動します。information.>>>インターネットからテキストを取得するダウンロードに必要なプログラムをロードします。urllib.requestテキストをダウンロードします。テキストはこちらのものを使用します。downloaddata.read().decode("koi8-r")ダウンロードしたテキストを整形する今回の分析では句読点が不要なので削除します。replaceを使ってスペースに置き換えています。")ダウンロードしたデータを一行ずつに分解します。splitを使ってテキストを改行で区切ります。lenでテキストの行数が分かります。大体3900行ぐらいであれば正しく分解できています。len(text)391339行目までは不要な行なのでカットします。len(text)で39行減っていることが確認できます。len(text)38741行目はtext[0]で確認できます。あることに注意してください。以下のように本文の一部が表示されたらOKです。ПЕРВОЕ1行をトークンに分割してみるテキストの1行目をline1に保存します。line1.split()で1行目をトークンに分割できます。結果がトークンのリストになっていることが確認できます。'ПЕРВОЕ']トークンを集計してみるテキストからトークンを取り出せるようになったので、実際に集計してみましょう。テキストをトークンに分割してみましょう。token_listという空のリストを作って、テキストをfor文を使って1行ずつトークンに分割し、extendでtoken_listに加えていきます。分割されているようですね。token_list...'не','любит','любит','-','не','любит','любит','-','не','любит','Смеется','Видишь','моя','мать','меня','не','любит','Еще','бы',...]集計のためにnltkのFreqDistというプログラムをロードします。FreqDist分割したトークンをFreqDistの中に入れて集計してもらいます。FreqDist(token_list)集計結果を見てみましょう。most_commonで見ることができます。上位20位まで表示してみましょう。134)]集計できました!確かによく使われそうな語が上位にきていますね。"мне"が別々にカウントされているようですね。ここまではエクセルでも出来たのでした。次にいよいよレマ化をしていきます。トークンをレマ化するまずは例として先ほどのトークンリストにあった"меня"をレマ化してみましょう。この"меня"(訳:私を)は代名詞"я"(訳:私)が曲用したものですね。これを"я"に変換しましょう。pymorphy2を使用するのでロードします。このanalyzerが、ロシア語のトークンをレマ化してくれるものです。pymorphy2.MorphAnalyzer()レマ化します。parseでレマ化することができます。可能性の高い順からリストをくれるので[0]で先頭だけ取り出します。normal_formに実際のレマが入っています。analyzer.parse("меня")[0].normal_form'я'うまくできたようですね。すべてのトークンをレマ化してもう一度集計してみましょう。appendを使ってlemmaを一つずつリストに入れています。lemma_list'не','любить','любить','-','не','любить','любить','-','не','любить','смеяться','видеть','мой','мать','я','не','любить','ещё','бы',...]先ほどのトークンリストを比べてみると確かにレマしかなくなっていることが確認できます。"мне"がすべて集約されて"я"が1位になりましたね!おわりに以上簡単でしたが1作品の使用語彙をレマ化して集計するところまで紹介しました。意外と簡単にできるなと思っていただけたらうれしいです。NLTKにはまだまだ色々な機能があるので、ほとんどプログラムを書かなくても面白い分析ができます。ロシア語関連のソフトウェアもたくさんあるので色々触ってみて新しい発見に繋げていただけたら幸いです。最後まで読んでいただきありがとうございました。興味はもったが分からない!ということがありましたらお気軽にコメントください。紹介しきれなかった有用なツールが他にもいくつかあるので最後に簡単に紹介します。形態素解析・レマ化ツールMystemMystemはロシアで最大の検索エンジンを作っているYandex製の形態素解析・レマ化ツールです。商用利用は禁止されており、教育・学術目的のみ利用が許可されています。Pythonから使うこともできます。digsolab/pymystem3TreeTaggerTreeTaggerはロシア語に限らず形態素解析に使われているツールで、日本語でも多くの紹介記事が見つけられます。商用利用は禁止されています。インストール方法はやや面倒ですが、こちらに従って丁寧に進めるとインストールできます。Sharoffさんが配布してくれています。russian.par.gzPythonから使うこともできます。メタデータが付与されます。языка(以下、НКРЯ)は現在のところロシア語の唯一にして最大のもっとも権威のあるコーパスです。1.5億語程度の規模だそうです。大部分が文語で構成されていて、わずかに口語も含まれています。プログラム+手動で丁寧にタグ付けされています。詳細な条件で検索することができます。商用利用は禁止されており、利用は科学・教育分野に限られています。コーパスの生のデータを取得するには別途許可が必要ですので、こちらをご覧ください。OpenCorporaOpenCorporaは、利用者同士が協力して構築しているロシア語コーパスです。上サイトからコーパスの生のデータをダウンロードすることができます。この記事で使用したpymorphy2はこのコーパスを元に形態素解析・レマ化を行っています。青空文庫にあたるものは多数あります。