rbbt-sent 1.0.0 → 1.0.1
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.
- data/LICENSE +10 -0
- data/bin/sent_config +9 -9
- data/install_scripts/analysis/Rakefile +65 -107
- data/lib/sent/main.rb +106 -62
- metadata +65 -32
data/LICENSE
CHANGED
@@ -11,6 +11,16 @@ the following conditions:
|
|
11
11
|
The above copyright notice and this permission notice shall be
|
12
12
|
included in all copies or substantial portions of the Software.
|
13
13
|
|
14
|
+
Any academic publication involving the use of this software in any way
|
15
|
+
should include a reference to the following publication:
|
16
|
+
|
17
|
+
Vazquez, M. and Carmona-Saez, P. and Nogales-Cadenas, R. and Chagoyen, M. and
|
18
|
+
Tirado, F. and Carazo, J.M. and Pascual-Montano, A.: "SENT: semantic features in
|
19
|
+
text". Nucleic Acids Research 2009, doi:10.1093/nar/gkp392
|
20
|
+
|
21
|
+
Any comercial use of the software must be notified for aproval to the
|
22
|
+
holder of the copyright, listed above.
|
23
|
+
|
14
24
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
25
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
26
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
data/bin/sent_config
CHANGED
@@ -13,10 +13,10 @@ $USAGE =<<EOT
|
|
13
13
|
actions:
|
14
14
|
* configure: Set paths for data, work, and tmp directories
|
15
15
|
|
16
|
-
*
|
16
|
+
* prepare:
|
17
17
|
* analysis: Install configuration to perform analysis
|
18
18
|
|
19
|
-
*
|
19
|
+
* install:
|
20
20
|
* metadocs: Generate metadocs for all organisms
|
21
21
|
|
22
22
|
* init:
|
@@ -48,14 +48,14 @@ class Controller < SimpleConsole::Controller
|
|
48
48
|
render :action => :usage
|
49
49
|
end
|
50
50
|
|
51
|
-
def
|
51
|
+
def prepare
|
52
52
|
raise "Run #{__FILE__} configure first to configure sent" if $noconfig
|
53
53
|
|
54
54
|
case params[:id]
|
55
55
|
when "analysis"
|
56
56
|
@tasks = %w(analysis)
|
57
57
|
when nil
|
58
|
-
redirect_to :action => :help, :id => :
|
58
|
+
redirect_to :action => :help, :id => :prepare
|
59
59
|
else
|
60
60
|
@tasks = [params[:id]]
|
61
61
|
end
|
@@ -65,14 +65,14 @@ class Controller < SimpleConsole::Controller
|
|
65
65
|
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def install
|
69
69
|
raise "Run #{__FILE__} configure first to configure rbbt" if $noconfig
|
70
70
|
|
71
71
|
case params[:id]
|
72
72
|
when "metadocs"
|
73
73
|
@location = File.join(Sent.datadir,'analysis')
|
74
74
|
else
|
75
|
-
redirect_to :action => :help, :id => :
|
75
|
+
redirect_to :action => :help, :id => :install
|
76
76
|
end
|
77
77
|
|
78
78
|
$force = true if params[:force]
|
@@ -90,7 +90,7 @@ class View < SimpleConsole::View
|
|
90
90
|
puts $USAGE
|
91
91
|
end
|
92
92
|
|
93
|
-
def
|
93
|
+
def prepare
|
94
94
|
require 'rake'
|
95
95
|
load File.join(Sent.rootdir, 'tasks/install.rake')
|
96
96
|
|
@@ -100,7 +100,7 @@ class View < SimpleConsole::View
|
|
100
100
|
}
|
101
101
|
end
|
102
102
|
|
103
|
-
def
|
103
|
+
def install
|
104
104
|
require 'rake'
|
105
105
|
|
106
106
|
puts "Changing directory to #{@location}"
|
@@ -108,7 +108,7 @@ class View < SimpleConsole::View
|
|
108
108
|
|
109
109
|
load "./Rakefile"
|
110
110
|
|
111
|
-
Rake::Task['
|
111
|
+
Rake::Task['default'].invoke
|
112
112
|
end
|
113
113
|
|
114
114
|
|
@@ -1,139 +1,97 @@
|
|
1
|
-
require '
|
1
|
+
require 'rake_pipeline'
|
2
2
|
require 'sent/main'
|
3
3
|
require 'rbbt/sources/organism'
|
4
4
|
require 'progress-monitor'
|
5
5
|
|
6
|
+
include Rake::Pipeline
|
6
7
|
|
7
|
-
$list = ENV['list']
|
8
|
-
$kstart = ENV['kstart'] || ENV['k']
|
9
|
-
$kend = ENV['kend'] || $kstart
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
def org_description(org, associations)
|
10
|
+
name = Organism.name(org)
|
11
|
+
supported_ids = Organism.supported_ids(org, :examples => true)
|
13
12
|
|
14
|
-
|
15
|
-
|
13
|
+
<<-EOT
|
14
|
+
Name: #{ name }
|
15
|
+
Organism: #{ name }
|
16
|
+
Description: #{associations.values.flatten.length} associations for #{associations.keys.length} genes and #{associations.values.flatten.uniq.length} articles
|
17
|
+
ID Format: #{supported_ids.collect{|p| "#{ p[0] } (#{ p[1] })"}.join(", ")}
|
18
|
+
EOT
|
16
19
|
end
|
17
20
|
|
18
|
-
rule (/NMF\/(.*)/) => lambda {|n| n.sub(/NMF/,'matrices') } do |t|
|
19
|
-
matrix = t.name.sub(/NMF/,'matrices')
|
20
|
-
|
21
|
-
k = $kstart
|
22
|
-
if $kstart < $kend
|
23
|
-
best = 0
|
24
|
-
ccc = Sent.CCC(matrix, $kstart, $kend)
|
25
|
-
ccc.each_with_index{|v,i|
|
26
|
-
if v.to_i > best
|
27
|
-
k = $kstart.to_i + i
|
28
|
-
end
|
29
|
-
}
|
30
|
-
end
|
31
21
|
|
32
|
-
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
rule (/matrices\/(.*)/) => lambda {|n| n.sub(/matrices/,'metadocs') } do |t|
|
37
|
-
metadocs = t.name.sub(/matrices/,'metadocs')
|
38
|
-
|
39
|
-
list = nil
|
40
|
-
list = Open.read($list).collect{|l| l.chomp} if $list
|
22
|
+
desc "Find gene mentions in text"
|
23
|
+
step_def :mentions do
|
41
24
|
|
42
|
-
Sent.
|
25
|
+
associations = Sent.mentions(job_name)
|
26
|
+
|
27
|
+
associations.collect {|code, pmids| "%s\t%s" % [code, pmids.uniq.join('|')] } * "\n"
|
43
28
|
end
|
44
29
|
|
45
|
-
|
46
|
-
|
30
|
+
desc "Join gene mention associations, entrez GeneRif associations, and GO associations"
|
31
|
+
step_def :associations do |t|
|
32
|
+
associations = Open.to_hash(StringIO.new(input), :flatten => true)
|
47
33
|
|
48
|
-
|
49
|
-
|
34
|
+
associations.merge!(Organism.gene_literature(job_name))
|
35
|
+
associations.merge!(Organism.gene_literature_go(job_name))
|
50
36
|
|
51
|
-
|
52
|
-
org = File.basename(t.name).sub(/_text/,'')
|
53
|
-
|
54
|
-
ner = Organism.ner(org, :rner)
|
55
|
-
norm = Organism.norm(org)
|
56
|
-
pmids = Organism.literature(org)
|
57
|
-
|
58
|
-
fout = File.open(t.name, 'w')
|
59
|
-
chunks = pmids.chunk(100)
|
60
|
-
|
61
|
-
Progress.monitor("Finding gene-article associations in text", 1000)
|
62
|
-
chunks.each{|chunk|
|
63
|
-
PubMed.get_article(chunk).each{|pmid, article|
|
64
|
-
text = article.text
|
65
|
-
|
66
|
-
mentions = ner.extract(text)
|
67
|
-
|
68
|
-
Progress.monitor("Resolving mentions", 1000)
|
69
|
-
codes = mentions.collect{|mention|
|
70
|
-
matches = norm.match(mention)
|
71
|
-
norm.select(matches,mention,text)
|
72
|
-
}.flatten.uniq.sort
|
73
|
-
|
74
|
-
codes.each{|code|
|
75
|
-
fout.puts "#{ code }\t#{pmid}"
|
76
|
-
}
|
77
|
-
|
78
|
-
}
|
79
|
-
}
|
80
|
-
fout.close
|
81
|
-
end
|
37
|
+
File.open(t.name + '.description', 'w') do |f| f.puts org_description(job_name, associations) end
|
82
38
|
|
83
|
-
|
84
|
-
|
39
|
+
associations.collect {|code, pmids| "%s\t%s" % [code, pmids.uniq.join('|')] } * "\n"
|
40
|
+
end
|
85
41
|
|
86
|
-
|
87
|
-
|
42
|
+
desc "Build dictionary"
|
43
|
+
step_def :dictionary do |t|
|
44
|
+
associations = Open.to_hash(StringIO.new(input), :flatten => true)
|
88
45
|
|
89
|
-
|
90
|
-
|
91
|
-
pmids.each{|pmid|
|
92
|
-
fout.puts "#{ gene }\t#{pmid}"
|
93
|
-
}
|
94
|
-
}
|
46
|
+
Progress.monitor("Building dictionary for #{job_name}")
|
47
|
+
term_weights, stems = Sent.dictionary(associations)
|
95
48
|
|
96
|
-
|
97
|
-
associations.each{|gene, pmids|
|
98
|
-
pmids.each{|pmid|
|
99
|
-
fout.puts "#{ gene }\t#{pmid}"
|
100
|
-
}
|
101
|
-
}
|
102
|
-
fout.close
|
49
|
+
File.open(t.name + '.stems', 'w') do |f| f.puts stems.collect{|stem, words| "%s\t%s" % [stem, words.join("|")] } end
|
103
50
|
|
104
|
-
|
105
|
-
|
106
|
-
associations = Open.to_hash(t.name, :flatten => true)
|
51
|
+
term_weights.collect {|term, weight| "%s\t%s" % [term, weight] } * "\n"
|
52
|
+
end
|
107
53
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
ID Format: #{supported_ids.collect{|p| "#{ p[0] } (#{ p[1] })"}.join(", ")}
|
113
|
-
EOT
|
54
|
+
desc "Build metadocument"
|
55
|
+
step_def :metadoc do
|
56
|
+
terms = input.collect{|l| l.split("\t").first}
|
57
|
+
associations = Open.to_hash(StringIO.new(input(:associations)), :flatten => true)
|
114
58
|
|
115
|
-
|
59
|
+
Progress.monitor("Building metadoc for #{job_name}")
|
60
|
+
Sent.metadoc(associations, terms)
|
116
61
|
end
|
117
62
|
|
118
|
-
|
119
|
-
|
63
|
+
desc "Selecting gene metadocs"
|
64
|
+
step_def :matrix, [] do |t|
|
65
|
+
$org ||= ENV['organism']
|
66
|
+
$genes ||= STDIN.read.split(/\n/)
|
67
|
+
$metadoc_dir ||= step_dir(:metadoc)
|
68
|
+
|
69
|
+
metadoc_file = File.join($metadoc_dir, $org)
|
70
|
+
|
71
|
+
Sent.matrix(metadoc_file, $genes)
|
120
72
|
end
|
121
73
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
74
|
+
desc "Performing NMF factorization"
|
75
|
+
step_def :NMF do |t|
|
76
|
+
$factors ||= ENV['factors']
|
77
|
+
Sent.NMF(input, t.name, $factors.to_i)
|
126
78
|
end
|
127
79
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
Rake::Task['clean'].invoke if $force
|
134
|
-
Rake::Task['all'].invoke
|
135
|
-
end
|
80
|
+
|
81
|
+
desc "Analyze results"
|
82
|
+
step_def :summary do
|
83
|
+
$factors ||= ENV['factors']
|
84
|
+
Sent.analyze(input_filename, output_filename, $factors)
|
136
85
|
end
|
137
86
|
|
138
87
|
|
88
|
+
task 'all' do
|
89
|
+
|
90
|
+
Progress.monitor("Processing organisms", :announcement => Proc.new{|org| "Organism #{ org }" }, :stack_depth => 0)
|
91
|
+
Organism.all.each do |org|
|
92
|
+
Rake::Task[File.join('metadoc',org)].invoke
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
139
96
|
|
97
|
+
task 'default' => 'all'
|
data/lib/sent/main.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'sent'
|
1
2
|
require 'rbbt/sources/pubmed'
|
2
3
|
require 'rbbt/util/misc'
|
3
4
|
require 'rbbt/util/open'
|
@@ -9,6 +10,7 @@ require 'stemmer'
|
|
9
10
|
require 'open4'
|
10
11
|
require 'progress-monitor'
|
11
12
|
require 'yaml'
|
13
|
+
require 'base64'
|
12
14
|
|
13
15
|
# Produce Stem lists, used by the Web Service
|
14
16
|
class String
|
@@ -41,6 +43,16 @@ class String
|
|
41
43
|
reset_stem_list
|
42
44
|
end
|
43
45
|
|
46
|
+
def try3times
|
47
|
+
try = 0
|
48
|
+
begin
|
49
|
+
yield
|
50
|
+
rescue
|
51
|
+
try += 1
|
52
|
+
retry if try <= 3
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
44
56
|
|
45
57
|
module Sent
|
46
58
|
|
@@ -55,7 +67,8 @@ module Sent
|
|
55
67
|
stdin.close
|
56
68
|
|
57
69
|
Process.wait pid
|
58
|
-
|
70
|
+
|
71
|
+
raise Sent::ProcessAbortedError, "Error in R process: #{stdout.read + stderr.read}" if $?.exitstatus != 0
|
59
72
|
result = stdout.read + stderr.read
|
60
73
|
stdout.close
|
61
74
|
stderr.close
|
@@ -64,71 +77,99 @@ module Sent
|
|
64
77
|
result
|
65
78
|
end
|
66
79
|
|
67
|
-
def self.
|
68
|
-
|
69
|
-
|
80
|
+
def self.mentions(org)
|
81
|
+
ner = Organism.ner(org, :rner)
|
82
|
+
norm = Organism.norm(org)
|
83
|
+
pmids = Organism.literature(org)
|
84
|
+
|
85
|
+
chunks = pmids.chunk(100)
|
86
|
+
|
87
|
+
pmids = {}
|
88
|
+
Progress.monitor("Finding gene-article associations in text", :step => 1000)
|
89
|
+
chunks.each{|chunk|
|
90
|
+
try3times do
|
91
|
+
PubMed.get_article(chunk).each{|pmid, article|
|
92
|
+
text = article.text
|
93
|
+
|
94
|
+
mentions = ner.extract(text)
|
95
|
+
|
96
|
+
Progress.monitor("Resolving mentions", :step => 1000)
|
97
|
+
codes = mentions.collect{|mention|
|
98
|
+
matches = norm.match(mention)
|
99
|
+
norm.select(matches,mention,text)
|
100
|
+
}.flatten.uniq.sort
|
101
|
+
|
102
|
+
codes.each{|code|
|
103
|
+
pmids[code] ||= []
|
104
|
+
pmids[code] << pmid
|
105
|
+
}
|
106
|
+
}
|
107
|
+
end
|
108
|
+
}
|
109
|
+
pmids
|
110
|
+
end
|
70
111
|
|
112
|
+
def self.dictionary(associations, options = {})
|
113
|
+
dict_options = {:low => 0.001, :hi => 0.65, :limit => 3000}.merge options
|
71
114
|
dict = Dictionary::TF_IDF.new
|
72
115
|
|
73
116
|
String.reset_stem_list
|
74
117
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
# At least 3 genes must have a word to be chosen
|
82
|
-
hard_min = 3 * 100 / associations.keys.length
|
83
|
-
hi = hard_min if hi < hard_min
|
84
|
-
|
85
|
-
d = dict.weights(:low => low, :hi => hi, :limit => max)
|
86
|
-
Open.write(output + '.dict', d.sort.collect{|p| p.join("\t")}.join("\n"))
|
87
|
-
terms = d.keys.sort
|
118
|
+
associations.each do |gene, pmids|
|
119
|
+
try3times do
|
120
|
+
text = PubMed.get_article(pmids).collect{|pmid, article| article.text }.join("\n")
|
121
|
+
dict.add(BagOfWords.count(text.bigrams))
|
122
|
+
end
|
123
|
+
end
|
88
124
|
|
89
|
-
|
90
|
-
|
125
|
+
term_weigths = dict.weights(dict_options)
|
126
|
+
terms = term_weigths.keys.sort
|
91
127
|
|
92
|
-
|
93
|
-
associations.each{|gene, pmids|
|
94
|
-
text = PubMed.get_article(pmids).collect{|p| p[1].text}.join("\n")
|
95
|
-
fout.puts(([gene] + BagOfWords.features(text, terms)).join("\t"))
|
96
|
-
}
|
97
|
-
fout.close
|
128
|
+
stems = String.stem_list(terms.collect{|p| p.split(/ /) }.flatten.uniq)
|
98
129
|
|
99
|
-
|
130
|
+
[term_weigths, stems]
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
def self.metadoc(associations, terms)
|
135
|
+
"%s\t%s\n" % ["Entity", terms.sort * "\t"] +
|
136
|
+
associations.collect do |gene, pmids|
|
137
|
+
try3times do
|
138
|
+
text = PubMed.get_article(pmids).collect{|pmid, article| article.text }.join("\n")
|
139
|
+
"%s\t%s" % [gene, BagOfWords.features(text, terms.sort).join("\t")]
|
140
|
+
end
|
141
|
+
end * "\n"
|
100
142
|
end
|
101
143
|
|
102
|
-
def self.matrix(
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
144
|
+
def self.matrix(metadoc_file, genes)
|
145
|
+
|
146
|
+
matrix = ""
|
147
|
+
File.open(metadoc_file) do |f|
|
148
|
+
matrix += f.gets
|
149
|
+
f.read.each_line do |line|
|
150
|
+
gene = line.match(/^(.*?)\t/)[1]
|
151
|
+
matrix += line if genes.include? gene
|
152
|
+
end
|
111
153
|
end
|
112
154
|
|
113
|
-
|
114
|
-
run_R("SENT.prepare.matrix('#{ output }', '#{ output }', '#{metadocs + '.dict'}')")
|
155
|
+
matrix
|
115
156
|
end
|
116
157
|
|
117
|
-
|
118
158
|
@@bionmf_wsdl = "http://bionmf.dacya.ucm.es/WebService/BioNMFWS.wsdl"
|
119
159
|
def self.NMF(matrix, out, k, executions = 10)
|
120
160
|
driver = SOAP::WSDLDriverFactory.new( @@bionmf_wsdl).create_rpc_driver
|
121
161
|
|
122
162
|
# Upload matrix
|
123
163
|
nmf_matrix = driver.upload_matrix(
|
124
|
-
|
125
|
-
false,
|
126
|
-
true,
|
127
|
-
true,
|
128
|
-
true,
|
129
|
-
"No",
|
130
|
-
"No",
|
164
|
+
matrix, # matrix
|
165
|
+
false, # binary
|
166
|
+
true, # column labels
|
167
|
+
true, # row labels
|
168
|
+
true, # transpose
|
169
|
+
"No", # positive
|
170
|
+
"No", # normalization
|
131
171
|
"matrix") # Suggested name
|
172
|
+
|
132
173
|
# Send several executions in parallel
|
133
174
|
while !driver.done(nmf_matrix)
|
134
175
|
sleep(5)
|
@@ -149,14 +190,14 @@ module Sent
|
|
149
190
|
job_id = driver.standardNMF(
|
150
191
|
nmf_matrix, # Matrix job
|
151
192
|
"Standard", # Algorithm
|
152
|
-
k,
|
153
|
-
k,
|
154
|
-
1,
|
155
|
-
2000,
|
156
|
-
40,
|
157
|
-
0,
|
158
|
-
false,
|
159
|
-
'')
|
193
|
+
k, # Factor Start
|
194
|
+
k, # Factor End
|
195
|
+
1, # Runs
|
196
|
+
2000, # Iterations
|
197
|
+
40, # Stop criteria
|
198
|
+
0, # Not used (nsnmf smoothness)
|
199
|
+
false, # extra info
|
200
|
+
'') # Suggested name
|
160
201
|
|
161
202
|
while !driver.done(job_id)
|
162
203
|
sleep(5)
|
@@ -168,12 +209,15 @@ module Sent
|
|
168
209
|
end
|
169
210
|
|
170
211
|
results = driver.results(job_id)
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
212
|
+
|
213
|
+
File.open(out + ".matrix_w.#{num}",'w') do |f|
|
214
|
+
f.write Base64.decode64 driver.result(results[0]) #.sub(/\t(.*)\t$/,'\1')
|
215
|
+
end
|
216
|
+
|
217
|
+
File.open(out + ".matrix_h.#{num}",'w') do |f|
|
218
|
+
f.write Base64.decode64 driver.result(results[1]) #.sub(/\t(.*)\t$/,'\1')
|
219
|
+
end
|
220
|
+
|
177
221
|
driver.clean(job_id)
|
178
222
|
rescue Sent::ProcessAbortedError
|
179
223
|
puts "Process aborted for #{ num }"
|
@@ -228,7 +272,7 @@ module Sent
|
|
228
272
|
if error
|
229
273
|
raise Exception, "Error in NMF:\n" + error
|
230
274
|
end
|
231
|
-
|
275
|
+
|
232
276
|
run_R("SENT.join.results('#{ out }')")
|
233
277
|
|
234
278
|
FileUtils.rm Dir.glob(out + '.matrix_*.*')
|
@@ -275,7 +319,7 @@ module Sent
|
|
275
319
|
def self.analyze(prefix, output, clusters = nil, num_words = 15)
|
276
320
|
|
277
321
|
FileUtils.rm Dir.glob(output + '*.words') + Dir.glob(output + '*.genes')
|
278
|
-
run_R("SENT.analyze('#{ prefix }', '#{ output }',
|
322
|
+
run_R("SENT.analyze('#{ prefix }', '#{ output }', #{clusters || 'NULL'}, #{num_words})")
|
279
323
|
words = Dir.glob(output + '*.words').sort.collect{|f| Open.read(f).split(/\n/)}
|
280
324
|
genes = Dir.glob(output + '*.genes').sort.collect{|f| Open.read(f).split(/\n/)}
|
281
325
|
|
@@ -284,7 +328,7 @@ module Sent
|
|
284
328
|
groups << {:words => p[0], :genes => p[1]}
|
285
329
|
}
|
286
330
|
|
287
|
-
|
331
|
+
groups
|
288
332
|
end
|
289
333
|
|
290
334
|
def self.literature_index(pmids, outfile)
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbbt-sent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 1.0.1
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Miguel Vazquez
|
@@ -9,79 +14,105 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-05-21 00:00:00 +02:00
|
13
18
|
default_executable: sent_config
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: rake
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
23
29
|
version: "0"
|
24
|
-
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
25
32
|
- !ruby/object:Gem::Dependency
|
26
33
|
name: simpleconsole
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
33
41
|
version: "0"
|
34
|
-
|
42
|
+
type: :runtime
|
43
|
+
version_requirements: *id002
|
35
44
|
- !ruby/object:Gem::Dependency
|
36
45
|
name: rbbt
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
prerelease: false
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
48
|
requirements:
|
41
49
|
- - ">="
|
42
50
|
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
43
53
|
version: "0"
|
44
|
-
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
45
56
|
- !ruby/object:Gem::Dependency
|
46
57
|
name: ferret
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
prerelease: false
|
59
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
60
|
requirements:
|
51
61
|
- - ">="
|
52
62
|
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
53
65
|
version: "0"
|
54
|
-
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id004
|
55
68
|
- !ruby/object:Gem::Dependency
|
56
69
|
name: stemmer
|
57
|
-
|
58
|
-
|
59
|
-
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
60
72
|
requirements:
|
61
73
|
- - ">="
|
62
74
|
- !ruby/object:Gem::Version
|
75
|
+
segments:
|
76
|
+
- 0
|
63
77
|
version: "0"
|
64
|
-
|
78
|
+
type: :runtime
|
79
|
+
version_requirements: *id005
|
65
80
|
- !ruby/object:Gem::Dependency
|
66
81
|
name: progress-monitor
|
67
|
-
|
68
|
-
|
69
|
-
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
prerelease: false
|
83
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
70
84
|
requirements:
|
71
85
|
- - ">="
|
72
86
|
- !ruby/object:Gem::Version
|
87
|
+
segments:
|
88
|
+
- 0
|
73
89
|
version: "0"
|
74
|
-
|
90
|
+
type: :runtime
|
91
|
+
version_requirements: *id006
|
75
92
|
- !ruby/object:Gem::Dependency
|
76
93
|
name: open4
|
94
|
+
prerelease: false
|
95
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
77
102
|
type: :runtime
|
78
|
-
|
79
|
-
|
103
|
+
version_requirements: *id007
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: simplews
|
106
|
+
prerelease: false
|
107
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
80
108
|
requirements:
|
81
109
|
- - ">="
|
82
110
|
- !ruby/object:Gem::Version
|
111
|
+
segments:
|
112
|
+
- 0
|
83
113
|
version: "0"
|
84
|
-
|
114
|
+
type: :runtime
|
115
|
+
version_requirements: *id008
|
85
116
|
description: Use literature mining to find semantic features to describe clusers of genes
|
86
117
|
email: miguel.vazquez@fdi.ucm.es
|
87
118
|
executables:
|
@@ -114,18 +145,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
145
|
requirements:
|
115
146
|
- - ">="
|
116
147
|
- !ruby/object:Gem::Version
|
148
|
+
segments:
|
149
|
+
- 0
|
117
150
|
version: "0"
|
118
|
-
version:
|
119
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
152
|
requirements:
|
121
153
|
- - ">="
|
122
154
|
- !ruby/object:Gem::Version
|
155
|
+
segments:
|
156
|
+
- 0
|
123
157
|
version: "0"
|
124
|
-
version:
|
125
158
|
requirements: []
|
126
159
|
|
127
160
|
rubyforge_project:
|
128
|
-
rubygems_version: 1.3.
|
161
|
+
rubygems_version: 1.3.6
|
129
162
|
signing_key:
|
130
163
|
specification_version: 3
|
131
164
|
summary: Semantic Features in Text
|