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

Revision 114, 10.1 kB (checked in by naoya_t, 17 years ago)

ypsilon: mecab-ffi first import

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