summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2014-02-11 16:43:29 +0000
committerhallgren <hallgren@chalmers.se>2014-02-11 16:43:29 +0000
commit44ee072331424dae6a7918835bd15c51f56307e8 (patch)
tree3f71d0855d9cc26a7ab706e9adbfc7c9a10d887f
parent23dc22cea49b7dde812882cff8e77b27e1b6382f (diff)
Work on web api & apps based on the C run-time system
+ PGFService.hs: add command c-grammar, include probability in parse results + js/gftranslation.js: add start position and limit parameters, return more info to applications + Simple Translator: show two wide coverage translations + Wide coverage demo: show parse tree and probability (intended as grammar debugging aids)
-rw-r--r--src/server/PGFService.hs20
-rw-r--r--src/www/js/gftranslate.js32
-rw-r--r--src/www/translator/translator.js22
-rw-r--r--src/www/wc.html14
4 files changed, 59 insertions, 29 deletions
diff --git a/src/server/PGFService.hs b/src/server/PGFService.hs
index f4028b6d0..e6bcbdaba 100644
--- a/src/server/PGFService.hs
+++ b/src/server/PGFService.hs
@@ -89,21 +89,30 @@ cpgfMain command (pgf,pc) =
"c-linearize" -> out =<< lin # tree % to
"c-translate" -> out =<< join (trans # input % from % to % start % limit % trie)
"c-flush" -> out =<< flush
+ "c-grammar" -> out grammar
_ -> badRequest "Unknown command" command
where
flush = liftIO $ do modifyMVar_ pc $ const $ return Map.empty
performGC
return $ showJSON ()
+ grammar = showJSON $ makeObj
+ ["name".=C.abstractName pgf,
+ "startcat".=C.startCat pgf,
+ "languages".=languages]
+ where
+ languages = [makeObj ["name".= l] | (l,_)<-Map.toList (C.languages pgf)]
+
parse input (from,concr) start mlimit trie =
do trees <- parse' input (from,concr) start mlimit
- return $ showJSON [makeObj ("from".=from:"trees".=trees :[])]
+ return $ showJSON [makeObj ("from".=from:"trees".=map tp trees :[])]
-- :addTrie trie trees
- where
+
+ tp (tree,prob) = makeObj ["tree".=tree,"prob".=prob]
parse' input (from,concr) start mlimit =
liftIO $ do t <- getCurrentTime
- (map fst . maybe id take mlimit . drop start)
+ (maybe id take mlimit . drop start)
# modifyMVar pc (parse'' t)
where
key = (from,input)
@@ -120,13 +129,14 @@ cpgfMain command (pgf,pc) =
lin' tree tos = [makeObj ["to".=to,"text".=C.linearize c tree]|(to,c)<-tos]
trans input (from,concr) tos start mlimit trie =
- do trees <- parse' input (from,concr) start mlimit
+ do parses <- parse' input (from,concr) start mlimit
return $
showJSON [ makeObj ["from".=from,
"translations".=
[makeObj ["tree".=tree,
+ "prob".=prob,
"linearizations".=lin' tree tos]
- | tree <- trees]]]
+ | (tree,prob) <- parses]]]
from = maybe (missing "from") return =<< getLang "from"
diff --git a/src/www/js/gftranslate.js b/src/www/js/gftranslate.js
index 0043fce61..cf85a28e3 100644
--- a/src/www/js/gftranslate.js
+++ b/src/www/js/gftranslate.js
@@ -5,30 +5,36 @@ var gftranslate = {}
gftranslate.jsonurl="/robust/Translate8.pgf"
gftranslate.grammar="Translate" // the name of the grammar
-gftranslate.languages="Bul Chi Eng Fin Fre Ger Hin Swe".split(" ")
- // hardwired for now
gftranslate.call=function(querystring,cont) {
http_get_json(gftranslate.jsonurl+querystring,cont)
}
-// Translate a sentence to the given target language
-gftranslate.translate=function(source,from,to,cont) {
+// Translate a sentence
+gftranslate.translate=function(source,from,to,start,limit,cont) {
var encsrc=encodeURIComponent(source)
var g=gftranslate.grammar
- function extract(result) {
- cont(result[0].translations[0].linearizations[0].text)
- }
+ function extract(result) { cont(result[0].translations) }
if(encsrc.length<200) // match limit in runtime/c/utils/pgf-server.c
gftranslate.call("?command=c-translate&input="+encsrc
- +"&from="+g+from+"&to="+g+to+"&limit=1",extract)
- else cont("[GF robust parser: sentence too long]")
+ +"&from="+g+from+"&to="+g+to
+ +"&start="+start+"&limit="+limit,extract)
+ else cont([{error:"sentence too long"}])
}
// Get functions to test which source and target langauges are supported
gftranslate.get_support=function(cont) {
- if(!gftranslate.targets) gftranslate.targets=toSet(gftranslate.languages)
- function ssupport(code) { return gftranslate.targets[code] }
- function tsupport(code) { return gftranslate.targets[code] }
- cont(ssupport,tsupport)
+ function support(code) { return gftranslate.targets[code] }
+ function init2(grammar_info) {
+ var ls=grammar_info.languages
+ gftranslate.grammar=grammar_info.name
+ var langs=[], pre=gftranslate.grammar, n=pre.length
+ for(var i=0;i<ls.length;i++)
+ if(ls[i].name.substr(0,n)==pre) langs.push(ls[i].name.substr(n))
+ gftranslate.targetlist=langs
+ gftranslate.targets=toSet(langs)
+ cont(support,support)
+ }
+ if(gftranslate.targets) cont(support,support)
+ else gftranslate.call("?command=c-grammar",init2)
}
diff --git a/src/www/translator/translator.js b/src/www/translator/translator.js
index 1c8dbede6..7f98058ca 100644
--- a/src/www/translator/translator.js
+++ b/src/www/translator/translator.js
@@ -203,13 +203,19 @@ Translator.prototype.update_translation=function(i) {
upd3(["[Apertium does not support "+show_translation(o)+"]"])
}
function update_gfrobust_translation() {
- function upd3s(txt) { update_segment("GFRobust",[txt]) }
- function upd2(ts,punct) {
- switch(ts.length) {
- case 0: upd3s("[no translation]");break;
- default:
- if(punct) ts=ts+" "+punct
- unlextext(ts,upd3s);
+ function upd3(txts) { update_segment("GFRobust",txts) }
+ function upd3s(txt) { upd3([txt]) }
+ function upd2(trans,punct) {
+ if(trans.length==0) upd3s("[no translation]")
+ else if(trans[0].error)
+ upd3s("[GF robust translation: "+trans[0].error+"]")
+ else {
+ var ts=[]
+ for(var i=0;i<trans.length;i++) {
+ ts[i]=trans[i].linearizations[0].text
+ if(punct) ts[i]=ts[i]+" "+punct
+ }
+ mapc(unlextext,ts,upd3)
}
}
function upd0(source,punct) {
@@ -217,7 +223,7 @@ Translator.prototype.update_translation=function(i) {
//console.log(translate_output)
upd2(translate_output,punct)
}
- gftranslate.translate(source,o.from,o.to,upd1)
+ gftranslate.translate(source,o.from,o.to,0,2,upd1)
}
if(!window.gftranslate)
upd3s("[GF robust parser is not available]")
diff --git a/src/www/wc.html b/src/www/wc.html
index 08c7c62e0..ee369dad5 100644
--- a/src/www/wc.html
+++ b/src/www/wc.html
@@ -10,6 +10,7 @@ div.center { text-align: center; }
table.center { margin-left: auto; margin-right: auto; }
textarea { margin: 0; }
body:target h1, body:target div.modtime { display: none; }
+#extra { color: #666; }
</style>
</head>
@@ -49,12 +50,14 @@ body:target h1, body:target div.modtime { display: none; }
  <button onclick="wcswap()">↑↓</button>
<br>
<textarea name=output rows=3 style="width: 100%" readonly></textarea>
+ <br>
</form>
</table>
+<div class=center><small id=extra></small></div>
<p>
<div class=modtime><small>
-<!-- hhmts start -->Last modified: Tue Jan 28 17:38:32 CET 2014 <!-- hhmts end -->
+<!-- hhmts start -->Last modified: Tue Feb 11 17:37:40 CET 2014 <!-- hhmts end -->
</small></div>
<script src="js/support.js"></script>
<script src="js/gftranslate.js"></script>
@@ -64,16 +67,21 @@ body:target h1, body:target div.modtime { display: none; }
<script>
function wctranslate() {
var f=document.forms[0]
+ var e=element("extra")
f.translate.disabled=true
f.output.value=""
+ clear(e)
function showit(result) {
f.output.value=result
f.translate.disabled=false
}
- function step3(text) { unlextext(text,showit) }
+ function step3(trans) {
+ if(e) e.innerHTML=trans[0].prob+"<br>"+trans[0].tree
+ unlextext(trans[0].linearizations[0].text,showit)
+ }
function step2(text) {
- gftranslate.translate(text,f.from.value,f.to.value,step3)
+ gftranslate.translate(text,f.from.value,f.to.value,0,1,step3)
}
lextext(f.input.value,step2)
return false;