ajax-cat 0.3.0 → 0.4.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.
- data/Gemfile +2 -0
- data/Gemfile.lock +21 -0
- data/Rakefile +8 -2
- data/VERSION +1 -1
- data/ajax-cat.gemspec +22 -3
- data/bin/ajax-cat +20 -5
- data/lib/ajax-cat.rb +95 -8
- data/lib/ajax-cat/ajax_cat_server.rb +74 -6
- data/lib/ajax-cat/log.rb +6 -0
- data/lib/ajax-cat/moses_pair.rb +3 -4
- data/lib/ajax-cat/pairs.rb +56 -0
- data/lib/ajax-cat/public/AjaxCatList.coffee +62 -11
- data/lib/ajax-cat/public/AjaxCatTranslation.coffee +55 -7
- data/lib/ajax-cat/public/Suggestions.coffee +1 -1
- data/lib/ajax-cat/public/TranslationTable.coffee +7 -6
- data/lib/ajax-cat/public/ajax-cat.js +166 -29
- data/lib/ajax-cat/public/index.html +29 -2
- data/lib/ajax-cat/public/translation.html +6 -0
- data/lib/ajax-cat/request/raw.rb +8 -1
- data/lib/ajax-cat/request/suggestion.rb +40 -0
- data/lib/ajax-cat/request/table.rb +94 -0
- data/lib/ajax-cat/task.rb +6 -0
- data/lib/ajax-cat/views/admin.erb +83 -0
- data/lib/ajax-cat/views/experiment.erb +62 -0
- data/logs.db +0 -0
- data/test/fixtures/ajax-cat.ini.json +14 -0
- data/test/fixtures/moses.ini +6 -2
- data/test/fixtures/nbest.txt +19 -0
- data/test/helper.rb +2 -52
- data/test/integration/test_start_and_stop.rb +31 -3
- data/test/unit/test_moses_pair.rb +1 -4
- data/test/unit/test_pairs.rb +43 -0
- data/test/unit/test_suggestion_request.rb +32 -0
- data/test/unit/test_table_request.rb +61 -0
- metadata +56 -21
@@ -1,4 +1,3 @@
|
|
1
|
-
2
|
2
1
|
<!DOCTYPE html>
|
3
2
|
<html>
|
4
3
|
|
@@ -29,7 +28,14 @@
|
|
29
28
|
<ul class="nav">
|
30
29
|
|
31
30
|
</ul>
|
32
|
-
<p class="pull-right"
|
31
|
+
<p class="pull-right">
|
32
|
+
<button class="btn btn-info" id="new-experiment-translation">
|
33
|
+
New experiment translation
|
34
|
+
</button>
|
35
|
+
<button class="btn btn-success" id="new-translation">
|
36
|
+
New translation
|
37
|
+
</button>
|
38
|
+
</p>
|
33
39
|
</div><!--/.nav-collapse -->
|
34
40
|
</div>
|
35
41
|
</div>
|
@@ -144,6 +150,27 @@ Gibb last performed on stage at the London Palladium in February, supporting inj
|
|
144
150
|
</div>
|
145
151
|
|
146
152
|
|
153
|
+
<div class="modal" id="new-experiment-modal">
|
154
|
+
<div class="modal-header">
|
155
|
+
<a class="close" data-dismiss="modal">×</a>
|
156
|
+
<h3>Start New Experiment</h3>
|
157
|
+
</div>
|
158
|
+
<div class="modal-body">
|
159
|
+
<p>
|
160
|
+
<label>Email</label>
|
161
|
+
<input id="new-experiment-email" placeholder="your email">
|
162
|
+
<label>Language pair</label>
|
163
|
+
<select id="new-experiment-pair">
|
164
|
+
<option value="en-cs">en-cs</option>
|
165
|
+
</select>
|
166
|
+
</p>
|
167
|
+
|
168
|
+
</div>
|
169
|
+
<div class="modal-footer">
|
170
|
+
<a href="#" class="btn btn-primary" id="create-new-experiment">Start experiment</a>
|
171
|
+
</div>
|
172
|
+
</div>
|
173
|
+
|
147
174
|
|
148
175
|
|
149
176
|
</body>
|
@@ -30,6 +30,9 @@
|
|
30
30
|
<li><a href="#about" id="preview">Preview</a></li>
|
31
31
|
</ul>
|
32
32
|
<p class="pull-right">
|
33
|
+
<button class="btn btn-info" id="send-experiment">
|
34
|
+
Send experiment results
|
35
|
+
</button>
|
33
36
|
<button class="btn btn-info" id="save">
|
34
37
|
Save into browser
|
35
38
|
</button>
|
@@ -44,6 +47,7 @@
|
|
44
47
|
<div class="container-fluid">
|
45
48
|
<div class="row-fluid">
|
46
49
|
<h1>Translations</h1>
|
50
|
+
<span id="time"></span>
|
47
51
|
|
48
52
|
<table class=" table-bordered table-condensed" id="translation">
|
49
53
|
<tr>
|
@@ -66,6 +70,8 @@
|
|
66
70
|
|
67
71
|
</div><!--/row-->
|
68
72
|
|
73
|
+
<div id="log"></div>
|
74
|
+
|
69
75
|
<hr>
|
70
76
|
|
71
77
|
<footer>
|
data/lib/ajax-cat/request/raw.rb
CHANGED
@@ -13,7 +13,10 @@ module AjaxCat
|
|
13
13
|
@lines = []
|
14
14
|
@lock = Mutex.new
|
15
15
|
@processed = false
|
16
|
-
|
16
|
+
end
|
17
|
+
|
18
|
+
def prepare_moses_request
|
19
|
+
@sentence
|
17
20
|
end
|
18
21
|
|
19
22
|
def result
|
@@ -28,6 +31,10 @@ module AjaxCat
|
|
28
31
|
Integer(line.split(" ||| ").first)
|
29
32
|
end
|
30
33
|
|
34
|
+
def tokenize(str)
|
35
|
+
str.strip.split(/[\t\n ]+/)
|
36
|
+
end
|
37
|
+
|
31
38
|
end
|
32
39
|
|
33
40
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module AjaxCat
|
2
|
+
|
3
|
+
module Request
|
4
|
+
|
5
|
+
class Suggestion < Raw
|
6
|
+
|
7
|
+
@@rows = 5
|
8
|
+
@@suggestion_length = 3
|
9
|
+
|
10
|
+
def initialize(sentence, covered, translated)
|
11
|
+
super(sentence)
|
12
|
+
@covered = covered
|
13
|
+
@translated = translated
|
14
|
+
@translated_length = tokenize(translated).length
|
15
|
+
@suggestions = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def prepare_moses_request
|
19
|
+
"#{@translated} ||| #{@covered} ||| #{@sentence}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def result
|
23
|
+
{
|
24
|
+
"suggestions" => @suggestions
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def process_line(line)
|
29
|
+
words = line.split(" ||| ")[1].strip.split(" ")
|
30
|
+
if @suggestions.length < @@rows
|
31
|
+
suggestion = words[@translated_length, @@suggestion_length].join(" ")
|
32
|
+
@suggestions.push(suggestion) unless @suggestions.member?(suggestion)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module AjaxCat
|
2
|
+
|
3
|
+
module Request
|
4
|
+
|
5
|
+
class Table < Raw
|
6
|
+
|
7
|
+
@@rows = 5
|
8
|
+
|
9
|
+
def initialize(sentence)
|
10
|
+
super(sentence)
|
11
|
+
@ret = {}
|
12
|
+
@ret["source"] = @sentence.strip.split(" ")
|
13
|
+
@buckets = []
|
14
|
+
@ret["source"].size.times {@buckets.push([])}
|
15
|
+
end
|
16
|
+
|
17
|
+
def result
|
18
|
+
@ret["table"] = []
|
19
|
+
@@rows.times do |row_number|
|
20
|
+
i = 0
|
21
|
+
free_space = 0
|
22
|
+
row = []
|
23
|
+
while i < @buckets.size
|
24
|
+
el = @buckets[i].shift
|
25
|
+
if el
|
26
|
+
if free_space > 0
|
27
|
+
row.push({"w" => free_space})
|
28
|
+
end
|
29
|
+
this_space = el.to - el.from + 1
|
30
|
+
row.push({
|
31
|
+
"str" => el.words,
|
32
|
+
"w" => this_space
|
33
|
+
})
|
34
|
+
free_space = 0
|
35
|
+
i += this_space
|
36
|
+
else
|
37
|
+
free_space += 1
|
38
|
+
i += 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@ret["table"].push(row) if row.size > 0
|
42
|
+
end
|
43
|
+
return @ret
|
44
|
+
end
|
45
|
+
|
46
|
+
def process_line(line)
|
47
|
+
splited = line.split(" ||| ")
|
48
|
+
words = splited[1].strip.split(" ")
|
49
|
+
alignment = splited[4].strip.split(" ")
|
50
|
+
alignment.each do |al|
|
51
|
+
phrase = Phrase.new(words, al)
|
52
|
+
finded = @buckets[phrase.from].find do |el|
|
53
|
+
el.words == phrase.words and el.to == phrase.to
|
54
|
+
end
|
55
|
+
@buckets[phrase.from].push(phrase) if finded == nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
class Phrase
|
62
|
+
|
63
|
+
attr_reader :from, :to, :words
|
64
|
+
|
65
|
+
def initialize(words_list, alignment)
|
66
|
+
alignment = alignment.split("=")
|
67
|
+
source_alignment = parse(alignment[0])
|
68
|
+
target_alignment = parse(alignment[1])
|
69
|
+
@from = source_alignment[:from]
|
70
|
+
@to = source_alignment[:to]
|
71
|
+
@words = ""
|
72
|
+
target_alignment[:from].upto(target_alignment[:to]) do |position|
|
73
|
+
@words += " #{words_list[position]}"
|
74
|
+
end
|
75
|
+
@words.strip!
|
76
|
+
end
|
77
|
+
|
78
|
+
def parse(alignment)
|
79
|
+
if alignment.include?("-")
|
80
|
+
alignment = alignment.split("-")
|
81
|
+
from = alignment[0].to_i
|
82
|
+
to = alignment[1].to_i
|
83
|
+
else
|
84
|
+
from = alignment.to_i
|
85
|
+
to = from
|
86
|
+
end
|
87
|
+
return {from: from, to: to}
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
|
6
|
+
<link rel="stylesheet" type="text/css" href="/bootstrap.css" />
|
7
|
+
<link rel="stylesheet" type="text/css" href="/style.css" />
|
8
|
+
<script src="/jquery.js"></script>
|
9
|
+
<script src="/bootstrap.js"></script>
|
10
|
+
<script src="/ajax-cat.js"></script>
|
11
|
+
|
12
|
+
|
13
|
+
<title>AJAX-CAT | admin</title>
|
14
|
+
</head>
|
15
|
+
<body>
|
16
|
+
<div class="navbar navbar-fixed-top">
|
17
|
+
<div class="navbar-inner">
|
18
|
+
<div class="container-fluid">
|
19
|
+
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
20
|
+
<span class="icon-bar"></span>
|
21
|
+
<span class="icon-bar"></span>
|
22
|
+
<span class="icon-bar"></span>
|
23
|
+
</a>
|
24
|
+
<a class="brand" href="#">AJAX-CAT | admin</a>
|
25
|
+
<div class="nav-collapse">
|
26
|
+
<ul class="nav">
|
27
|
+
|
28
|
+
</ul>
|
29
|
+
</div><!--/.nav-collapse -->
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<br><br><br>
|
35
|
+
|
36
|
+
<div class="container-fluid">
|
37
|
+
<div class="row-fluid">
|
38
|
+
<h1>Experiments</h1>
|
39
|
+
|
40
|
+
<table class="table table-bordered table-striped table-condensed" id="translation-list">
|
41
|
+
<tr><th>#</th><th>Pair</th><th>Sentence</th><th></th><th></th></tr>
|
42
|
+
<% Task.all.each do |task| %>
|
43
|
+
<tr>
|
44
|
+
<td><%= task.id %></td>
|
45
|
+
<td><%= task.pair %></td>
|
46
|
+
<td><%= task.sentence %></td>
|
47
|
+
<td><a href="/experiment/<%= task.id %>">detail</a></td>
|
48
|
+
<td><form class="form-inline" method="post" action="/admin/remove_task?id=<%= task.id %>">
|
49
|
+
<input type="submit" class="btn btn-danger" value="Delete">
|
50
|
+
</form>
|
51
|
+
</td>
|
52
|
+
</tr>
|
53
|
+
<% end %>
|
54
|
+
</table>
|
55
|
+
|
56
|
+
|
57
|
+
<form class="well form-inline" method="post" action="/admin/add_task">
|
58
|
+
<select id="new-translation-pair" name="pair">
|
59
|
+
<% @pairs.each do |pair| %>
|
60
|
+
<option values="<%= pair %>"><%= pair %></option>
|
61
|
+
<% end %>
|
62
|
+
</select>
|
63
|
+
<input type="text" name="sentence" class="input-small" placeholder="New experiment task sentence" style="width: 600px;">
|
64
|
+
<button type="submit" class="btn btn-success">Create experiment task</button>
|
65
|
+
</form>
|
66
|
+
|
67
|
+
</div><!--/row-->
|
68
|
+
|
69
|
+
<hr>
|
70
|
+
|
71
|
+
<footer>
|
72
|
+
<p>Created by Ondřej Odcházel & Ondřej Bojar - <a href="http://ufal.mff.cuni.cz/">Institute of Formal and Applied Linguistics</a>,
|
73
|
+
Charles University in Prague<br>
|
74
|
+
Supported by the grant:
|
75
|
+
FP7-ICT-2007-3-231720 (EuroMatrix Plus)</p>
|
76
|
+
</footer>
|
77
|
+
|
78
|
+
</div>
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
</body>
|
83
|
+
</html>
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
|
6
|
+
<link rel="stylesheet" type="text/css" href="/bootstrap.css" />
|
7
|
+
<link rel="stylesheet" type="text/css" href="/style.css" />
|
8
|
+
<script src="/jquery.js"></script>
|
9
|
+
<script src="/bootstrap.js"></script>
|
10
|
+
<script src="/ajax-cat.js"></script>
|
11
|
+
|
12
|
+
|
13
|
+
<title>AJAX-CAT | experiment</title>
|
14
|
+
</head>
|
15
|
+
<body>
|
16
|
+
<div class="navbar navbar-fixed-top">
|
17
|
+
<div class="navbar-inner">
|
18
|
+
<div class="container-fluid">
|
19
|
+
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
20
|
+
<span class="icon-bar"></span>
|
21
|
+
<span class="icon-bar"></span>
|
22
|
+
<span class="icon-bar"></span>
|
23
|
+
</a>
|
24
|
+
<a class="brand" href="#">AJAX-CAT | experiment</a>
|
25
|
+
<div class="nav-collapse">
|
26
|
+
<ul class="nav">
|
27
|
+
|
28
|
+
</ul>
|
29
|
+
</div><!--/.nav-collapse -->
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<br><br><br>
|
35
|
+
|
36
|
+
<div class="container-fluid">
|
37
|
+
<div class="row-fluid">
|
38
|
+
<h1><%= @task.sentence %> <small><%= @task.pair %></small></h1>
|
39
|
+
|
40
|
+
<table class="table table-bordered table-striped table-condensed">
|
41
|
+
<% @task.logs.each do |log| %>
|
42
|
+
<tr><td><%= log.id %></td><td><%= log.time %></td><td><%= log.email %></td></tr>
|
43
|
+
<tr><td colspan="3"><%= log.log %></td></tr>
|
44
|
+
<% end %>
|
45
|
+
</table>
|
46
|
+
</div><!--/row-->
|
47
|
+
|
48
|
+
<hr>
|
49
|
+
|
50
|
+
<footer>
|
51
|
+
<p>Created by Ondřej Odcházel & Ondřej Bojar - <a href="http://ufal.mff.cuni.cz/">Institute of Formal and Applied Linguistics</a>,
|
52
|
+
Charles University in Prague<br>
|
53
|
+
Supported by the grant:
|
54
|
+
FP7-ICT-2007-3-231720 (EuroMatrix Plus)</p>
|
55
|
+
</footer>
|
56
|
+
|
57
|
+
</div>
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
</body>
|
62
|
+
</html>
|
data/logs.db
ADDED
Binary file
|
data/test/fixtures/moses.ini
CHANGED
@@ -12,11 +12,11 @@ T 0
|
|
12
12
|
|
13
13
|
# translation tables: source-factors, target-factors, number of scores, file
|
14
14
|
[ttable-file]
|
15
|
-
0 0 0 1 /Users/ondrejodchazel/projects/ajax-cat/ajax-cat-new/test/fixtures/phrase-table
|
15
|
+
0 0 0 1 /Users/ondrejodchazel/projects/ajax-cat/ajax-cat-new/lib/../test/fixtures/phrase-table
|
16
16
|
|
17
17
|
# language models: type(srilm/irstlm/kenlm), factors, order, file
|
18
18
|
[lmodel-file]
|
19
|
-
8 0 3 /Users/ondrejodchazel/projects/ajax-cat/ajax-cat-new/test/fixtures/europarl.srilm.gz
|
19
|
+
8 0 3 /Users/ondrejodchazel/projects/ajax-cat/ajax-cat-new/lib/../test/fixtures/europarl.srilm.gz
|
20
20
|
|
21
21
|
# limit on how many phrase translations e for each phrase f are loaded
|
22
22
|
[ttable-limit]
|
@@ -38,5 +38,9 @@ T 0
|
|
38
38
|
[weight-w]
|
39
39
|
0
|
40
40
|
|
41
|
+
[n-best-list]
|
42
|
+
nbest.txt
|
43
|
+
100
|
44
|
+
|
41
45
|
|
42
46
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
0 ||| this is ||| d: 0 lm: -14.9312 w: -2 tm: -0.223144 ||| -15.1543
|
2
|
+
0 ||| it is ||| d: 0 lm: -14.205 w: -2 tm: -1.60944 ||| -15.8144
|
3
|
+
0 ||| it is ||| d: 0 lm: -14.205 w: -2 tm: -2.30259 ||| -16.5075
|
4
|
+
0 ||| this is ||| d: 0 lm: -14.9312 w: -2 tm: -2.30259 ||| -17.2337
|
5
|
+
0 ||| the is ||| d: 0 lm: -19.4273 w: -2 tm: -0.916291 ||| -20.3436
|
6
|
+
0 ||| it 's ||| d: 0 lm: -18.1748 w: -2 tm: -2.30259 ||| -20.4773
|
7
|
+
0 ||| the 's ||| d: 0 lm: -19.7502 w: -2 tm: -0.916291 ||| -20.6664
|
8
|
+
0 ||| is the ||| d: -3 lm: -17.4521 w: -2 tm: -0.916291 ||| -21.3684
|
9
|
+
0 ||| is it ||| d: -3 lm: -16.1942 w: -2 tm: -2.30259 ||| -21.4968
|
10
|
+
0 ||| is this ||| d: -3 lm: -16.681 w: -2 tm: -2.30259 ||| -21.9836
|
11
|
+
0 ||| this 's ||| d: 0 lm: -20.5331 w: -2 tm: -2.30259 ||| -22.8357
|
12
|
+
1 ||| tamto is a ||| d: 0 lm: -20.0002 w: -2 tm: 0 ||| -20.0002
|
13
|
+
1 ||| tamto is an ||| d: 0 lm: -22.2533 w: -2 tm: 0 ||| -22.2533
|
14
|
+
1 ||| tamto a is ||| d: -3 lm: -21.003 w: -2 tm: 0 ||| -24.003
|
15
|
+
1 ||| tamto a 's ||| d: -3 lm: -21.3488 w: -2 tm: 0 ||| -24.3488
|
16
|
+
1 ||| tamto 's a ||| d: 0 lm: -25.0755 w: -2 tm: 0 ||| -25.0755
|
17
|
+
1 ||| tamto an is ||| d: -3 lm: -22.2279 w: -2 tm: 0 ||| -25.2279
|
18
|
+
1 ||| tamto an 's ||| d: -3 lm: -22.5508 w: -2 tm: 0 ||| -25.5508
|
19
|
+
1 ||| tamto 's an ||| d: 0 lm: -25.8532 w: -2 tm: 0 ||| -25.8532
|