rbbt-text 0.2.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data/bin/get_ppis.rb +52 -0
  2. data/lib/rbbt/bow/dictionary.rb +9 -9
  3. data/lib/rbbt/bow/misc.rb +86 -2
  4. data/lib/rbbt/corpus/corpus.rb +55 -0
  5. data/lib/rbbt/corpus/document.rb +289 -0
  6. data/lib/rbbt/corpus/document_repo.rb +115 -0
  7. data/lib/rbbt/corpus/sources/pubmed.rb +26 -0
  8. data/lib/rbbt/ner/NER.rb +7 -5
  9. data/lib/rbbt/ner/abner.rb +13 -2
  10. data/lib/rbbt/ner/annotations.rb +182 -51
  11. data/lib/rbbt/ner/annotations/annotated.rb +15 -0
  12. data/lib/rbbt/ner/annotations/named_entity.rb +37 -0
  13. data/lib/rbbt/ner/annotations/relations.rb +25 -0
  14. data/lib/rbbt/ner/annotations/token.rb +28 -0
  15. data/lib/rbbt/ner/annotations/transformed.rb +170 -0
  16. data/lib/rbbt/ner/banner.rb +8 -5
  17. data/lib/rbbt/ner/chemical_tagger.rb +34 -0
  18. data/lib/rbbt/ner/ngram_prefix_dictionary.rb +136 -0
  19. data/lib/rbbt/ner/oscar3.rb +1 -1
  20. data/lib/rbbt/ner/oscar4.rb +41 -0
  21. data/lib/rbbt/ner/patterns.rb +132 -0
  22. data/lib/rbbt/ner/rnorm.rb +141 -0
  23. data/lib/rbbt/ner/rnorm/cue_index.rb +80 -0
  24. data/lib/rbbt/ner/rnorm/tokens.rb +218 -0
  25. data/lib/rbbt/ner/token_trieNER.rb +185 -51
  26. data/lib/rbbt/nlp/genia/sentence_splitter.rb +214 -0
  27. data/lib/rbbt/nlp/nlp.rb +235 -0
  28. data/share/install/software/ABNER +0 -4
  29. data/share/install/software/ChemicalTagger +81 -0
  30. data/share/install/software/Gdep +115 -0
  31. data/share/install/software/Geniass +118 -0
  32. data/share/install/software/OSCAR4 +16 -0
  33. data/share/install/software/StanfordParser +15 -0
  34. data/share/patterns/drug_induce_disease +22 -0
  35. data/share/rnorm/cue_default +10 -0
  36. data/share/rnorm/tokens_default +86 -0
  37. data/share/{stopwords → wordlists/stopwords} +0 -0
  38. data/test/rbbt/bow/test_bow.rb +1 -1
  39. data/test/rbbt/bow/test_dictionary.rb +1 -1
  40. data/test/rbbt/bow/test_misc.rb +1 -1
  41. data/test/rbbt/corpus/test_corpus.rb +99 -0
  42. data/test/rbbt/corpus/test_document.rb +222 -0
  43. data/test/rbbt/ner/annotations/test_named_entity.rb +14 -0
  44. data/test/rbbt/ner/annotations/test_transformed.rb +175 -0
  45. data/test/rbbt/ner/test_abner.rb +1 -1
  46. data/test/rbbt/ner/test_annotations.rb +64 -2
  47. data/test/rbbt/ner/test_banner.rb +1 -1
  48. data/test/rbbt/ner/test_chemical_tagger.rb +56 -0
  49. data/test/rbbt/ner/test_ngram_prefix_dictionary.rb +20 -0
  50. data/test/rbbt/ner/{test_oscar3.rb → test_oscar4.rb} +12 -13
  51. data/test/rbbt/ner/test_patterns.rb +66 -0
  52. data/test/rbbt/ner/test_regexpNER.rb +1 -1
  53. data/test/rbbt/ner/test_rnorm.rb +47 -0
  54. data/test/rbbt/ner/test_token_trieNER.rb +60 -35
  55. data/test/rbbt/nlp/test_nlp.rb +88 -0
  56. data/test/test_helper.rb +20 -0
  57. metadata +93 -20
