概要/特徴
Java版との共通部分
以下の項目はJava版と共通のため、ドキュメントはリンク先のものを参照のこと。対応処理系
ユニコードに対応しているCommon Lisp(ANSI X3.226-1994)処理系なら動作するはず。動作確認済みの処理系は以下の通り。
- SBCL: 1.0.28〜1.0.37
- CLISP: 2.42
- ClozureCL: 1.4
インストール/使い方
解析用辞書作成
バイナリ辞書の作成方法は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ファイルを参照。ただし、使用する辞書のライセンスに関しては、辞書配布元のそれに準ずることとする。
バグ報告など
バグ報告、改善点指摘、要望、その他は、以下のいずれかからお願いします。- SourceForgeチケット
- 開発者ページに記載されているメールアドレス