root/lang/scheme/r6rs/ypsilon/ffi/mecab-ffi/trunk/lib/binding/mecab-ffi.scm @ 115

Revision 115, 10.0 kB (checked in by naoya_t, 17 years ago)
Line 
1(library (binding mecab-ffi)
2         (export mecab-new2
3                 mecab-version
4                 mecab-strerror
5                 mecab-destroy
6                 mecab-get-partial mecab-set-partial!
7                 ;;mecab-get-theta mecab-set-theta!
8                 mecab-get-lattice-level mecab-set-lattice-level!
9                 mecab-get-all-morphs mecab-set-all-morphs!
10                 mecab-sparse-tostr mecab-sparse-tostr2 ;mecab-sparse-tostr3
11                 mecab-sparse-tonode mecab-sparse-tonode2
12                 mecab-nbest-sparse-tostr mecab-nbest-sparse-tostr2 ;mecab-nbest-sparse-tostr3
13                 mecab-nbest-init mecab-nbest-init2
14                 mecab-nbest-next-tostr mecab-nbest-next-tostr2
15                 mecab-nbest-next-tonode
16                 mecab-format-node
17                 mecab-dictionary-info
18
19                 mecab-node-prev mecab-node-next mecab-node-enext mecab-node-bnext
20                 mecab-node-surface mecab-node-feature mecab-node-id
21                 mecab-node-length mecab-node-rlength
22                 mecab-node-rc-attr mecab-node-lc-attr
23                 mecab-node-posid mecab-node-char-type
24                 mecab-node-stat mecab-node-normal? mecab-node-unknown? mecab-node-bos? mecab-node-eos?
25                 mecab-node-best?
26                 mecab-node-sentence-length
27                 ;; mecab-node-alpha mecab-node-beta mecab-node-prob
28                 mecab-node-wcost mecab-node-cost
29                 mecab-node-token
30                 
31;                 string->utf8z
32                 )
33         (import (rnrs) (core)
34                 (rnrs r5rs)
35;                 (ypsilon ffi)
36                                 (ffi)
37                 )
38
39(define libmecab (load-shared-object "libmecab.1.dylib"))
40
41;(define-c-typedef mecab-t* void*)
42(define-c-typedef mecab-node-t*  void*)
43(define-c-typedef mecab-node-t** void*)
44(define-c-typedef mecab-path-t*  void*)
45(define-c-typedef mecab-token-t* void*)
46
47(define-c-struct-type mecab-node-t
48  (mecab-node-t*  prev)
49  (mecab-node-t*  next)
50  (mecab-node-t*  enext)
51  (mecab-node-t*  bnext)
52  (mecab-path-t*  rpath)
53  (mecab-path-t*  lpath)
54  (mecab-node-t** begin-node-list)
55  (mecab-node-t** end-node-list)
56  (char*          surface)
57  (char*          feature)
58  (int            id)
59  (short          length)
60  (short          rlength)
61  (short          rc-attr)
62  (short          lc-attr)
63  (short          posid)
64  (char           char-type)
65  (char           stat)
66  (char           is-best)
67  (int            sentence-length)
68  (int            alpha) ; float
69  (int            beta)  ; float
70  (int            prob)  ; float
71; (float          alpha) ;; => internal inconsistency
72; (float          beta)  ;; => internal inconsistency
73; (float          prob)  ;; => internal inconsistency
74  (short          wcost)
75  (long           cost)
76  (mecab-token-t* token))
77
78(define (compose f g) (lambda args (f (apply g args))))
79
80(define sizeof-mecab-node-t 88)
81(define (void*->mecab-node-t* void*-ptr)
82  (make-bytevector-mapping void*-ptr sizeof-mecab-node-t))
83(define (char*->string char*-ptr . args)
84  (if (null? args)
85          (car (string-split (char*->string char*-ptr 255) #\x0)) ;;
86          (let ((len (car args)))
87                (utf8->string (make-bytevector-mapping char*-ptr len))
88                )))
89
90(define mecab-new2
91  (c-function libmecab "libmecab" void* mecab_new2 (char*)))
92(define mecab-version
93  (c-function libmecab "libmecab" char* mecab_version ()))
94(define mecab-strerror
95  (c-function libmecab "libmecab" char* mecab_strerror (void*)))
96(define mecab-destroy
97  (c-function libmecab "libmecab" void mecab_destroy (void*)))
98
99;; パラメータ変更系
100(define mecab-get-partial
101  (c-function libmecab "libmecab" int mecab_get_partial (void*)))
102(define mecab-set-partial!
103  (c-function libmecab "libmecab" void mecab_set_partial (void* int)))
104;(define mecab-get-theta
105;  (c-function libmecab "libmecab" float mecab_get_theta (void*)))
106;(define mecab-set-theta!
107;  (c-function libmecab "libmecab" void mecab_set_theta (void* float)))
108(define mecab-get-lattice-level
109  (c-function libmecab "libmecab" int mecab_get_lattice_level (void*)))
110(define mecab-set-lattice-level!
111  (c-function libmecab "libmecab" int mecab_set_lattice_level (void* int)))
112(define mecab-get-all-morphs
113  (c-function libmecab "libmecab" int mecab_get_all_morphs (void*)))
114(define mecab-set-all-morphs!
115  (c-function libmecab "libmecab" void mecab_set_all_morphs (void* int)))
116
117(define mecab-sparse-tostr
118  (c-function libmecab "libmecab" char* mecab_sparse_tostr (void* char*)))
119(define mecab-sparse-tostr2
120  (c-function libmecab "libmecab" char* mecab_sparse_tostr (void* char* int)))
121;(define mecab-sparse-tostr3
122;  (c-function libmecab "libmecab" char* mecab_sparse_tostr (void* char* int char* int)))
123(define mecab-sparse-tonode
124  (compose void*->mecab-node-t*
125                   (c-function libmecab "libmecab" void* mecab_sparse_tonode (void* char*))))
126(define mecab-sparse-tonode2
127  (compose void*->mecab-node-t*
128                   (c-function libmecab "libmecab" void* mecab_sparse_tonode2 (void* char* int))))
129;(define (mecab-sparse-tonode m str); mecab_node_t* を返す
130;  (void*->mecab-node-t* (mecab-sparse-tonode__ m str)))
131;(define (mecab-sparse-tonode2 m str len); mecab_node_t* を返す
132;  (void*->mecab-node-t* (mecab-sparse-tonode2__ m str len)))
133
134(define mecab-nbest-sparse-tostr
135  (c-function libmecab "libmecab" char* mecab_nbest_sparse_tostr (void* int char*)))
136(define mecab-nbest-sparse-tostr2
137  (c-function libmecab "libmecab" char* mecab_nbest_sparse_tostr2 (void* int char* int)))
138;(define mecab-nbest-sparse-tostr3
139;  (c-function libmecab "libmecab" char* mecab_nbest_sparse_tostr3 (void* int char int char* int)))
140(define mecab-nbest-init
141  (c-function libmecab "libmecab" int mecab_nbest_init (void* char*)))
142(define mecab-nbest-init2
143  (c-function libmecab "libmecab" int mecab_nbest_init2 (void* char* int)))
144(define mecab-nbest-next-tostr
145  (c-function libmecab "libmecab" char* mecab_nbest_next_tostr (void*)))
146(define mecab-nbest-next-tostr2
147  (c-function libmecab "libmecab" char* mecab_nbest_next_tostr2 (void* char* int)))
148(define mecab-nbest-next-tonode ; mecab_node_t*
149  (c-function libmecab "libmecab" void* mecab_nbest_next_tonode (void*)))
150(define mecab-format-node
151  (c-function libmecab "libmecab" char* mecab_format_node (void* void*))) ; (mecab node)
152(define mecab-dictionary-info ; mecab_dictionary_info_t* を返す
153  (c-function libmecab "libmecab" void* mecab_dictionary_info (void*)))
154
155;; APIs not supported:
156;;  MECAB_DLL_EXTERN int           mecab_do (int argc, char **argv);
157;;  MECAB_DLL_EXTERN mecab_t*      mecab_new(int argc, char **argv);
158;;  MECAB_DLL_EXTERN int           mecab_dict_index(int argc, char **argv);
159;;  MECAB_DLL_EXTERN int           mecab_dict_gen(int argc, char **argv);
160;;  MECAB_DLL_EXTERN int           mecab_cost_train(int argc, char **argv);
161;;  MECAB_DLL_EXTERN int           mecab_system_eval(int argc, char **argv);
162;;  MECAB_DLL_EXTERN int           mecab_test_gen(int argc, char **argv);
163
164
165;;
166;; mecab_node_t
167;;
168(define (mecab-node-prev node) (void*->mecab-node-t* (mecab-node-t-prev node)))
169(define (mecab-node-next node) (void*->mecab-node-t* (mecab-node-t-next node)))
170(define (mecab-node-enext node) (void*->mecab-node-t* (mecab-node-t-enext node)))
171(define (mecab-node-bnext node) (void*->mecab-node-t* (mecab-node-t-bnext node)))
172(define (mecab-node-surface node)
173  (char*->string (mecab-node-t-surface node) (mecab-node-t-length node)))
174(define (mecab-node-feature node)
175  (let ((feature (char*->string (mecab-node-t-feature node))))
176        (map (lambda (s) (if (string=? "*" s) #f s))
177                 (string-split feature #\,))))
178 
179(define (mecab-node-id node) (mecab-node-t-id node))
180(define (mecab-node-length node) (mecab-node-t-length node))
181(define (mecab-node-rlength node) (mecab-node-t-rlength node))
182(define (mecab-node-rc-attr node) (mecab-node-t-rc-attr node))
183(define (mecab-node-lc-attr node) (mecab-node-t-lc-attr node))
184(define (mecab-node-posid node) (mecab-node-t-posid node))
185(define (mecab-node-char-type node) (mecab-node-t-char-type node))
186(define (mecab-node-stat node)
187  (case (mecab-node-t-stat node)
188        [(0) 'mecab-nor-node]
189        [(1) 'mecab-unk-node]
190        [(2) 'mecab-bos-node]
191        [(3) 'mecab-eos-node]))
192
193(define (mecab-node-normal? node) (eq? 'mecab-nor-node (mecab-node-stat node)))
194(define (mecab-node-unknown? node) (eq? 'mecab-unk-node (mecab-node-stat node)))
195(define (mecab-node-bos? node) (eq? 'mecab-bos-node (mecab-node-stat node)))
196(define (mecab-node-eos? node) (eq? 'mecab-eos-node (mecab-node-stat node)))
197(define (mecab-node-best? node) (= 1 (mecab-node-t-is-best node)))
198(define (mecab-node-sentence-length node) ; available only when BOS
199  (mecab-node-t-sentence-length node))
200;(define (mecab-node-alpha node-ptr)
201;  (pointer-ref node-ptr 16))
202;(define (mecab-node-beta node-ptr)
203;  (pointer-ref node-ptr 17))
204;(define (mecab-node-prob node-ptr)
205;  (pointer-ref node-ptr 18))
206(define (mecab-node-wcost node) (mecab-node-t-wcost node))
207(define (mecab-node-cost node) (mecab-node-t-cost node))
208(define (mecab-node-token node) (mecab-node-t-token node))
209
210
211;; from 逆引きScheme
212(define (string-split-by-char str spliter)
213  (let loop ((ls (string->list str)) (buf '()) (ret '()))
214    (if (pair? ls)
215      (if (char=? (car ls) spliter)
216        (loop (cdr ls) '() (cons (list->string (reverse buf)) ret))
217        (loop (cdr ls) (cons (car ls) buf) ret))
218      (reverse (cons (list->string (reverse buf)) ret)))))
219
220(define (string-split-by-string str spliter)
221  (if (zero? (string-length spliter))
222    (list str)
223    (let ((spl (string->list spliter)))
224      (let loop ((ls (string->list str)) (sp spl) (tmp '()) (buf '()) (ret '()))
225        (if (pair? sp)
226          (if (pair? ls)
227            (if (char=? (car ls) (car sp))
228              (loop (cdr ls) (cdr sp) (cons (car ls) tmp) buf ret)
229              (loop (cdr ls) spl '() (cons (car ls) (append tmp buf)) ret))
230            (reverse (cons (list->string (reverse (append tmp buf))) ret)))
231          (loop ls spl '() '() (cons (list->string (reverse buf)) ret)))))))
232
233(define (string-split str spliter)
234  (cond [(char? spliter) (string-split-by-char str spliter)]
235        [(string? spliter) (string-split-by-string str spliter)]
236        [else #f]))
237
238)
Note: See TracBrowser for help on using the browser.