@@ -0,0 +1,235 @@
1
+ require 'rbbt'
2
+ require 'rbbt/util/tmpfile'
3
+ require 'rbbt/util/persistence'
4
+ require 'rbbt/util/resource'
5
+ require 'rbbt/ner/annotations'
6
+ require 'rbbt/ner/annotations/annotated'
7
+ require 'rbbt/nlp/genia/sentence_splitter'
8
+ require 'digest/md5'
9
+
10
+
11
+ module NLP
12
+
13
+ extend LocalPersist
14
+ self.local_persistence_dir = '/tmp/crap'
15
+
16
+ #Rbbt.software.opt.StanfordParser.define_as_install Rbbt.share.install.software.StanfordParser.find
17
+ #Rbbt.software.opt.StanfordParser.produce
18
+
19
+ Rbbt.software.opt.Geniass.define_as_install Rbbt.share.install.software.Geniass.find
20
+ Rbbt.software.opt.Geniass.produce
21
+
22
+ Rbbt.software.opt.Gdep.define_as_install Rbbt.share.install.software.Gdep.find
23
+ Rbbt.software.opt.Gdep.produce
24
+
25
+ NEW_LINE_MASK = "\t\t \t \t"
26
+
27
+ def self.geniass_sentence_splitter(text)
28
+ offsets = []
29
+
30
+ cleaned = text.gsub("\n",NEW_LINE_MASK)
31
+ TmpFile.with_file(cleaned) do |fin|
32
+ TmpFile.with_file do |fout|
33
+ CMD.cmd("cd #{Rbbt.software.opt.Geniass.find}; ./geniass #{ fin } #{ fout }")
34
+
35
+
36
+ Open.write(fin, Open.read(fin).gsub(NEW_LINE_MASK, "\n"))
37
+ Open.write(fout, Open.read(fout).gsub("\n", '|').gsub(NEW_LINE_MASK, "\n"))
38
+ # Addapted from sentence2standOff.rb in Geniass package
39
+
40
+ inTxtStrict = Open.open(fin)
41
+ inTxtNew = Open.open(fout)
42
+
43
+ marker = "|"[0]
44
+ position = 0
45
+ sentenceCount = 1
46
+ target = ''
47
+ targetNew = ''
48
+ start = 0
49
+ finish = 0
50
+
51
+ while(!inTxtNew.eof?) do
52
+ targetNew = inTxtNew.getc
53
+ target = inTxtStrict.getc
54
+ position += 1
55
+ if targetNew == marker
56
+ sentenceCount += 1
57
+ finish = position - 1
58
+ offsets << [start, finish] if finish - start > 10
59
+ if targetNew == target
60
+ start = position
61
+ else
62
+ targetNew = inTxtNew.getc
63
+ while targetNew != target do
64
+ target = inTxtStrict.getc
65
+ position += 1
66
+ end
67
+ start = position - 1
68
+ end
69
+ end
70
+ end
71
+
72
+ finish = position - 1
73
+ offsets << [start, finish] if finish > start
74
+
75
+ inTxtStrict.close
76
+ inTxtNew.close
77
+ end
78
+ end
79
+
80
+ offsets.collect do |s,e|
81
+ sentence = text[s..e]
82
+ next if sentence.nil?
83
+ #sentence.gsub!(NEW_LINE_MASK, "\n")
84
+ Segment.annotate sentence, s
85
+ sentence
86
+ end
87
+ end
88
+
89
+ module GdepToken
90
+ attr_accessor :num, :token, :lemma, :chunk, :pos, :bio, :link, :dep
91
+ include Segment
92
+
93
+ def self.annotate(token, offset = nil, num = nil, lemma = nil, chunk = nil, pos = nil, bio = nil, link = nil, dep = nil)
94
+ token.extend GdepToken
95
+
96
+ token.offset = offset
97
+ token.num = num
98
+ token.lemma = lemma
99
+ token.chunk = chunk
100
+ token.pos = pos
101
+ token.bio = bio
102
+ token.link = link
103
+ token.dep = dep
104
+
105
+ token
106
+ end
107
+ end
108
+
109
+ module GdepChunk
110
+ attr_accessor :type, :parts, :segment_types
111
+ include Segment
112
+
113
+ def self.annotate(string, offset = nil, type = nil, parts = nil)
114
+ string.extend GdepChunk
115
+
116
+ string.offset = offset
117
+ string.type = type
118
+ string.parts = parts
119
+
120
+ string
121
+ end
122
+ end
123
+
124
+ def self.merge_vp_chunks(chunk_list)
125
+ vp = nil
126
+ new_chunks = []
127
+ chunk_list.each do |chunk|
128
+ if chunk.type =~ /^VP/
129
+ if vp.nil?
130
+ vp = chunk
131
+ else
132
+ vp << chunk
133
+ vp.parts.concat chunk.parts
134
+ end
135
+ else
136
+ new_chunks << vp if not vp.nil?
137
+ new_chunks << chunk
138
+ vp = nil
139
+ end
140
+ end
141
+
142
+ new_chunks
143
+ end
144
+
145
+ def self.gdep_chunks(sentence, segment_list)
146
+ chunks = []
147
+
148
+ chunk_start = "B"[0]
149
+ chunk_inside = "I"[0]
150
+
151
+ last = GdepToken.annotate("LW")
152
+
153
+ chunk_segments = []
154
+ segment_list.each do |segment|
155
+ if segment.chunk[0] == chunk_inside and not segment.offset.nil?
156
+ chunk_segments << segment
157
+ else
158
+ if chunk_segments.any?
159
+ cstart = chunk_segments.first.offset
160
+ cend = chunk_segments.last.end
161
+ chunk = sentence[cstart..cend]
162
+ GdepChunk.annotate(chunk, cstart, last.chunk.sub(/^.-/,''), chunk_segments)
163
+ chunks << chunk
164
+ end
165
+
166
+ if segment.offset.nil?
167
+ chunk_segments = []
168
+ else
169
+ chunk_segments = [segment]
170
+ end
171
+ end
172
+ last = segment
173
+ end
174
+
175
+ chunks
176
+ end
177
+
178
+ def self.gdep_parse_sentences(sentences)
179
+ sentences = Array === sentences ? sentences : [sentences]
180
+
181
+ input = sentences.collect{|sentence| sentence.gsub(/\n/, NEW_LINE_MASK)} * "\n"
182
+ sentence_tokens = TmpFile.with_file(input) do |fin|
183
+ out = local_persist(Digest::MD5.hexdigest(input), :Chunks, :string) do
184
+ CMD.cmd("cd #{Rbbt.software.opt.Gdep.find}; ./gdep #{ fin }").read
185
+ end
186
+
187
+ out.split(/^$/).collect do |sentence|
188
+ tokens = sentence.split(/\n/).collect do |line|
189
+ next if line.empty?
190
+ num, token, lemma, chunk, pos, bio, link, dep = line.split(/\t/)
191
+ GdepToken.annotate(token, nil, num, lemma, chunk, pos, bio, link, dep)
192
+ end.compact
193
+ end
194
+ end
195
+
196
+ sentences.zip(sentence_tokens).collect do |sentence, tokens|
197
+ Segment.align(sentence, tokens)
198
+ end
199
+ end
200
+
201
+
202
+ def self.gdep_parse_sentences_extension(sentences)
203
+ require Rbbt.software.opt.Gdep.ruby["Gdep.so"].find
204
+ gdep = Gdep.new
205
+ if not gdep.gdep_is_loaded
206
+ Misc.in_dir Rbbt.software.opt.Gdep.find do
207
+ gdep.load_gdep
208
+ end
209
+ end
210
+
211
+ sentences = Array === sentences ? sentences : [sentences]
212
+
213
+ sentence_tokens = sentences.collect{|sentence|
214
+ Gdep.new.tag(sentence).split(/\n/).collect do |line|
215
+ next if line.empty?
216
+ token, lemma, pos, chunk = line.split(/\t/)
217
+ GdepToken.annotate(token, nil, nil, lemma, chunk, pos)
218
+ token
219
+ end.compact
220
+ }
221
+
222
+ sentences.zip(sentence_tokens).collect do |sentence, tokens|
223
+ Segment.align(sentence, tokens)
224
+ tokens
225
+ end
226
+ end
227
+
228
+ def self.gdep_chunk_sentences(sentences)
229
+ sentences = Array === sentences ? sentences : [sentences]
230
+ NLP.gdep_parse_sentences_extension(sentences).zip(sentences).collect do |segment_list, sentence|
231
+ chunk_list = NLP.gdep_chunks(sentence, segment_list)
232
+ NLP.merge_vp_chunks(chunk_list)
233
+ end
234
+ end
235
+ end
@@ -1,9 +1,5 @@
1
1
  #!/bin/bash
