cl-igo - Common Lisp形態素解析器 (ver 0.3.0)


目次

概要/特徴

Java版との共通部分

 以下の項目はJava版と共通のため、ドキュメントはリンク先のものを参照のこと。

対応処理系

 ユニコードに対応しているCommon Lisp(ANSI X3.226-1994)処理系なら動作するはず。
 動作確認済みの処理系は以下の通り。 ※ なお、cl-igoはSBCLのver1.0.34以降に最適化されているため、他の処理系では十分な性能が出ない可能性がある。

インストール/使い方

解析用辞書作成

 バイナリ辞書の作成方法はJava版のドキュメントを参照。

インストール

 インストールには、あらかじめリリース一覧画面よりcl-igo-0.2.3.tar.gzをダウンロードしておき、下記のlispコードを実行する。
asdf及びasdf-installパッケージが必要。
(require :asdf)
(require :asdf-install)

;; インストール
(asdf-install:install "cl-igo-0.2.3.tar.gz")

;; 一度インストールした後は、(require :igo)のようにしてパッケージをロードできる
 インストールはせずに一時的に使用したいだけの場合は、次のようにしてロードすることも可能。
(require :asdf)
	
;; cl-igo-0.2.3.tar.gzは前もって解凍しておき、
;; 解凍先ディレクトリをasdfのパッケージロード候補に追加する
(push #P"cl-igo-0.2.3.tar.gzの解凍ディレクトリ" asdf:*central-registry*)

;; ロード
(asdf:operate 'asdf:load-op :igo)

形態素解析

(require :igo)

;; 辞書ロード
;; ※ Common Lispでは、ディレクトリを指定する場合末尾の'/'が必須なので注意
(igo:load-tagger "/path/to/dicionary-directory/")

;; 形態素解析
(igo:parse "すもももももももものうち")
=> (("すもも" "名詞,一般,*,*,*,*,すもも,スモモ,スモモ" 0) ("も" "助詞,係助詞,*,*,*,*,も,モ,モ" 3)
    ("もも" "名詞,一般,*,*,*,*,もも,モモ,モモ" 4) ("も" "助詞,係助詞,*,*,*,*,も,モ,モ" 6)
    ("もも" "名詞,一般,*,*,*,*,もも,モモ,モモ" 7) ("の" "助詞,連体化,*,*,*,*,の,ノ,ノ" 9)
    ("うち" "名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ" 10))

;; 分かち書き
(igo:wakati "すもももももももものうち")
=> ("すもも" "も" "もも" "も" "もも" "の" "うち")

API

 igoパッケージの公開API。

*tagger*スペシャル変数

 parse関数およびwakati関数でデフォルトで使用されるtaggerオブジェクト。
 一番最後に呼び出されたload-tagger関数が返したtaggerオブジェクトが束縛されている。

load-tagger関数

 バイナリ辞書を読み込む。
(load-tagger dic-dir &key (feature-parser #'identity)) (bind-special t))
 => tagger
      
dic-dir: バイナリ辞書が配置してあるディレクトリのパス
feature-parser: 素性文字列のマッピング関数。
                この関数が返した結果がparse関数により使用される。
                (lambda (feature-string) ...)形式。
bind-special: 関数が返すtaggerオブジェクトを*tagger*スペシャル変数に束縛するかどうか。
tagger: 形態素解析用の辞書情報を有するtaggerオブジェクト。

parse関数

 形態素解析を行う。
※ 結果の素性を破壊的に修正しない場合はスレッドセーフ
(parse text &key (tagger *tagger*) (start 0) (end (length text)))
 => result
 
text: 形態素解析対象テキスト(string型)
tagger: taggerオブジェクト。load-tagger関数の戻り値
start: 対象テキスト内での解析開始位置
end: 対象テキスト内での解析終端位置
result: 右の形式の形態素解析結果のリスト。 ((表層形 素性※1 テキスト内での出現開始位置))

※1 素性には、load-tagger関数に渡したfeature-parser関数が返した結果が用いられる。
  なお、parse関数が返す素性は、同じtaggerオブジェクトで共有されている。
  そのため素性の破壊的な修正は、それを参照している他の箇所にも影響を与える。

wakati関数

 分かち書きを行う。
※ スレッドセーフ
(wakati text &optional (tagger *tagger*) (start 0) (end (length text)))
 => result
 
text: 形態素解析対象テキスト(string型)
tagger: taggerオブジェクト。load-tagger関数の戻り値
start: 対象テキスト内での解析開始位置
end: 対象テキスト内での解析終端位置
result: 分かち書きされた表層形(文字列)のリスト。

サンプルコード

 MeCabでの例を真似て、cl-igoでAuto Linkを行うサンプルを載せる。
※ ただし、MeCabの例とは結構異なっている。  
;;;; Auto Linkのサンプル
;;;;  - 入力テキストの形態素解析を行い、品詞が名詞のものにはリンクを貼る 
;;;;  - 辞書にはIPA辞書を使用。 ※ そのためリンクURLが変 
(require :igo)

;; Auto Link用の素性文字列パーサ
(defun autolink-parser (feature)
  ;; 品詞が名詞の単語にはリンクを貼る
  (let ((link? (string= feature "名詞" :end1 2)))
    (if link?
        (lambda (word-surface)
          (format nil "<a href=~S>~A</a>" feature word-surface))
      #'identity)))

;; Auto Link用のtaggerをロード
(igo:load-tagger "/path/to/dic-dir/" :feature-parser #'autolink-parser)

;; 入力テキストのAuto Linkを行う関数
(defun autolink (text)
  (with-output-to-string (out)
    (loop FOR (surface autolink-fn) IN (igo:parse text) DO
      ;; 素性関数(autolink-parserの戻り値)を表層形に適用し、結果を集める
      (princ (funcall autolink-fn surface) out))))
 実行例。
(igo:parse "すもももももももものうち")
 => (("すもも" #<CLOSURE # {C0989C5}> 0) ("も" #<FUNCTION IDENTITY> 3)
     ("もも" #<CLOSURE # {C0A9CF5}> 4) ("も" #<FUNCTION IDENTITY> 6)
     ("もも" #<CLOSURE # {C0A9CF5}> 7) ("の" #<FUNCTION IDENTITY> 9)
     ("うち" #<CLOSURE # {C089C75}> 10))

(autolink "すもももももももものうち")
 => "<a href=\"名詞,一般,*,*,*,*,すもも,スモモ,スモモ\">すもも</a>も<a href=\"名詞,一般,*,*,*,*,もも,モモ,モモ\">もも</a>も
    <a href=\"名詞,一般,*,*,*,*,もも,モモ,モモ\">もも</a>の<a href=\"名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ\">うち</a>"

(princ *)  ; 見やすくするためにHTMLエスケープを外している
 => すももももももうち

ライセンス

 MITライセンス。配布物のCOPYINGファイルを参照。
 ただし、使用する辞書のライセンスに関しては、辞書配布元のそれに準ずることとする。

バグ報告など

 バグ報告、改善点指摘、要望、その他は、以下のいずれかからお願いします。