示例#1
0
void GLogicProcessor::renderDictSearch(map<vector<short>,int>&searchResult,
                                       vector<OCRMatch>&dLine,
                                       vector<OCRMatch>&originalMatch,
                                       vector<OCRMatch>&pageText){
    
    int print=0;
    DR(" searchResult.size()="<<searchResult.size()<<" dLine()="<<dLine.size())
    vector<OCRMatch>wordLine;
    
    //TIME_START
    
    //в dLine[] записаны пары букв из которых словарь собирал фразы
    //для окончательной сборки фразы нужны найденные с словаре фразы, составленные из оригинальных пар букв
    //также нужны сами пары букв для частей фразы на которые не найдены ответы словаря 
    //каждый OCRMatch содержит два массива, в которые записана информация о парах букв, составляющих фразу.
    // .line[] содержит индекс пар букв и возвращается заполненным в searchResult как результат работы словаря
    // .letter[] содержит копию пары букв по индексу line[] из исходного массива dLine[]
    for(int i=0;i<originalMatch.size();i++){
        originalMatch[i].setSize();
    }
    map<vector<short>,int>::iterator it;
    for (it = searchResult.begin(); it != searchResult.end(); ++it) {
        OCRMatch word;
        int in=abs(it->first[0]);   //знаком значения записано есть ли по мнению словаря разделитель слогов в этой паре
        word.x0=dLine[in].x0;
        word.y0=dLine[in].y0;
        word.xL0C=dLine[in].letter[0].xCenter;
        int d; int sizeStr=0;
        while(sizeStr<128){    
            d=it->first[sizeStr];  DR(d<<" ")
            if(d==32767)break;  //32767 маркирует конец строки
            word.line.push_back(d);
            sizeStr++;
        }

        d=abs(word.line[word.line.size()-1]);
        word.x1=dLine[d].x1;
        word.y1=dLine[d].y1;
        word.xL1C=dLine[d].letter[1].xCenter;

        word.correlation=0;
        int n;
        for(int i=0;i<sizeStr;i++){
            //DR(searchResult[i].line[j]<<" c="<<line[searchResult[i].line[j]].correlation;
            //DR(" searchResult["<<i<<"].line.size()="<<searchResult[i].line.size()<<" ind="<<searchResult[i].line[j])
            n=abs(it->first[i]); 
            word.wName+=dLine[n].wName[0];
            word.correlation+=dLine[n].correlation;
        }
        word.wName+=dLine[n].wName[1];
        word.correlation=word.correlation/sizeStr+(float)(sizeStr*100)/50+(float)(it->second)/5000;   //учитываем длину и вероятность фразы
        //word.correlation+=it->second;   //прибавляем к кореляции количество ответов словаря
        //word.correlation=word.line.size();
        //if(word.correlation<70)continue;
        word.name=Unicode_to_UTF(word.wName);  DR("Yagpo= "<<word.name<<" "<<endl)
        word.name=YagpoToUni(word.name);       DR("xL0C="<<word.xL0C<<"xL1C="<<word.xL1C<<" n="<<word.name<<endl);
        DR(word.name<<"/"<<"c="<<word.correlation<<" x0="<<word.x0<<" x1="<<word.x1<<" y0="<<word.y0<<" y1="<<word.y1<<endl)
        wordLine.push_back(word);
    }
    //drawGrapeLine(wordLine); exit(0);        //результаты словаря с записаными в разделители букв знаками препинания и расставленными слогами
    //drawGrapeLine(originalMatch); exit(0);   //результаты распознавания
    //drawGrapeLine(dLine); exit(0);           //пары букв с записанными в разделители букв знаками препинания
    
    //print=1;
    //добавляем распознанные пары букв 
    for(int i=0;i<dLine.size();i++){
        if(!dLine[i].correlation)continue; //значение уже записано
        OCRMatch word=dLine[i];
        word.name=Unicode_to_UTF(word.wName);  //DR("Yagpo= "<<word.name<<" ")
        word.name=YagpoToUni(word.name);
        word.line=dLine[i].line;
        word.line.push_back(i);
        wordLine.push_back(word);
        
    }
    

    
    for(int i=0;i<wordLine.size();i++){
        wordLine[i].status=0;
        wordLine[i].allMatchCount=1;
        wordLine[i].setSize();
        //DR(" wordLine[i]="<<wordLine[i].name<<" w="<<wordLine[i].letterW)
        
    }
    
    sort(wordLine.begin(),wordLine.end(),sortMatchX0);
    compressMatch(wordLine);
    
    //drawGrapeLine(wordLine); exit(0);
    
    //int count=(int)wordLine.size();
    //int step=0;
    print=0;


    //проверяем ответы словаря на здравый смысл. Пары букв из которых составлен ответ словаря не должны отменять
    //уверенно распознанные буквы
    //также убираем пустые значения
    vector<OCRMatch>wLine;
    for(int i=0;i<wordLine.size();i++){
        if(!wordLine[i].correlation)continue;
        wordLine[i].status=0;
        DR("wordLine["<<i<<"].name="<<wordLine[i].name<<endl);
        if(wordLine[i].line.size()>1){
            //для полученных фраз удобнее хранить исходные пары букв внутри фразы
            for(int j=0;j<wordLine[i].line.size();j++){
                DR(" ind="<<wordLine[i].line[j]<<" size="<<wordLine[i].line.size())
                DR(" n="<<dLine[abs(wordLine[i].line[j])].name<<" d="<<dLine[abs(wordLine[i].line[j])].letter[0].delimeter<<endl)
                wordLine[i].letter.push_back(dLine[abs(wordLine[i].line[j])].letter[0]);
                //wordLine[i].letter.push_back(dLine[abs(wordLine[i].line[j])].letter[1]);
                if(wordLine[i].line[j]<0){   //если в паре по мнению словаря есть разделитель слога (минус маркирует такие пары) /@@@
                    wordLine[i].letter[wordLine[i].letter.size()-1].delimeter=dLine[abs(wordLine[i].line[j])].letter[0].delimeter;
                    if(wordLine[i].letter[wordLine[i].letter.size()-1].delimeter=="")wordLine[i].letter[wordLine[i].letter.size()-1].delimeter="་";
                }
            }
            wordLine[i].letter.push_back(dLine[abs(wordLine[i].line[wordLine[i].line.size()-1])].letter[1]);
        }
        //if(wordLine[i].letter.size()==1){  //нормализуем одиночные пары букв
        //    wordLine[i].letter[0].delimeter=wordLine[i].delimeter;
       // }
        wLine.push_back(wordLine[i]);
    }
    //drawGrapeLine(wLine); exit(0);
    //полученные в результате подготовки в  renderDictSearch части фразы собираем в целые фразы
    //на этом этапе фразы собираются вместе ограничителями слогов и знаками препинания и примечаниями внутри фразы.
    sentenceConstructur(wLine);
    
    //drawGrapeLine(wLine); exit(0);

    //расставляем ограничители слогов (точки)
    print=0;
    string str;
    wstring delimeter;
    for(int n=0;n<originalMatch.size();n++){
        originalMatch[n].setSize();
    }
    print=0;
    for(int i=0;i<wLine.size();i++){
        if(!wLine[i].correlation)continue;
        DR(wLine[i].name<<endl)
        wLine[i].wName=L"";
        for(int n=0;n<wLine[i].letter.size();n++){
            str=wLine[i].letter[n].delimeter;  //cout<<"d="<<str;
            str=UnicodeToYagpo(str);
            delimeter=UTF_to_Unicode(str);
            wLine[i].wName+=wLine[i].letter[n].wName[0]+delimeter;
            DR(" n="<<wLine[i].letter[n].name<<"d="<<str<<"/"<<endl)
        }
        wLine[i].wName+=wLine[i].letter[wLine[i].letter.size()-1].wName[1];
        wLine[i].name=Unicode_to_UTF(wLine[i].wName);
        wLine[i].name=YagpoToUni(wLine[i].name);
        DR(" n="<<wLine[i].name<<endl)
        wLine[i].correlation+=3;  //создаем приоритет над парами без расставленных ограничителей слогов
        //добавляем результат к массиву исходных букв (результат распознавания включая все распознанные буквы и символы)
        //это позволит разобрать части фразы, не закрытые словарными ответами
        //x0=wLine[i].x0; x1=wLine[i].x1;
        //for(int n=0;n<dLine.size();n++){
        //    if(dLine[n].x0>=x0&&dLine[n].x1<=x1)dLine[n].correlation=0;
        //}
        //wLine[i].correlation=100;
        dLine.push_back(wLine[i]);
        //DR(wLine[i].name)
    }
    
    //добавляем все исходные графические элементы. Это нужно для распознования отдельно стоящих букв и знаков препинания
    for(int i=0;i<originalMatch.size();i++)dLine.push_back(originalMatch[i]);
    for(int i=0;i<dLine.size();i++)dLine[i].setSize();
    sort(dLine.begin(),dLine.end(),sortMatchXCenter);
    
    //drawGrapeLine(dLine); exit(0);
    
    
    print=0;
    //убираем фразы внутри стыкованной фразы
    int limit;
    for(int n=0;n<dLine.size();n++){
        if(!dLine[n].correlation)continue;
        if(dLine[n].y0>y1Base)dLine[n].correlation=0;
        
        //print=0;if(n==13)print=1; if(!print)continue;
        DR("@@@@"<<n<<" Collect n="<<dLine[n].name<<" d="<<dLine[n].delimeter<<endl)
        
        for(int m=0;m<dLine.size();m++){
          if(!dLine[m].correlation)continue;
          //print=0;if(m==16)print=1;
          if(m==n)continue;
          limit=12; 
          
          if(dLine[n].OCRIndex!='N'&&dLine[m].OCRIndex=='N')limit=0;  
          if(dLine[n].OCRIndex!='Z'&&dLine[m].OCRIndex=='Z')limit=0;
          if(dLine[n].OCRIndex=='N'&&dLine[m].OCRIndex=='N')limit=0;
          if(dLine[n].OCRIndex=='Z'&&dLine[m].OCRIndex=='Z')limit=4;
          if(dLine[n].OCRIndex=='Z'&&dLine[m].OCRIndex!='Z')limit=0;
          if(dLine[n].OCRIndex=='S'&&dLine[m].OCRIndex=='S')limit=0;
          
          if(dLine[m].xCenter>dLine[n].x0-limit&&dLine[m].xCenter<dLine[n].x1+limit){
          
              DR("n"<<n<<"="<<dLine[n].name<<" d="<<dLine[n].delimeter<<" c="<<dLine[n].correlation<<" m"<<m<<"="<<dLine[m].name
                 <<" c="<<dLine[m].correlation<<" xmC="<<dLine[m].xCenter<<" xnC="<<dLine[n].xCenter<<" xnX0="<<dLine[n].x0<<" xnX1="<<dLine[n].x1<<" wM="<<dLine[m].letterW<<" wN="<<dLine[n].letterW<<endl);
              
                  if(dLine[n].correlation>dLine[m].correlation){
                      if(dLine[n].letterW>dLine[m].letterW-limit||(dLine[n].letterW/dLine[m].letterW)>1.3){ DR(100)
                          DR("REMOVE M "<<m<<" cM="<<dLine[m].correlation<<" wM="<<dLine[m].letterW<<" cN="<<dLine[n].correlation<<" wN="<<dLine[n].letterW<<endl)
                          dLine[m].correlation=0;
                      }else{ DR(200)
                          if(dLine[n].correlation-dLine[m].correlation>5){   //предпочтение отдаем более широким буквам
                              dLine[m].correlation=0;
                              DR("REMOVE M1 "<<m<<" cN="<<dLine[n].correlation<<endl)
                          }else{
                              DR("REMOVE N "<<m<<" cN="<<dLine[n].correlation<<endl)
                              dLine[n].correlation=0;
                              break;
                          }    
                      }    
                  }else{
                      if(dLine[m].letterW>dLine[n].letterW-limit||(dLine[n].letterW/dLine[m].letterW)<1.3){
示例#2
0
//новая версия грамматического анализатора.
//текст реконструируется на основе вероятностного анализа результатов распознавания
//с применением взаимной корреляции частей разных букв. Слоги и слова реконструируются
//на основе вероятносного анализа корпуса тибетских текстов и правил построения шрифта.
void GLogicProcessor::classification(vector<stringOCR>&strArray,
                                      vector<OCRMatch>&matchLine,
                                      GBitmap* lineImg32,
                                      string &mainString,
                                      int sizeLine,
                                      int lineIndex){

    int print=0;
    vector<OCRMatch>dLine;
    TIME_START
    y0Base=strArray[lineIndex].LimY0;
    y1Base=strArray[lineIndex].LimY1;
    DR("@@@y0Base"<<y0Base<<" y1Base="<<y1Base<<" s="<<matchLine.size())
    
    GBitmap *letterAImg=GBitmap::create(lineImg32->columns(),lineImg32->rows(),BITMAP_32);
    GBitmap *letterBImg=GBitmap::create(lineImg32->columns(),lineImg32->rows(),BITMAP_32);

    
    
#ifdef MAIN_MODE
    
    //for(int i=0;i<matchLine.size();i++)if(matchLine[i].letterIndex==15650){cout<<"@@@@@";exit(0);}
    
    //drawGrapeLine(matchLine); exit(0);
    
    
    sort(matchLine.begin(),matchLine.end(),sortMatchX0);
    
    //cout<<"strArray.size()="<<strArray[0].size()<<" matchLine.size()="<<matchLine.size()<<endl;
    
    if(!matchLine.size()||!strArray.size())return;   //
    
    for(int i=0;i<matchLine.size();i++){
        matchLine[i].correlationNew=0;
        if(!matchLine[i].correlation)continue;
        matchLine[i].status=0;
    }
    //drawGrapeLine(matchLine); exit(0);

    compressMatch(matchLine);
    //drawGrapeLine(matchLine); exit(0);


    //на этом этапе в matchLine записано около 50 результатов на одну букву текста
    //заменяем одинаковые буквы на букву с наибольшей корреляцией и наибольшей общей площадью совпадающей с изображением на странице.
    //также для каждой гипотезы распознанной буквы проверяем перекрытие с соседними буквами
    //оставляем только те буквы, которые лучше описывают соответствующие площади буквы области изображения.
    letterNeighborsNew(matchLine,lineImg32,letterAImg,letterBImg);

    //drawGrapeLine(matchLine); exit(0);
    
    
#ifdef STACK_MODE    
    //saveMatch(matchLine,"/2_2.match");
#endif
    

    for(int i=0;i<matchLine.size();i++){
        if(matchLine[i].correlation){
          matchLine[i].status=0;
          if(matchLine[i].OCRIndex!=3&&matchLine[i].correlationNew)matchLine[i].correlation=matchLine[i].correlationNew;
          dLine.push_back(matchLine[i]);
        }
    }
    
    DR("done match processing line.size()="<<dLine.size())
    sort(dLine.begin(),dLine.end(),sortMatchX0);
    DR("@@@@@ SAVE MATCH")
#ifdef STACK_MODE    
    //saveMatch(dLine,"/2.match");
#endif    
#endif
    
#ifdef STACK_MODE    
    //readMatch(dLine,"/2.match");
#endif    
    
    //компрессия. Все одинаковые буквы в пределах габарита буквы
    //заменяются на одну букву с макcмимальной корреляцией
    compressMatch(dLine);

    //drawGrapeLine(dLine); exit(0);

    collectStackLetter(strArray,dLine, matchLine,lineImg32,letterAImg,letterBImg,lineIndex);
    //cout<<"COLLECT"; TIME_PRINT_
     //exit(0);
    //drawGrapeLine(dLine);exit(0);

    compressMatch(dLine);
    //drawGrapeLine(dLine);exit(0);
    //анализ готовых стеков.
    //проверяем есть ли над или под одиночной буквой коренные буквы или огласовки с высокой корреляцией.
    //если есть, то букву считаем частью стека и убираем как строительный блок OpenType.
    //testStackLetter(dLine,lineImg32,letterAImg,letterBImg);
    
    //drawGrapeLine(dLine); exit(0);
    
    letterAImg->destroy();
    letterBImg->destroy();
    
    string strW;
    vector<uint>letterX;
    vector<OCRMatch>line;
    vector<OCRMatch>resultLine;
    map<vector<int>,ulong>searchResult;
    
    buildSearchString(dLine,line,letterX,strW);
    cout<<strW<<endl<<endl;
    //drawGrapeLine(line); exit(0);
    textCorpusGMap->getOCRStackKey(strW,letterX,searchResult, ANY_MATCH);
    //inputData.log<<" 2"<<endl;inputData.log.flush();
    for (int i=0;i<line.size();i++){
        if(!line[i].correlation)continue;                        //cout<<line[i].name;
        line[i].name=Unicode_to_UTF(line[i].wName);              //cout<<" -- "<<line[i].name;
        line[i].name=YagpoToUni(line[i].name);   //cout<<" -- "<<line[i].name<<endl;
        resultLine.push_back(line[i]);
    }
    //logicProcessor->drawGrapeLine(line); //exit(0);
    //inputData.log<<" 3"<<endl;inputData.log.flush();
    //renderDictSearch(searchResult,line,resultLine,matchLine);   //mainString+="<br>"+lineString+"original<br>";
    if(print){ cout<<"RENDER "; TIME_PRINT_ }
    strArray[lineIndex].line=dLine;   //сохраняем для вывода в HTML
    //logicProcessor->drawGrapeLine(dLine); //exit(0);
    //inputData.log<<" 4"<<endl;inputData.log.flush();

}
示例#3
0
string GLogicProcessor::startConvert(){
	//cout<<"Start inputData.data[\"inputFolder\"]"<<inputData.data["inputFolder"]<<END;
	string str,path;
	vector<string> strVector;     
	
	 int index=0;
     DIR *dir;
	int fileFlag;
    string ocrData=inputData.data["ocrData"];

	 while(index<inputData.fileList.size()){
		if( ( dir=opendir(inputData.fileList[index].c_str()))!=NULL){
			if(ocrData=="RTFToYagpo"){
			    fileFlag=readDirectoryToArray(inputData.fileList, inputData.fileList[index],"rtf");
			}else{
			    fileFlag=readDirectoryToArray(inputData.fileList, inputData.fileList[index],"txt");
			}
			inputData.fileList.erase(inputData.fileList.begin()+index);
			continue;
		}
		index++;
	}

    if(ocrData=="YagpoToWylie"){
        string mainString;
        if(inputData.data["InputMethod"]=="fileList"){
            cout<<"YagpoToWylieConverter inputData.fileList.size()="<<inputData.fileList.size()<<END;
            for(int i=0;i<inputData.fileList.size();i++){
                strVector.resize(0);
                path=inputData.fileList[i]+"_out.txt";
                readText(strVector, inputData.fileList[i]);
                mainString="";
                for(int i=0;i<strVector.size();i++){
                    mainString+=TibUniToWylie(strVector[i],2);
                    mainString+="\n";
                }
                writeText(mainString, path);
                cout<<"done convert";
            }
        }else{
            mainString="";
            for(int i=0;i<inputData.fileList.size();i++){
                mainString+=TibUniToWylie(inputData.fileList[i],2);
                mainString+="\n";
            }
            return mainString;
        }
    }
    
	if(ocrData=="CXS_to_UTF"){
		loadMapFilePali("CXS_UTF_HTML.xml");
		cout<<"fileList.size()="<<inputData.fileList.size();
		for(int i=0;i<inputData.fileList.size();i++){
			inputData.data["inputFile"]=inputData.fileList[i];
			cout<<"convert "<<i<<" from "<<inputData.fileList.size()<<" "<<inputData.fileList[i]<<END;
			strVector.resize(0);
			readText(strVector,inputData.data["inputFile"]);
			for(int m=0;m<strVector.size();m++){
				//strVector[m]= regex_replace(  strVector[m], date, format );
				strVector[m]=Unicode_to_UTF(strVector[m]);
				convertCXS_to_UTF_nocopy(strVector[m]);
				//cout<<strVector[m];
			}
			writeText(strVector,inputData.data["inputFile"]);

		}

	}
	if(ocrData=="SinhalaUniToYagpo"){

		
	}
	if(ocrData=="ConcatenateFolder"){
		cout<<"fileList.size()="<<inputData.fileList.size();
		ofstream srcOutput;
		str=inputData.data["inputFolder"];
		str+="/allText.txt";
		srcOutput.open(str.c_str());
		for(int i=0;i<inputData.fileList.size();i++){
			inputData.data["inputFile"]=inputData.fileList[i];
			readText(str,inputData.data["inputFile"].c_str());
			cout<<"cat "<<i<<" from "<<inputData.fileList.size()<<" "<<inputData.fileList[i]<<END;
			srcOutput<<str<<endl;
		}
		srcOutput.close();
	}

	if(ocrData=="LowerCase"){
		loadMapFilePali("CXS_UTF_HTML.xml");
		cout<<"fileList.size()="<<inputData.fileList.size();
		for(int i=0;i<inputData.fileList.size();i++){
			inputData.data["inputFile"]=inputData.fileList[i];
			cout<<"convert "<<i<<" from "<<inputData.fileList.size()<<" "<<inputData.fileList[i]<<END;
			strVector.resize(0);
			readText(strVector,inputData.data["inputFile"]);
			int step=0;
			for(int m=0;m<strVector.size();m++){
				//strVector[m]= regex_replace(  strVector[m], date, format );
				//strVector[m]=Unicode_to_UTF(strVector[m]);
				lowerCase_nocopy(strVector[m]);
				if(step==1000){
					cout<<m<<"."<<strVector[m]<<END;
				step=0;}step++;
			}
			writeText(strVector,inputData.data["inputFile"]);

		}

	}

	//cout<<"inputData.data[\"ocrData\"]="<<ocrData<<END;

	if(ocrData=="PaliUTFToEng"){

		cout<<"PaliUTFToEng"<<END;

	}
	if(ocrData=="RTFToYagpo"){
		ofstream c_out; c_out.open("/_out.txt");
		cout<<"RTFToYagpo inputData.fileList.size()="<<inputData.fileList.size()<<END;
		string mainString;
		for(int i=0;i<inputData.fileList.size();i++){
			mainString="";
#ifdef COCOA
			RTFtoYagpoConverter(mainString,inputData.fileList[i]);
#endif
			string path=inputData.fileList[i]+"_out.txt";
			cout<<"path="<<path<<END;
			writeText(mainString, path);
			c_out<<report;
		}
        return "done convert";
	}

	if(ocrData=="dWylieToYagpo"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"dWylieToYagpoConverter inputData.fileList.size()="<<inputData.fileList.size()<<END;
            
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0); 
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				mainString="";
				int step=0;
				for(int i=0;i<strVector.size();i++){
					if(step==1000){cout<<i<<" ";step=0;}step++;
					mainString+=dWylieToYagpoConverter(strVector[i]);
                    mainString+="\n";
				}	
				writeText(mainString, path);
			}				
		}else{
			for(int i=0;i<inputData.fileList.size();i++){
			    mainString="";	
			    mainString+=dWylieToYagpoConverter(inputData.fileList[i])+"\n";   
			}
			return mainString;	
		}					
	}
	if(ocrData=="dSinhalaASCIToYagpo"){
		string mainString;
		string path=inputData.data["tablePath"]+"codePages/SinhalaASCI.xml";
		readMapXML(SinhalaASCI,path);
		cout<<"SinhalaASCI.size()="<<SinhalaASCI.size()<<END;
		
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"dSinhalaASCIToYagpo inputData.fileList.size()="<<inputData.fileList.size()<<END;
			int step=0;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				cout<<"strVector.size()="<<strVector.size()<<END;
				mainString="";
				for(int i=0;i<strVector.size();i++){
					mainString+=dSinhalaASCIToYagpo(strVector[i])+"\n";
					if(step==1000){cout<<i<<" ";step=0;}step++;
				}
				writeText(mainString, path);
			}
		}else{
			int step=0;
			for(int i=0;i<inputData.fileList.size();i++){
				mainString="";
				mainString+=dSinhalaASCIToYagpo(inputData.fileList[i]);
				if(step==1000){cout<<".";step=0;}step++;
			}
			cout<<mainString<<END;
		}
	}
	
	if(ocrData=="SinhalaUniToYagpo"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"SinhalaUniToYagpo inputData.fileList.size()="<<inputData.fileList.size()<<END;
			int step=0;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				cout<<"strVector.size()="<<strVector.size()<<END;
				mainString="";
				for(int i=0;i<strVector.size();i++){
					mainString+=SinhalaUniToYagpo(strVector[i],2)+"\n";
					if(step==1000){cout<<i<<" ";step=0;}step++;
				}
				writeText(mainString, path);
			}
		}else{
			int step=0;
			for(int i=0;i<inputData.fileList.size();i++){
				mainString="";
				mainString+=SinhalaUniToYagpo(inputData.fileList[i],2);
				if(step==1000){cout<<".";step=0;}step++;
			}
			return mainString;
		}
		
	}
	
	if(ocrData=="SinhalaMettaToYagpo"){
		string mainString;
		string path=inputData.data["tablePath"]+"codePages/SinhalaMetta.xml";
		readMapXML(SinhalaASCI,path);
		cout<<"SinhalaASCI.size()="<<SinhalaASCI.size()<<END;
		
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"dSinhalaASCIToYagpo inputData.fileList.size()="<<inputData.fileList.size()<<END;
			
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				cout<<"strVector.size()="<<strVector.size()<<END;
				mainString=""; int step=0;
				for(int i=0;i<strVector.size();i++){  //cout <<"next string "<<i<<" ="<<strVector[i]<<endl;
					if(strVector[i].size()){
					   mainString+=SinghalaASCIToYagpo(strVector[i])+"\n";
					}else{mainString+="\n";}	
					if(step==1000){cout<<i<<" ";step=0;}step++;
				}
				writeText(mainString, path);
			}
		}else{   
			int step=0;
			for(int i=0;i<inputData.fileList.size();i++){
  				mainString="";
				mainString+=dSinhalaASCIToYagpo(inputData.fileList[i]);
				if(step==1000){cout<<".";step=0;}step++;
			}
			return mainString;
		}
		cout<<"DONE CONVERT";
	}
	

	if(ocrData=="WylieToYagpo"){
		string mainString; cout<<" @inputData.data[InputMethod]="<<inputData.data["InputMethod"]<<endl;
        loadTransliterationFile("TranslitTableUni_Wylie.xml");
        
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"WylieToYagpoConverter inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+"_out.txt"; cout<<" path="<<path;
				readText(strVector, inputData.fileList[i]);
                cout<<" strVector="<<strVector.size()<<endl;
				mainString="";
				int step=0;
                string str;
				for(int i=0;i<strVector.size();i++){ 
					if(step==100){cout<<i<<" ";step=0;}step++;
					str=WylieToYagpoConverter(strVector[i]);
                    mainString+=YagpoToUni(str);
					mainString+="\n";
				}
				writeText(mainString, path);
				cout<<"done convert";
			}
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=WylieToYagpoConverter(inputData.fileList[i])+"\n";
			}
			return mainString;
		}
	}

	if(ocrData=="TibUniToWylie"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"YagpoToWylieConverter inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				mainString="";
				for(int i=0;i<strVector.size();i++){
					mainString+=TibUniToWylie(strVector[i],1);
					mainString+="\n";
				}
				writeText(mainString, path);
				cout<<"done convert";
			}
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=TibUniToWylie(inputData.fileList[i],1);
				mainString+="\n";
			}
			return mainString;
		}
	}

	if(ocrData=="YagpoToWylie"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"YagpoToWylieConverter inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				mainString="";
				for(int i=0;i<strVector.size();i++){
					mainString+=TibUniToWylie(strVector[i],2);
					mainString+="\n";
				}
				writeText(mainString, path);
				cout<<"done convert";
			}
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=TibUniToWylie(inputData.fileList[i],2);
				mainString+="\n";
			}
			return mainString;
		}
	}

	if(ocrData=="YagpoToUnicode"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"YagpoToUnicode inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				mainString="";
                cout<<"strVector.size()="<<strVector.size()<<endl;
                int step=0;
				for(int n=0;n<strVector.size();n++){
                    if(step==strVector.size()/100){ step=0;cout<<".";}step++;
					mainString+=YagpoToUni(strVector[n]);
					mainString+="\n";
				}
				writeText(mainString, path);
                //return path;
			}
            return "done";
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=YagpoToUni(inputData.fileList[i]);
                //cout<<"mainString="<<mainString<<endl;
				mainString+="\n";
			}
			return mainString;
		}
	}

	if(ocrData=="UnicodeToYagpo"){
		string mainString;
			if(inputData.data["InputMethod"]=="fileList"){
			cout<<"YagpoToUnicode inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
                cout<<"convert "<<inputData.fileList[i]<<endl;
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				mainString="";
                int step=0;
				for(int n=0;n<strVector.size();n++){
					//mainString+=UnicodeToYagpo(strVector[n]);
                    if(step==100000){cout<<n<<" "; step=0;} step++;
                    mainString+=tibetanUTFToYagpo(strVector[n],1);
					mainString+="\n";
				}
				writeText(mainString, path);
			}
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=UnicodeToYagpo(inputData.fileList[i]);
				if(i)mainString+="\n";
			}
			return mainString;
		}
	}
    if(ocrData=="BonPDFToUni"){
		string mainString;
        if(inputData.data["InputMethod"]=="fileList"){
			cout<<"BonPDFToUni inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
                cout<<"convert "<<inputData.fileList[i]<<endl;
				path=inputData.fileList[i]+"_out.txt";
				readText(strVector, inputData.fileList[i]);
				mainString="";
				for(int n=0;n<strVector.size();n++){
					BonPDFToUni(strVector[n]);
                    mainString+=strVector[n];
					mainString+="\n";
				}
				writeText(mainString, path);
			}
            return "done";
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				BonPDFToUni(inputData.fileList[i]);
                mainString+=inputData.fileList[i];
				if(i)mainString+="\n";
			}
			return mainString;
		}
        
	}
    
    if(ocrData=="tibTextCorrector"){
        string mainString,path;
        readGrammarDataXML(inputData.data["wordsDataPath"]);
        if(inputData.data["mode"]!="text"){
            cout<<"TibetanCorrector inputData.fileList.size()="<<inputData.fileList.size()<<END;
            cout<<" mode="<<inputData.data["mode"]<<endl;
            
            if(inputData.data["system"]=="process"){
                for(int i=0;i<inputData.fileList.size();i++){
                    cout<<"convert "<<inputData.fileList[i]<<endl;
                    inputData.data["fileName"]=inputData.fileList[i];
                    path=str_replace(".txt",".html",inputData.fileList[i]);
                    inputData.data["outFile"]=path;
                    TibetanCorrector();
                    string cmd="textutil -convert rtf \""+path+"\"";
                    cout<<cmd<<endl;
                    system(cmd.c_str());
                }
            }else{
                
                for(int i=0;i<inputData.fileList.size();i++){
                    //strVector.resize(0);
                    cout<<"convert "<<inputData.fileList[i]<<endl;
                    ostringstream out;
                    out<<inputData.data["rootApp"]<<" \"xml=<fileList>"<<inputData.fileList[i]<<
                    "</fileList><ocrData>"<<inputData.data["ocrData"]<<"</ocrData>"<<
                    "<ocrLn>"<<inputData.data["ocrLn"]<<"</ocrLn><system>process</system>\" &";
                    string cmd=out.str();
                    //cout<<cmd; exit(0);
                    system(cmd.c_str());
                }
            }
            return "done";
        }else{
            mainString=implode("\n",inputData.fileList);
            mainString=lineTibetanCorrector(mainString);
            return mainString;

        }
    }


    if(ocrData=="transcription"){
		string mainString,path;
        loadTransliterationFile("TranslitTableUni_Wylie.xml");
        if(inputData.data["InputMethod"]=="fileList"){
            cout<<"TranslitYagpoRus inputData.fileList.size()="<<inputData.fileList.size()<<END;
            
            for(int i=0;i<inputData.fileList.size();i++){
                //strVector.resize(0);
                cout<<"convert "<<inputData.fileList[i]<<endl;
                inputData.data["fileName"]=inputData.fileList[i];
                path=inputData.fileList[i]+"_out.txt";
                inputData.data["outFile"]=path;
                Transcription();
            }
            return "done";
        }else{
            mainString="";
            for(int i=0;i<inputData.fileList.size();i++){
                mainString+=lineTranscription(inputData.fileList[i]);
                mainString+="\n";
            }
            return mainString;
        }
	}
    
    if(ocrData=="textNormalisation"){
		string mainString,path;
        
        if(inputData.data["InputMethod"]=="fileList"){
			cout<<"textNormalisation inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				//strVector.resize(0);
                cout<<"convert "<<inputData.fileList[i]<<endl;
                inputData.data["fileName"]=inputData.fileList[i];
                path=inputData.fileList[i]+"_out.txt";
                inputData.data["outFile"]=path;
                string srcStr;
                readText(srcStr,inputData.data["fileName"].c_str());
				//readText(strVector, inputData.fileList[i]);
				//mainString="";
				//for(int n=0;n<strVector.size();n++){
				//	mainString+=TranslitYagpo(strVector[n]);
                //		mainString+="\n";
				//}
				//writeText(mainString, path);
                textNormalisation(srcStr);
			}
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				//mainString+=TranslitYagpo();
				if(i)mainString+="\n";
			}
			return mainString;
		}
	}
    
	if(ocrData=="TXTtoXML"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"TXTtoXML inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i]+".xml";
				path=str_replace(".doc.txt", "" ,path);
				path=str_replace(".DOC.txt", "" ,path);
				readText(strVector, inputData.fileList[i]);
				cout<<"strVector.size()="<<strVector.size()<<END;
				mainString="<text:text xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:text=\"http://www.tbrc.org/models/text#\" RID=\"\" lang=\"bo_ZH\" volume=\"\" num=\"\" fromWork=\"lam.dre\" fromVolume=\"\" start=\"0\" last=\"\">";
				for(int n=0;n<strVector.size();n++){
					if(strVector[n].find("FILE",0)==string::npos&&strVector[n].find("PAGE",0)==string::npos){
						//if(strVector[n].find("Corel",0)!=string::npos)cout<<inputData.fileList[i]<<END;
					mainString+=strVector[n];
					mainString+="\n";
					}
				}
				mainString+="</text:text>";
				cout<<path<<END;
				writeText(mainString, path);
			}
		}else{
			mainString="start\n";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=YagpoToUni(inputData.fileList[i]);
			}
			cout<<mainString<<END;
		}
	}

	if(ocrData=="TXTtoHTML"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			cout<<"TXTtoHTML inputData.fileList.size()="<<inputData.fileList.size()<<END;
			for(int i=0;i<inputData.fileList.size();i++){

				strVector.resize(0);
				path=inputData.fileList[i]+".xml";
				path=str_replace(".doc.txt", "" ,path);
				path=str_replace(".DOC.txt", "" ,path);
				readText(strVector, inputData.fileList[i]);
				cout<<"inputData.fileList[i]="<<inputData.fileList[i]<<" strVector.size()="<<strVector.size()<<END;
				//continue;
				/*
				mainString="<text:text xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:text=\"http://www.tbrc.org/models/text#\" RID=\"\" lang=\"bo_ZH\" volume=\"\" num=\"\" fromWork=\"lam.dre\" fromVolume=\"\" start=\"0\" last=\"\">";
				for(int n=0;n<strVector.size();n++){
					if(strVector[n].find("FILE",0)==string::npos&&strVector[n].find("PAGE",0)==string::npos){
						//if(strVector[n].find("Corel",0)!=string::npos)cout<<inputData.fileList[i]<<END;
						mainString+=strVector[n];
						mainString+="\n";
					}
				}
				mainString+="</text:text>";
				cout<<path<<END;
				writeText(mainString, path);
				*/
			}
		}else{
			mainString="start\n";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=YagpoToUni(inputData.fileList[i]);
			}
			cout<<mainString<<END;
		}
	}

	if(ocrData=="UTF8"){
		string mainString;
		if(inputData.data["InputMethod"]=="fileList"){
			DT("YagpoToUnicode inputData.fileList.size()="<<inputData.fileList.size()<<endl);
			for(int i=0;i<inputData.fileList.size();i++){
				strVector.resize(0);
				path=inputData.fileList[i];
				DT("convert path "<<path<<endl);
				readText(strVector, inputData.fileList[i]);
				mainString="";
				for(int n=0;n<strVector.size();n++){
					mainString+=Unicode_to_UTF(strVector[n]);
					mainString+="\n";
				}
				writeText(mainString, path);
			}
		}else{
			mainString="";
			for(int i=0;i<inputData.fileList.size();i++){
				mainString+=YagpoToUni(inputData.fileList[i]);
				mainString+="\n";
			}
			return mainString;
		}
	}


return "";

}//________________________________________________________________________________________________________________