2
2
 
3
- INSTALL_HELPER_FILE="$1"
4
- RBBT_SOFTWARE_DIR="$2"
5
- source "$INSTALL_HELPER_FILE"
6
-
7
3
  name='ABNER'
8
4
  url="http://pages.cs.wisc.edu/~bsettles/abner/abner.jar"
9
5
 
@@ -0,0 +1,81 @@
1
+ #!/bin/bash
2
+
3
+ INSTALL_HELPER_FILE="$1"
4
+ RBBT_SOFTWARE_DIR="$2"
5
+ source "$INSTALL_HELPER_FILE"
6
+
7
+ name='ChemicalTagger'
8
+ url="https://bitbucket.org/lh359/chemicaltagger/downloads/chemicalTagger-1.0-jar-with-dependencies.jar"
9
+
10
+ PKG_DIR=`opt_dir $name`
11
+ [ -d $PKG_DIR ] || mkdir -p $PKG_DIR
12
+ [ -t "$OPT_SRC_DIR/ChemicalTagger.jar" ] || wget "$url" -O "$OPT_SRC_DIR/ChemicalTagger.jar"
13
+ cp "$OPT_SRC_DIR/ChemicalTagger.jar" "$PKG_DIR/ChemicalTagger.jar"
14
+ [ -t "$OPT_JAR_DIR/ChemicalTagger.jar" ] || ln -sf "$PKG_DIR/ChemicalTagger.jar" "$OPT_JAR_DIR/ChemicalTagger.jar"
15
+
16
+ cat > /tmp/RbbtChemicalTagger.java <<EOF
17
+ import uk.ac.cam.ch.wwmm.chemicaltagger.Utils;
18
+ import uk.ac.cam.ch.wwmm.chemicaltagger.ChemistryPOSTagger ;
19
+ import uk.ac.cam.ch.wwmm.chemicaltagger.ChemistrySentenceParser;
20
+ import uk.ac.cam.ch.wwmm.chemicaltagger.POSContainer;
21
+ import uk.ac.cam.ch.wwmm.chemicaltagger.Utils;
22
+ import org.antlr.runtime.Token;
23
+ import org.antlr.runtime.tree.Tree;
24
+ import org.apache.commons.lang.StringUtils;
25
+ import nu.xom.Document;
26
+ import java.util.ArrayList;
27
+
28
+ class RbbtChemicalTagger{
29
+ public static String[] match(String text){
30
+
31
+ ChemistryPOSTagger chemPos = ChemistryPOSTagger.getDefaultInstance();
32
+
33
+ POSContainer posContainer = chemPos.runTaggers(text);
34
+
35
+ ChemistrySentenceParser chemistrySentenceParser = new ChemistrySentenceParser(posContainer);
36
+
37
+ chemistrySentenceParser.parseTags();
38
+
39
+ Tree tree = chemistrySentenceParser.getParseTree();
40
+
41
+ ArrayList tokens = new ArrayList();
42
+ ArrayList molecules = new ArrayList();
43
+ ArrayList new_tokens = new ArrayList();
44
+ tokens.add(tree);
45
+ while (tokens.size() > 0){
46
+ for(int tree_i = 0; tree_i < tokens.size(); tree_i++){
47
+ Tree subtree = (Tree) tokens.get(tree_i);
48
+ int type = subtree.getType();
49
+ if (type == 78){
50
+ molecules.add(subtree.getChild(0));
51
+ }else{
52
+ for(int tree_j = 0; tree_j < subtree.getChildCount(); tree_j++){
53
+ Tree child = subtree.getChild(tree_j);
54
+ new_tokens.add(child);
55
+ }
56
+ }
57
+ }
58
+ tokens = new_tokens;
59
+ new_tokens = new ArrayList();
60
+ }
61
+
62
+ String[] matches = new String[molecules.size()];
63
+ for(int molecule_i = 0; molecule_i < molecules.size(); molecule_i++){
64
+ Tree molecule = (Tree) molecules.get(molecule_i);
65
+ matches[molecule_i] = molecule.getText();
66
+ }
67
+ return matches;
68
+ }
69
+
70
+ public static void main(String[] args){
71
+ String text = "Alternatively, rearrangement of O-(w-haloalkyl)esters 34 of 2-carboethoxy-N-hydroxypyridine-2-selone affords azonianaphthalenium halides 37 in 79% yield";
72
+ match(text);
73
+ }
74
+ }
75
+
76
+ EOF
77
+
78
+ env |grep JAVA
79
+
80
+
81
+ (env CLASSPATH="$OPT_JAR_DIR/ChemicalTagger.jar:$CLASSPATH" /home/mvazquezg/software/opt/java/jdk/bin/javac /tmp/RbbtChemicalTagger.java && jar uf "$PKG_DIR/ChemicalTagger.jar" -C /tmp RbbtChemicalTagger.class) || (rm "$PKG_DIR/ChemicalTagger.jar" && rmdir $PKG_DIR)
@@ -0,0 +1,115 @@
1
+ #!/bin/bash
2
+
3
+ INSTALL_HELPER_FILE="$1"
4
+ RBBT_SOFTWARE_DIR="$2"
5
+ source "$INSTALL_HELPER_FILE"
6
+
7
+ name='Gdep'
8
+ url="http://people.ict.usc.edu/~sagae/parser/gdep/gdep-beta2.tgz"
9
+
10
+
11
+ get_pkg "$name" "$url"
12
+ uncompress_pkg "$name"
13
+
14
+ cd "$(echo $OPT_BUILD_DIR/`ls $OPT_BUILD_DIR |head -n 1`)"
15
+
16
+ pwd > /tmp/pwd
17
+ ls > /tmp/ls
18
+
19
+ cat >> Makefile <<'EOF'
20
+ libgdep.so: $(OBJS) ksdep.h
21
+ $(CPP) -o libgdep.so $(CFLAGS) $(OBJS) -shared
22
+ EOF
23
+
24
+ cat Makefile| sed 's/\(CFLAGS\s*=\)/\1 -fPIC/' > /tmp/clean.Makefile
25
+ mv /tmp/clean.Makefile Makefile
26
+
27
+ make gdep
28
+ make libgdep.so
29
+
30
+ mkdir lib
31
+ mv libgdep.so lib
32
+
33
+ build "$name" "$extra"
34
+
35
+ cd "$OPT_BUILD_DIR/$name"
36
+
37
+ mkdir ruby
38
+ cat > ruby/extconf.rb <<'EOF'
39
+ require 'mkmf-rice'
40
+ dir_config('gdep')
41
+ have_library('gdep')
42
+ create_makefile('Gdep')
43
+ EOF
44
+
45
+ cat > ruby/Gdep.cpp <<'EOF'
46
+ #include "rice/Class.hpp"
47
+ #include "rice/String.hpp"
48
+
49
+ #include <stdio.h>
50
+ #include <fstream>
51
+ #include <map>
52
+ #include <list>
53
+ #include <iostream>
54
+ #include <sstream>
55
+ #include "../maxent.h"
56
+ #include "../common.h"
57
+
58
+ using namespace Rice;
59
+ using namespace std;
60
+ void init_morphdic();
61
+ extern void load_ne_models();
62
+ string bidir_postag(const string & s, const vector<ME_Model> & vme, const vector<ME_Model> & cvme, bool dont_tokenize);
63
+
64
+
65
+ vector<ME_Model> vme(16);
66
+ vector<ME_Model> vme_chunking(16);
67
+ bool gdep_loaded = false;
68
+
69
+ void load_gdep()
70
+ {
71
+ init_morphdic();
72
+
73
+ for (int i = 0; i < 16; i++) {
74
+ char buf[1000];
75
+ sprintf(buf, "./models_medline/model.bidir.%d", i);
76
+ vme[i].load_from_file(buf);
77
+ }
78
+
79
+
80
+ for (int i = 0; i < 8; i +=2 ) {
81
+ char buf[1000];
82
+ sprintf(buf, "./models_chunking/model.bidir.%d", i);
83
+ vme_chunking[i].load_from_file(buf);
84
+ }
85
+
86
+ load_ne_models();
87
+
88
+ gdep_loaded = true;
89
+ }
90
+
91
+ bool gdep_is_loaded(){
92
+ return gdep_loaded;
93
+ }
94
+
95
+ string tag(string line){
96
+ return(bidir_postag(line, vme, vme_chunking, false));
97
+ }
98
+
99
+ extern "C"
100
+ void Init_Gdep()
101
+ {
102
+ Class rb_cGdep =
103
+ define_class("Gdep")
104
+ .define_method("load_gdep", &load_gdep)
105
+ .define_method("tag", &tag)
106
+ .define_method("gdep_is_loaded", &gdep_is_loaded);
107
+ }
108
+ EOF
109
+
110
+ cd ruby
111
+ ruby extconf.rb --with-gdep-dir="$OPT_DIR/$name"
112
+ make
113
+
114
+
115
+
@@ -0,0 +1,118 @@
1
+ #!/bin/bash
2
+
3
+ INSTALL_HELPER_FILE="$1"
4
+ RBBT_SOFTWARE_DIR="$2"
5
+ source "$INSTALL_HELPER_FILE"
6
+
7
+ name='Geniass'
8
+ url="http://www-tsujii.is.s.u-tokyo.ac.jp/~y-matsu/geniass/geniass-1.00.tar.gz"
9
+
10
+
11
+ get_pkg "$name" "$url"
12
+ uncompress_pkg "$name"
13
+
14
+ cd "$(echo $OPT_BUILD_DIR/`ls $OPT_BUILD_DIR |head -n 1`)"
15
+
16
+ pwd > /tmp/pwd
17
+ ls > /tmp/ls
18
+
19
+ cat >> Makefile <<'EOF'
20
+ libgeniass.so: maxent.o blmvm.o
21
+ $(CXX) $(CFLAGS) -o $@ -shared $^
22
+ EOF
23
+
24
+ cat Makefile| sed 's/\(CFLAGS\s*=\)/\1 -fPIC/' > /tmp/clean.Makefile
25
+ mv /tmp/clean.Makefile Makefile
26
+
27
+ make geniass
28
+ make libgeniass.so
29
+
30
+ mkdir lib
31
+ mv libgeniass.so lib
32
+
33
+ build "$name" "$extra"
34
+
35
+ cd "$OPT_BUILD_DIR/$name"
36
+
37
+ mkdir ruby
38
+ cat > ruby/extconf.rb <<'EOF'
39
+ require 'mkmf-rice'
40
+ dir_config('geniass')
41
+ have_library('geniass')
42
+ create_makefile('Geniass')
43
+ EOF
44
+
45
+ cat > ruby/Geniass.cpp <<'EOF'
46
+ #include "rice/Class.hpp"
47
+ #include "rice/String.hpp"
48
+
49
+ #include <iostream>
50
+ #include <iomanip>
51
+ #include <string>
52
+ #include <list>
53
+ #include <cstdio>
54
+ #include <cstdlib>
55
+ #include <fstream>
56
+ #include <sstream>
57
+ #include "../maxent.h"
58
+
59
+ using namespace Rice;
60
+ using namespace std;
61
+
62
+ ME_Model model;
63
+ bool geniass_loaded = false;
64
+
65
+ void load_geniass(){
66
+ printf("loading model");
67
+ string modelFile = "model1-1.0";
68
+ model.load_from_file(modelFile.c_str());
69
+ geniass_loaded = true;
70
+ printf("..done\n");
71
+ }
72
+
73
+ bool geniass_is_loaded(){ return(geniass_loaded); };
74
+
75
+ void split(string& str, vector<string>& tokens)
76
+ {
77
+ istringstream in(str);
78
+ char c;
79
+
80
+ while (in){
81
+ string token;
82
+ token = "";
83
+ while (in.get(c) && (c != '\t')) token.push_back(c);
84
+ tokens.push_back(token);
85
+ }
86
+ }
87
+
88
+ string label(string line){
89
+ vector<string> tokens;
90
+ split(line, tokens);
91
+ ME_Sample s;
92
+
93
+ for(vector<string>::const_iterator token = tokens.begin() + 1;
94
+ token != tokens.end(); ++token){
95
+ s.add_feature(*token);
96
+ }
97
+ (void) model.classify(s);
98
+ return(s.label);
99
+ }
100
+
101
+ extern "C"
102
+ void Init_Geniass()
103
+ {
104
+ Class rb_cGeniass =
105
+ define_class("Geniass")
106
+ .define_method("load_geniass", &load_geniass)
107
+ .define_method("label", &label)
108
+ .define_method("geniass_is_loaded", &geniass_is_loaded);
109
+ }
110
+
111
+ EOF
112
+
113
+ cd ruby
114
+ ruby extconf.rb --with-geniass-dir="$OPT_DIR/$name"
115
+ make
116
+
117
+
118
+