|
- package addition;
-
- import nlp.ds.DependencyTree;
- import nlp.ds.DependencyTreeNode;
- import nlp.ds.Word;
- import qa.Globals;
- import rdf.Sparql;
- import rdf.Triple;
- import log.QueryLogger;
-
- public class AggregationRecognition {
-
- // Numbers
- static String x[]={"zero","one","two","three","four","five","six","seven","eight","nine"};
- static String y[]={"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
- static String z[]={"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};
- static int b;
-
- public static Integer translateNumbers(String str) // 1~100
- {
- int flag;
- try {
- b=Integer.valueOf(str);
- flag=1;
- }
- catch (Exception e){
- flag=2;
- }
- int i,j;
- switch(flag)
- {
- case 1:
- return b;
- case 2: // Words need to be translated into numbers
- for(i=0;i<8;i++) // 20~99
- {
- for(j=0;j<10;j++)
- {
- String str1=z[i],str2=x[j];
- if(str.equals((str1))){
- return i*10+20; // 1x
- }
-
- else if(str.equals((str1+" "+str2))){
- return i*10+j+20;
- }
- }
- }
-
- for(i=0;i<10;i++){
- if(str.equals(x[i])){
- return i;
- }
- else if(str.equals(y[i])){
- return 10+i;
- }
- }
-
- System.out.println("Warning: Can not Translate Number: " + str);
- }
- return 1;
- }
-
-
- public void recognize(QueryLogger qlog)
- {
- DependencyTree ds = qlog.s.dependencyTreeStanford;
- if(qlog.isMaltParserUsed)
- ds = qlog.s.dependencyTreeMalt;
-
- Word[] words = qlog.s.words;
-
- // how often | how many
- if(qlog.s.plainText.indexOf("How many")!=-1||qlog.s.plainText.indexOf("How often")!=-1||qlog.s.plainText.indexOf("how many")!=-1||qlog.s.plainText.indexOf("how often")!=-1)
- {
- for(Sparql sp: qlog.rankedSparqls)
- {
- sp.countTarget = true;
- // How many pages does War and Peace have? --> res:War_and_Peace dbo:numberOfPages ?n .
- // ?uri dbo:populationTotal ?inhabitants .
- for(Triple triple: sp.tripleList)
- {
- String p = Globals.pd.getPredicateById(triple.predicateID).toLowerCase();
- if(p.contains("number") || p.contains("total") || p.contains("calories") || p.contains("satellites"))
- {
- sp.countTarget = false;
- }
- }
- }
- }
-
- // more than [num] [node]
- for(DependencyTreeNode dtn: ds.nodesList)
- {
- if(dtn.word.baseForm.equals("more"))
- {
- if(dtn.father!=null && dtn.father.word.baseForm.equals("than"))
- {
- DependencyTreeNode tmp = dtn.father;
- if(tmp.father!=null && tmp.father.word.posTag.equals("CD") && tmp.father.father!=null && tmp.father.father.word.posTag.startsWith("N"))
- {
- DependencyTreeNode target = tmp.father.father;
-
- // Which caves have more than 3 entrances | entranceCount | filter
- for(Sparql sp: qlog.rankedSparqls)
- {
- if(target.father !=null && target.father.word.baseForm.equals("have"))
- {
- sp.moreThanStr = "GROUP BY ?" + qlog.target.originalForm + "\nHAVING (COUNT(?"+target.word.originalForm + ") > "+tmp.father.word.baseForm+")";
- }
- else
- {
- int num = translateNumbers(tmp.father.word.baseForm);
- sp.moreThanStr = "FILTER (?"+target.word.originalForm+"> " + num + ")";
- }
- }
- }
- }
- }
- }
-
- // most
- for(Word word: words)
- {
- if(word.baseForm.equals("most"))
- {
- Word modifiedWord = word.modifiedWord;
- if(modifiedWord != null)
- {
- for(Sparql sp: qlog.rankedSparqls)
- {
- // Which Indian company has the most employees? --> ... dbo:numberOfEmployees ?n . || ?employees dbo:company ...
- sp.mostStr = "ORDER BY DESC(COUNT(?"+modifiedWord.originalForm+"))\nOFFSET 0 LIMIT 1";
- for(Triple triple: sp.tripleList)
- {
- String p = Globals.pd.getPredicateById(triple.predicateID).toLowerCase();
- if(p.contains("number") || p.contains("total"))
- {
- sp.mostStr = "ORDER BY DESC(?"+modifiedWord.originalForm+")\nOFFSET 0 LIMIT 1";
- }
- }
- }
- }
- }
- }
- }
-
- public static void main(String[] args) {
- System.out.println(translateNumbers("Twelve"));
- System.out.println(translateNumbers("thirty two"));
- }
-
- }
|