• R/O
  • SSH
  • HTTPS

igo: 提交


Commit MetaInfo

修訂88 (tree)
時間2010-04-04 23:33:46
作者phjgt

Log Message

common lisp版のドキュメントが完成

Change Summary

差異

--- trunk/doc/igo.css (revision 87)
+++ trunk/doc/igo.css (revision 88)
@@ -6,6 +6,10 @@
66 text-decoration: underline;
77 }
88
9+h4 {
10+ background: lightgreen;
11+}
12+
913 pre {
1014 background-color:#F0F0F0;
1115 border:1px solid #CCCCCC;
--- trunk/doc/cl-igo.html (revision 87)
+++ trunk/doc/cl-igo.html (revision 88)
@@ -22,8 +22,10 @@
2222 </ul>
2323 <li><a href="#api">API</a></li>
2424 <ul>
25- <li>Tagger</li>
26- <li>Morpheme</li>
25+ <li>*tagger*</li>
26+ <li>load-tagger</li>
27+ <li>parse</li>
28+ <li>wakati</li>
2729 <li>サンプルコード</li>
2830 </ul>
2931 <li><a href="#license">ライセンス</a></li>
@@ -109,106 +111,91 @@
109111 <span class="comment">=> ("すもも" "も" "もも" "も" "もも" "の" "うち")</span></pre>
110112 <!-- API -->
111113 <h2 id="api">API</h2>
112- Javaから形態素解析を行うために必要なクラスは以下の二つ。
114+  igoパッケージの公開API。
115+ <h4>*tagger*スペシャル変数</h4>
116+  <b>parse</b>関数および<b>wakati</b>関数でデフォルトで使用されるtaggerオブジェクト。
117+ <br />
118+  一番最後に呼び出された<b>load-tagger</b>関数が返したtaggerオブジェクトが束縛されている。
113119
114- <h3>Taggerクラス</h3>
115- <pre>
116-<span class="keyword">package</span> net.reduls.igo;
120+ <h4>load-tagger関数</h4>
121+  バイナリ辞書を読み込む。
122+ <pre>(load-tagger <i>dic-dir</i> <span class="keyword">&optional</span> (<i>feature-parser</i> #'identity))
123+ <span class="comment">=></span> <i>tagger</i>
124+
125+dic-dir: バイナリ辞書が配置してあるディレクトリのパス
126+feature-parser: 素性文字列のマッピング関数。
127+ この関数が返した結果がparse関数により使用される。
128+ (<span class="keyword">lambda</span> (feature-string) ...)形式。
129+tagger: 形態素解析用の辞書情報を有するtaggerオブジェクト。</pre>
117130
118-<span class="comment">/**
119- * 形態素解析クラス
120- * - このクラスのインスタンスは不可変でありスレッドセーフ
121- */</span>
122-<span class="keyword">public final class</span> <span class="class">Tagger</span> {
123- <span class="comment">/**
124- * 解析用辞書を読み込んで、形態素解析器インスタンスを作成する
125- *
126- * @param dataDir バイナリ辞書があるディレクトリ
127- * @throws FileNotFoundException 間違ったディレクトリが指定された場合に送出される
128- * @throws IOException その他の入出力エラーが発生した場合に送出される
129- */</span>
130- <span class="keyword">public</span> <span class="class">Tagger</span>(<span class="class">String</span> dataDir) <span class="keyword">throws</span> <span class="class">FileNotFoundException</span>,<span class="class">IOException</span>;
131+ <h4>parse関数</h4>
132+  形態素解析を行う。
133+ <br />
134+ <span class="note">※ 結果の素性を破壊的に修正しない場合はスレッドセーフ</span>
135+ <pre>(parse <i>text</i> <span class="keyword">&optional</span> (<i>tagger</i> *tagger*))
136+ <span class="comment">=></span> <i>result</i>
137+
138+text: 形態素解析対象テキスト(string型)
139+tagger: taggerオブジェクト。load-tagger関数の戻り値
140+result: 右の形式の形態素解析結果のリスト。 <b>((表層形 素性<span class="comment">※1</span> テキスト内での出現開始位置))</b>
131141
132- <span class="comment">/**
133- * 形態素解析を行う
134- *
135- * @param text 解析対象テキスト
136- * @param result 解析結果の形態素が格納されるリスト. 末尾に追加される
137- * @return 引数のresultオブジェクトが返される
138- */</span>
139- <span class="keyword">public</span> <span class="class">List</span><<span class="class">Morpheme</span>> parse(<span class="class">CharSequence</span> text, <span class="class">List</span><<span class="class">Morpheme</span>> result);
140- <span class="comment">/**
141- * 形態素解析を行う
142- *
143- * @param text 解析対象テキスト
144- * @return 解析結果の形態素が格納されているリスト
145- */</span>
146- <span class="keyword">public</span> <span class="class">List</span><<span class="class">Morpheme</span>> parse(<span class="class">CharSequence</span> text);
142+<span class="comment">※1 素性には、load-tagger関数に渡したfeature-parser関数が返した結果が用いられる。
143+  なお、parse関数が返す素性は、同じtaggerオブジェクトで共有されている。
144+  そのため素性の破壊的な修正は、それを参照している他の箇所にも影響を与える。</span></pre>
145+ <h4>wakati関数</h4>
146+  分かち書きを行う。
147+ <br />
148+ <span class="note">※ スレッドセーフ</span>
149+ <pre>(wakati <i>text</i> <span class="keyword">&optional</span> (<i>tagger</i> *tagger*))
150+ <span class="comment">=></span> <i>result</i>
151+
152+text: 形態素解析対象テキスト(string型)
153+tagger: taggerオブジェクト。load-tagger関数の戻り値
154+result: 分かち書きされた表層形(文字列)のリスト。</pre>
147155
148- <span class="comment">/**
149- * 分かち書きを行う
150- *
151- * @param text 分かち書き対象テキスト
152- * @param result 分かち書きされた文字列が格納されるリスト. 末尾に追加される
153- * @return 引数のresultオブジェクトが返される
154- */</span>
155- <span class="keyword">public</span> <span class="class">List</span>&lt;<span class="class">String</span>&gt; wakati(<span class="class">CharSequence</span> text, <span class="class">List</span>&lt;<span class="class">String</span>&gt; result);
156- <span class="comment">/**
157- * 分かち書きを行う
158- *
159- * @param text 分かち書き対象テキスト
160- * @return 分かち書きされた文字列が格納されているリスト
161- */</span>
162- <span class="keyword">public</span> <span class="class">List</span>&lt;<span class="class">String</span>&gt; wakati(<span class="class">CharSequence</span> text);
163-}</pre>
164-<h3>Morphemeクラス</h3>
165-<pre>
166-<span class="keyword">package</span> net.reduls.igo;
167156
168-<span class="comment">/**
169- * 形態素クラス
170- * - このクラスのインスタンスは不可変でありスレッドセーフ
171- */</span>
172-<span class="keyword">public final class</span> <span class="class">Morpheme</span> {
173- <span class="keyword">public final</span> <span class="class">String</span> surface; <span class="comment">// 形態素の表層形</span>
174- <span class="keyword">public final</span> <span class="class">String</span> feature; <span class="comment">// 形態素の素性文字列</span>
175- <span class="keyword">public final</span> <span class="class">int</span> start; <span class="comment">// 入力テキスト内での形態素の出現開始位置 ※1</span>
176-}
177-<span class="comment">/**
178- * ※1 ' '(0x20)などの空白文字は、解析結果形態素列から除外されるため、
179- * 各形態素と入力テキストの対応を正確に取得するためには、このフィールドを用いる必要がある。
180- * (surface.lengthを積算していくだけではズレが生じる可能性がある)
181- */</span></pre>
182-
183157 <h3>サンプルコード</h3>
184-<pre>
185-<span class="keyword">import</span> java.io.BufferedReader;
186-<span class="keyword">import</span> java.io.InputStreamReader;
187-<span class="keyword">import</span> java.io.IOException;
188-<span class="keyword">import</span> net.reduls.igo.Tagger;
189-<span class="keyword">import</span> net.reduls.igo.Morpheme;
158+  <a href="http://mecab.sourceforge.net/dic-detail.html">MeCabでの例</a>を真似て、cl-igoでAuto Linkを行うサンプルを載せる。<br />
159+ <span class="note">※ ただし、MeCabの例とは結構異なっている。</span>
160+  <pre>
161+<span class="comment">;;;; Auto Linkのサンプル</span>
162+<span class="comment">;;;; - 入力テキストの形態素解析を行い、品詞が名詞のものにはリンクを貼る</span>
163+<span class="comment">;;;; - 辞書にはIPA辞書を使用。 ※ そのためリンクURLが変</span>
164+(<span class="keyword">require</span> :igo)
190165
191-<span class="comment">/**
192- * 標準入力からテキストを読み込んで、形態素解析結果を標準出力に出力する
193- * - コンパイル: javac -cp igo-0.4.2.jar Sample.java
194- * - 実行: java -cp igo-0.4.2.jar:. Sample &lt;バイナリ辞書ディレクトリ&gt;
195- */</span>
196-<span class="keyword">public class</span> <span class="class">Sample</span> {
197- <span class="keyword"> public static</span> <span class="class">void</span> main(<span class="class">String</span>[] args) <span class="keyword">throws</span> <span class="class">IOException</span> {
198- if(args.length != 1)
199- <span class="class">System</span>.exit(1);
200-
201- <span class="keyword">final</span> <span class="class">String</span> dicDir = args[0];
202- <span class="keyword">final</span> <span class="class">Tagger</span> tagger = <span class="keyword">new</span> <span class="class">Tagger</span>(dicDir);
203- <span class="keyword">final</span> <span class="class">BufferedReader</span> br = <span class="keyword">new</span> <span class="class">BufferedReader</span>(<span class="keyword">new</span> <span class="class">InputStreamReader</span>(<span class="class">System</span>.in));
166+<span class="comment">;; Auto Link用の素性文字列パーサ</span>
167+(<span class="keyword">defun</span> autolink-parser (feature)
168+ <span class="comment">;; 品詞が名詞の単語にはリンクを貼る</span>
169+ (let ((link? (string= feature <span class="string">"名詞"</span> :end1 2)))
170+ (if link?
171+ (lambda (word-surface)
172+ (format nil <span class="string">"&lt;a href=~S&gt;~A&lt;/a&gt;"</span> feature word-surface))
173+ #'identity)))
204174
205- <span class="keyword">for</span>(<span class="class">String</span> line=br.readLine(); line!=null; line=br.readLine())
206- <span class="keyword">for</span>(<span class="class">Morpheme</span> m : tagger.parse(line))
207- <span class="class">System</span>.out.println(m.surface+<span class="string">"\t"</span>+m.feature);
208- }
209-}
175+<span class="comment">;; Auto Link用のtaggerをロード</span>
176+(igo:load-tagger <span class="string">"/path/to/dic-dir/"</span> #'autolink-parser)
177+
178+<span class="comment">;; 入力テキストのAuto Linkを行う関数</span>
179+(<span class="keyword">defun</span> autolink (text)
180+ (with-output-to-string (out)
181+ (loop FOR (surface autolink-fn) IN (igo:parse text) DO
182+ <span class="comment">;; 素性関数(autolink-parserの戻り値)を表層形に適用し、結果を集める</span>
183+ (princ (funcall autolink-fn surface) out))))</pre>
184+  実行例。
185+ <pre>
186+(igo:parse <span class="string">"すもももももももものうち"</span>)
187+<span class="comment"> => (("すもも" #&lt;CLOSURE # {C0989C5}&gt; 0) ("も" #&lt;FUNCTION IDENTITY&gt; 3)
188+ ("もも" #&lt;CLOSURE # {C0A9CF5}&gt; 4) ("も" #&lt;FUNCTION IDENTITY&gt; 6)
189+ ("もも" #&lt;CLOSURE # {C0A9CF5}&gt; 7) ("の" #&lt;FUNCTION IDENTITY&gt; 9)
190+ ("うち" #&lt;CLOSURE # {C089C75}&gt; 10))</span>
191+
192+(autolink <span class="string">"すもももももももものうち"</span>)
193+<span class="comment"> => "&lt;a href=\&quot;名詞,一般,*,*,*,*,すもも,スモモ,スモモ\&quot;&gt;すもも&lt;/a&gt;も&lt;a href=\&quot;名詞,一般,*,*,*,*,もも,モモ,モモ\&quot;&gt;もも&lt;/a&gt;も
194+ &lt;a href=\&quot;名詞,一般,*,*,*,*,もも,モモ,モモ\&quot;&gt;もも&lt;/a&gt;の&lt;a href=\&quot;名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ\&quot;&gt;うち&lt;/a&gt;"</span>
195+
196+(princ *) <span class="comment">; 見やすくするためにHTMLエスケープを外している</span>
197+<span class="comment"> => <a href="名詞,一般,*,*,*,*,すもも,スモモ,スモモ">すもも</a>も<a href="名詞,一般,*,*,*,*,もも,モモ,モモ">もも</a>も<a href="名詞,一般,*,*,*,*,もも,モモ,モモ">もも</a>の<a href="名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ">うち</a></span>
210198 </pre>
211-
212199 <!-- ライセンス -->
213200 <h2 id="license">ライセンス</h2>
214201  MITライセンス。配布物のCOPYINGファイルを参照。
Show on old repository browser