N-gram言語モデルに基づく補完 (company-ngram)


外国語の文章を書いているときに,次にどんな単語を書くのが自然なのかを知りたいと思ったことはありませんか?
company-ngramというcompany-modeのバックエンドを使うと,そのような希望を高い可能性で実現できます.

company-ngramはN-gram言語モデルに基づき,カーソルよりも前に書かれた単語の並びから次に書かれる可能性の高い単語を予想し補完候補を提供します.

company-ngramによる補完候補の例です.
補完候補表示の右側の列の.の左側の数字はN-gramデータ中での補完候補の頻度を表します.
.の右側の数字は,カーソルの前のどの単語が補完候補の生成に使われたのかを表します.
1の位置に対応する単語はN-gramデータにマッチしたことを,(図中には存在しませんが)0の位置に対応する単語はN-gramデータにはマッチしなかったことを表します.
例えば,a b cに対してd 42.110という補完候補が表示された場合,N-gramデータのもとになったテキストデータ中にa b * dという並び(*は任意の単語を表す)が42個存在していたということが読み取れます.

利用方法

company-ngramMelpaからインストールできます.
インストール後,~/.emacs.d/init.elに以下の設定を追加してください.

; ~/.emacs.d/init.el

(with-eval-after-load 'company-ngram
  ; ~/data/ngram/*.txt are used as data
  (setq company-ngram-data-dir "~/data/ngram")
  ; company-ngram supports python 3 or newer
  (setq company-ngram-python "/path/to/python3")
  (company-ngram-init)
  (cons 'company-ngram-backend company-backends)
  ; or use `M-x turn-on-company-ngram' and
  ; `M-x turn-off-company-ngram' on individual buffers
  ;
  ; save the cache of candidates
  (run-with-idle-timer 3600 t
                       (lambda ()
                         (company-ngram-command "save_cache")
                         ))
  )

(require 'company-ngram nil t)

company-ngramを使いたいバッファでM-x turn-on-company-ngramすると,company-ngramが有効になります.

company-ngramを使うには,N-gramデータを生成するためのテキストデータが必要です.
デフォルトでは,~/data/ngram/*.txtがテキストデータとして読み込まれます.
既存のコーパスを利用するか,w3m -dump <URI>でスクレイピングして自分のコーパスを作っても良いでしょう.
とりあえず試すにはRFCのテキストが手頃です.

詳細は,READMEをご覧ください.