検索
ニュース

GitHub、機械学習を用いてソースコードから言語を検出/分類するツール「OctoLingua」を開発学習方法を工夫

GitHubは、GitHub上のソースコードがどのような言語で記述されているのかを特定するツール「OctoLingua」を開発した。50種類の主要な言語に対応しており、今後はソースコードの一部分だけが与えられた場合でも判定できるように改良を続ける。

Share
Tweet
LINE
Hatena

 GitHubは2019年7月2日(米国時間)、GitHubで管理されているソースコードがどのようなプログラミング言語で記述されているのかを特定するツール「OctoLingua」を開発したと発表。同ツールに関する今後の計画も明らかにした。

 GitHub上で最も人気のある上位の5言語はJavaScript、Java、HTML、Python、PHPだが、ホストしているソースコードは300種類以上のプログラミング言語にわたるという。GitHubにとって、リポジトリにコードがプッシュされた際にその種類を認識することが重要だという。検索やセキュリティ脆弱(ぜいじゃく)性アラート、構文のハイライト表示といった観点があるからだ。

 だが「.h」のように1つのファイル拡張子が複数のプログラミング言語で利用されている場合や、その逆の場合も珍しくない。さらにはプログラマーが誤った拡張子を付ける場合もある。


GitHubがホストしているソースコードの中で最も人気のある上位10言語(リポジトリ数換算)(出典:GitHub

なぜ新しいツールが必要なのか

 GitHubはこれまで、コーディングに使われた言語を検出するツールとして、Rubyベースのアプリケーション「Linguist」を使ってきた。Linguistの精度は84%に達し、ファイルレベルの言語検出をかなり正確に行ってきた。だが、想定されていない命名規約がファイルで使われていると、性能が大幅に低下する上に、ファイルの拡張子が設定されていないと、さらに性能がひどく低下するという。

 そこでGitHubは、長期にわたってメンテナンス可能で堅牢(けんろう)な言語検出ツールを目指し、人工ニューラルネットワーク(ANN)アーキテクチャに基づく機械学習分類器OctoLinguaを開発した。

 GitHubによればOctoLinguaは現在、「高度なプロトタイピング段階」にあり、GitHubでよく使われる上位50の言語を検出できる。精度とパフォーマンスは既にLinguistを上回っているという。

OctoLinguaをどうやって開発したのか

 OctoLinguaの開発目標は、高い精度と堅牢性、メンテナンスのしやすさを確保すること。このため「Keras」と「TensorFlow」をバックエンドとして、Pythonを使ってスクラッチ開発した。

 OctoLinguaの現行バージョンのトレーニングでは、一般に公開されている「Rosetta Code」と、GitHub社内でクラウドソーシングされた高品質のリポジトリセットから取り出したファイルを用いた。Rosetta Codeは、同じタスクをさまざまなプログラミング言語で記述したソースコードを含んでいる。GitHubは、GitHubでよく使われる上位50の言語に限定して、これらの言語データセットをトレーニングのために用いた。

 GitHubはこれらのデータセットから、各プログラミング言語の特徴を抽出し、KerasとTensorFlowをバックエンドとして作成したANNに入力し、OctoLinguaのトレーニングを行った。

 ニューラルネットワークによるテキスト分類問題では、RNN(Recurrent Neural Network)やRNNを発展させたLSTM(Long Short Term Memory)といったようなメモリベースのアーキテクチャを使うことが多い。だが、プログラミング言語には語彙(ごい)やコメントスタイル、ファイル拡張子、構造、ライブラリのインポートスタイルなどの違いがある。そこで、これらの情報を表形式で抽出して用いる単純なアプローチを選択したという。

 OctoLinguaで抽出している特徴は次の通りだ。

  • ファイルごとの上位5つの特殊文字
  • ファイル当たり上位20種類のトークン
  • ファイル拡張子
  • コロンや中かっこ、セミコロンなど、ソースコードファイルで一般に使う特定の特殊文字の存在

ANNモデルの構造は?

 TensorFlowバックエンドを備えたKerasを用いて2層ANNを構築し、先ほどの特徴情報を入力する。

 次の図では、特徴抽出ステップによって、分類器に使うためのn次元の表形式入力が生成されることを示している。情報がネットワークのレイヤーに沿って移動するにつれて、ドロップアウトによって正規化されていく。最終的に指定されたコードが50種類のプログラミング言語で記述されている50種類の確率とどれにも当てはまらない確率を示した51次元の出力が生成される。


ANNモデルの構造(出典:GitHub

 GitHubはデータセットの90%をほぼ8期のトレーニングに使用した。さらに、トレーニングの際にトレーニングデータからファイル拡張子の一部を削除した。これはモデルがファイルの拡張子情報から過学習することを防ぐためだ。

新旧ツールの精度とパフォーマンスを比較した

 GitHubはOctoLinguaと従来のLinguistの性能を比較した結果も明らかにした。

 同じデータセットを異なる条件で使った3つのテストを行い、F1スコア(精度と再現率の調和平均)を比較している。3つのテストの違いは次の通り。

  1. データセットをそのまま使用(表の2行目)
  2. テストファイルからファイル拡張子情報を削除(同3行目)
  3. 分類機を混乱させる目的で、Javaファイルの拡張子を「.txt」、Pythonファイルの拡張子を「.java」とするなどファイル拡張子にスクランブルをかける(同4行目)

同じデータセットを使ったOctoLinguaのLinguistのテスト結果(精度と再現率の調和平均、出典:GitHub

 表の結果から、OctoLinguaの精度とパフォーマンスがLinguistを上回ることが確認できた。

拡張子削除の効果はあったのか

 ファイルの拡張子情報から過学習することを防ぐために、拡張子情報一部を削除した効果はあったのだろうか。

 次の表は、トレーニング期間中にファイル拡張子をさまざまな割合で削除した場合の性能を示す。


ファイル拡張子がある状態(左)とない場合(中央)、ランダムな拡張子の場合(右)の性能(出典:GitHub

 トレーニング期間中にファイル拡張子を削除しないと、拡張子を持たないテストファイルとランダム化された拡張子を持つテストファイルを与えたとき、OctoLinguaの性能が、通常のテストデータを与えたときの性能と比較して大幅に低下することが分かった。

 これに対して、ファイル拡張子の一部を削除したデータセットでANNを訓練すると、正しい拡張子情報が得られないテストセットでも性能があまり低下しなかった。

 つまり、トレーニング時にファイルの一部からファイル拡張子を削除すると、分類器が語彙からより学習することを示している。また、ファイル拡張子は確かに予測に役立つものの、コンテンツ機能からの学習を妨げる傾向があることも示している。

新しい言語をどうやってサポートするのか

 OctoLinguaを新しい言語に対応させることは極めて容易だという。まず新しい言語で記述されたソースコードを大量に入手する。次にファイルをトレーニング用とテスト用に分け、プリプロセッサと特徴抽出器を適用する。こうして得たトレーニングデータセットとテストデータセットを、既存のトレーニングとテストデータプールに追加する。その後、OctoLinguaの再トレーニングと再テストを行う。


OctoLinguaで新しい言語をサポートする方法(出典:GitHub

行レベルの予測も目指す

 GitHubによれば「OctoLinguaの言語分類エンジンは、既に堅牢で信頼性が高いが、GitHubで使われるコーディング言語を全てサポートするには至っていない」という。

 今後の方針は2つある。一つは対応言語を広げることだ。OctoLinguaの現在の実装では、機械学習エンジンに小さな変更を加えることで、コードスニペットを分類できる。このモデルを進化させ、組み込み言語を確実に検出、分類できるようにすることも、それほど難しくはないだろうと、GitHubは述べている。

 もう一つの目標はファイルレベルやスニペットレベルの検出に加えて、行レベルの言語検出と分類まで、複数の粒度で信頼性の高いソースコード言語検出を可能にするサービスを提供することだ。

 同社は今後、今回のモデルのオープンソース化も検討しているという。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る