aac-metrics 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/aac-metrics/loader.rb +16 -0
- data/lib/aac-metrics/metrics.rb +72 -11
- data/lib/aac-metrics.rb +1 -1
- data/sets/common_words.en.json +1 -1
- data/sets/fringe.en.json +4158 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a2c7146372a916bfc65d6d4d50dda6b2a7a27aaf16fc59f3786e7dc38d87f49
|
4
|
+
data.tar.gz: ea1f5629b498e2f79e4bd9cd5d5d03085f4088da10f351fc1f52187b05744cda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 178c2851f81ecb92e0d97a77a9553ecabcc97baca6fc4d717e8ea2b081e7318cbeb5552a876af896618d979dd7ff4277b2a24c5e32cd6359345f8a760b36eee3
|
7
|
+
data.tar.gz: 63d7a6cf112e6fc53f7630cf478a37d57374d4b52c934d2c215614b307555486bb34de34316b7255daa2884d51e887c0f380abfdeb85218035d5c4c34df2d68a
|
data/lib/aac-metrics/loader.rb
CHANGED
@@ -357,6 +357,22 @@ module AACMetrics::Loader
|
|
357
357
|
@@sentences[locale] = res
|
358
358
|
end
|
359
359
|
|
360
|
+
def self.fringe_words(locale)
|
361
|
+
@@fringe_words ||= {}
|
362
|
+
return @@fringe_words[locale] if @@fringe_words[locale]
|
363
|
+
locale = locale.split(/-|_/)[0]
|
364
|
+
path = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'sets', "fringe.#{locale}.json"))
|
365
|
+
all_words = []
|
366
|
+
list = JSON.parse(File.read(path))
|
367
|
+
list.each do |set|
|
368
|
+
set['categories'].each do |cat|
|
369
|
+
all_words += cat['words']
|
370
|
+
end
|
371
|
+
end
|
372
|
+
all_words.uniq!
|
373
|
+
@@synonyms[locale] = all_words
|
374
|
+
end
|
375
|
+
|
360
376
|
def self.base_words(locale)
|
361
377
|
@@base_words ||= {}
|
362
378
|
return @@base_words[locale] if @@base_words[locale]
|
data/lib/aac-metrics/metrics.rb
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
# Scores for average effort level for word sets (spelling if that's th only way)
|
3
3
|
# Effort scores for sentence corpus
|
4
4
|
# Effort algorithms for scanning/eyes
|
5
|
+
# TODO: manual way to flag button as conceptually
|
6
|
+
# related to the same-locaed button on the
|
7
|
+
# prior board, allowing for a discounted penalty
|
5
8
|
module AACMetrics::Metrics
|
6
9
|
# TODO:
|
7
10
|
# 1. When navigating from one board to the next, grid locations
|
@@ -21,11 +24,12 @@ module AACMetrics::Metrics
|
|
21
24
|
locale = nil
|
22
25
|
buttons = []
|
23
26
|
refs = {}
|
24
|
-
|
27
|
+
grid = {}
|
25
28
|
|
26
29
|
if obfset.is_a?(Hash) && obfset['buttons']
|
27
30
|
locale = obfset['locale'] || 'en'
|
28
31
|
refs = obfset['reference_counts']
|
32
|
+
grid = obfset['grid']
|
29
33
|
buttons = []
|
30
34
|
obfset['buttons'].each do |btn|
|
31
35
|
buttons << {
|
@@ -42,7 +46,15 @@ module AACMetrics::Metrics
|
|
42
46
|
visited_board_ids = {}
|
43
47
|
to_visit = [{board: obfset[0], level: 0, entry_x: 1.0, entry_y: 1.0}]
|
44
48
|
refs = {}
|
49
|
+
rows_tally = 0.0
|
50
|
+
cols_tally = 0.0
|
51
|
+
root_rows = nil
|
52
|
+
root_cols = nil
|
45
53
|
obfset.each do |board|
|
54
|
+
root_rows ||= board['grid']['rows']
|
55
|
+
root_cols ||= board['grid']['columns']
|
56
|
+
rows_tally += board['grid']['rows']
|
57
|
+
cols_tally += board['grid']['columns']
|
46
58
|
# determine frequency within the board set
|
47
59
|
# for each semantic_id and clone_id
|
48
60
|
if board['clone_ids']
|
@@ -58,6 +70,10 @@ module AACMetrics::Metrics
|
|
58
70
|
end
|
59
71
|
end
|
60
72
|
end
|
73
|
+
if (rows_tally / obfset.length.to_f - root_rows).abs > 3 || (cols_tally / obfset.length.to_f - root_cols).abs > 3
|
74
|
+
root_rows = (rows_tally / obfset.length.to_f).floor
|
75
|
+
root_cols = (cols_tally / obfset.length.to_f).floor
|
76
|
+
end
|
61
77
|
pcts = {}
|
62
78
|
refs.each do |id, cnt|
|
63
79
|
pcts[id] = cnt.to_f / obfset.length.to_f
|
@@ -191,6 +207,10 @@ module AACMetrics::Metrics
|
|
191
207
|
total_boards: total_boards,
|
192
208
|
total_buttons: buttons.length,
|
193
209
|
reference_counts: refs,
|
210
|
+
grid: {
|
211
|
+
rows: root_rows,
|
212
|
+
columns: root_cols
|
213
|
+
},
|
194
214
|
buttons: buttons,
|
195
215
|
levels: clusters
|
196
216
|
}
|
@@ -236,14 +256,17 @@ module AACMetrics::Metrics
|
|
236
256
|
compare_words = []
|
237
257
|
compare_buttons = {}
|
238
258
|
comp_efforts = {}
|
259
|
+
comp_levels = {}
|
239
260
|
compare[:buttons].each do |btn|
|
240
261
|
compare_words << btn[:label]
|
241
262
|
compare_buttons[btn[:label]] = btn
|
242
263
|
comp_efforts[btn[:label]] = btn[:effort]
|
264
|
+
comp_levels[btn[:label]] = btn[:level]
|
243
265
|
end
|
244
266
|
|
245
267
|
sortable_efforts = {}
|
246
268
|
target_efforts = {}
|
269
|
+
target_levels = {}
|
247
270
|
target_words = []
|
248
271
|
# Track effort scores for each button in the set,
|
249
272
|
# used to sort and for assessing priority
|
@@ -252,6 +275,7 @@ module AACMetrics::Metrics
|
|
252
275
|
res[:buttons].each{|b|
|
253
276
|
target_words << b[:label]
|
254
277
|
target_efforts[b[:label]] = b[:effort]
|
278
|
+
target_levels[b[:label]] = b[:level]
|
255
279
|
sortable_efforts[b[:label]] = b[:effort]
|
256
280
|
comp = compare_buttons[b[:label]]
|
257
281
|
if comp
|
@@ -274,6 +298,7 @@ module AACMetrics::Metrics
|
|
274
298
|
common_words_obj = AACMetrics::Loader.common_words(target[:locale])
|
275
299
|
synonyms = AACMetrics::Loader.synonyms(target[:locale])
|
276
300
|
sentences = AACMetrics::Loader.sentences(target[:locale])
|
301
|
+
fringe = AACMetrics::Loader.fringe_words(target[:locale])
|
277
302
|
common_words_obj['efforts'].each{|w, e| sortable_efforts[w] ||= e }
|
278
303
|
common_words = common_words_obj['words']
|
279
304
|
|
@@ -393,7 +418,6 @@ module AACMetrics::Metrics
|
|
393
418
|
res[:cores][list['id']] = {name: list['name'], list: list['words'], average_effort: list_effort, comp_effort: comp_effort}
|
394
419
|
end
|
395
420
|
target_effort_tally = (target_effort_tally / core_lists.to_a.length) * 5.0
|
396
|
-
|
397
421
|
comp_effort_tally = (comp_effort_tally / core_lists.to_a.length) * 5.0
|
398
422
|
|
399
423
|
# TODO: Assemble or allow a battery of word combinations,
|
@@ -401,29 +425,42 @@ module AACMetrics::Metrics
|
|
401
425
|
# as well as an average level of effort across combinations.
|
402
426
|
res[:sentences] = []
|
403
427
|
sentences.each do |words|
|
404
|
-
puts " #{words.join(' ')}"
|
405
|
-
BOARD_CHANGE_PROCESSING_EFFORT
|
406
428
|
target_effort_score = 0.0
|
407
429
|
comp_effort_score = 0.0
|
408
430
|
words.each_with_index do |word, idx|
|
409
431
|
synonym_words = [word] + (synonyms[word] || [])
|
410
432
|
effort = target_efforts[word] || target_efforts[word.downcase]
|
433
|
+
level = target_levels[word] || target_levels[word.downcase]
|
411
434
|
if !effort
|
412
|
-
synonym_words.each
|
435
|
+
synonym_words.each do |w|
|
436
|
+
if !effort && target_efforts[w]
|
437
|
+
effort = target_efforts[w]
|
438
|
+
level = target_levels[w]
|
439
|
+
end
|
440
|
+
end
|
413
441
|
end
|
414
442
|
effort ||= spelling_effort(word)
|
415
|
-
|
443
|
+
if level && level > 0 && idx > 0
|
444
|
+
effort += BOARD_CHANGE_PROCESSING_EFFORT
|
445
|
+
end
|
416
446
|
ee = effort
|
417
447
|
target_effort_score += effort
|
418
448
|
|
419
449
|
effort = comp_efforts[word] || comp_efforts[word.downcase]
|
450
|
+
level = comp_levels[word] || comp_levels[word.downcase]
|
420
451
|
if !effort
|
421
|
-
synonym_words.each
|
452
|
+
synonym_words.each do |w|
|
453
|
+
if !effort && comp_efforts[w]
|
454
|
+
effort = comp_efforts[w]
|
455
|
+
level = comp_levels[w]
|
456
|
+
end
|
457
|
+
end
|
422
458
|
end
|
423
459
|
effort ||= spelling_effort(word)
|
424
|
-
|
460
|
+
if level && level > 0 && idx > 0
|
461
|
+
effort += BOARD_CHANGE_PROCESSING_EFFORT
|
462
|
+
end
|
425
463
|
comp_effort_score += effort
|
426
|
-
puts " #{word} #{ee} #{effort}"
|
427
464
|
end
|
428
465
|
target_effort_score = target_effort_score / words.length
|
429
466
|
comp_effort_score = comp_effort_score / words.length
|
@@ -431,8 +468,32 @@ module AACMetrics::Metrics
|
|
431
468
|
end
|
432
469
|
target_effort_tally += res[:sentences].map{|s| s[:effort] }.sum.to_f / res[:sentences].length.to_f * 3.0
|
433
470
|
comp_effort_tally += res[:sentences].map{|s| s[:comp_effort] }.sum.to_f / res[:sentences].length.to_f * 3.0
|
434
|
-
|
435
|
-
|
471
|
+
|
472
|
+
res[:fringe_words] = []
|
473
|
+
fringe.each do |word|
|
474
|
+
target_effort_score = 0.0
|
475
|
+
comp_effort_score = 0.0
|
476
|
+
synonym_words = [word] + (synonyms[word] || [])
|
477
|
+
effort = target_efforts[word] || target_efforts[word.downcase]
|
478
|
+
if !effort
|
479
|
+
synonym_words.each{|w| effort ||= target_efforts[w] }
|
480
|
+
end
|
481
|
+
effort ||= spelling_effort(word)
|
482
|
+
target_effort_score += effort
|
483
|
+
|
484
|
+
effort = comp_efforts[word] || comp_efforts[word.downcase]
|
485
|
+
if !effort
|
486
|
+
synonym_words.each{|w| effort ||= comp_efforts[w] }
|
487
|
+
end
|
488
|
+
effort ||= spelling_effort(word)
|
489
|
+
comp_effort_score += effort
|
490
|
+
res[:fringe_words] << {word: word, effort: target_effort_score, comp_effort: comp_effort_score}
|
491
|
+
end
|
492
|
+
target_effort_tally += res[:fringe_words].map{|s| s[:effort] }.sum.to_f / res[:fringe_words].length.to_f * 2.0
|
493
|
+
comp_effort_tally += res[:fringe_words].map{|s| s[:comp_effort] }.sum.to_f / res[:fringe_words].length.to_f * 2.0
|
494
|
+
|
495
|
+
target_effort_tally += 80 # placeholder value for future added calculations
|
496
|
+
comp_effort_tally += 80
|
436
497
|
|
437
498
|
|
438
499
|
|
data/lib/aac-metrics.rb
CHANGED
data/sets/common_words.en.json
CHANGED