language-detection 20161123.1013(in MELPA)
Automatic language detection from code snippets

概要

language-detection.elは、バッファや文字列の内容から
プログラミング言語を判定するライブラリです。

M-x language-detection-bufferはカレントバッファの言語を判定し、
エコーエリアに出力します。

内部では language-detection-string 関数が使われており、
文字列のトークンのパターンからプログラミング言語を判定します。

さすがにすべてをEmacs Lispで処理するのは荷が重いです。
そこで、 scikit-learn という ランダムフォレスト による
機械学習Pythonライブラリによって
巨大な学習データとEmacs Lispコードが作成されています。

MELPAでインストールされる段階ではすでにデータが作成されていますので、
実行時には外部プログラムに依存しません。

Emacs Lisp側では正規表現によるトークン作りと
ハッシュテーブルと配列によるアクセスだけですので
実用的な速度で動作します。

言語判定はlanguage-detection.elだけでなく、
Highlight.jsPygmentsSourceClassifier がありますが、
language-detection.elはそれらすべてを上回る精度(73%〜87%)です。

判定のために使われた情報源は

です。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてlanguage-detectionを使う方は
以下のコマンドを実行します。

M-x package-install language-detection

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name language-detection

判定例

20161205202659.png
Fig1: twittering-mode.elは正しくemacslispと言ってくれる

20161205202746.png
Fig2: sourceclassifier_test.rbも正しい

20161205203031.png
Fig3: Common LispやSchemeはlispと判定する

20161205202820.png
Fig4: language-detection.elは後半に巨大な配列があるせいかR言語と誤認してしまう(笑)

対応言語

  • ada
  • awk
  • c
  • clojure
  • cpp
  • csharp
  • css
  • dart
  • delphi
  • emacslisp
  • erlang
  • fortran
  • fsharp
  • go
  • groovy
  • haskell
  • html
  • java
  • javascript
  • json
  • latex
  • lisp
  • lua
  • matlab
  • objc
  • perl
  • php
  • prolog
  • python
  • r
  • ruby
  • rust
  • scala
  • shell
  • smalltalk
  • sql
  • swift
  • visualbasic
  • xml


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。