示例#1
0
        public ArrayList GetMorphology(string inText)
        {
            Grafemat gr = new Grafemat();
            ArrayList prText = gr.AnalyzeTextEl(inText);

            for (int i = 0; i < prText.Count; i++)
            {
                Predlozhenie curPred = (Predlozhenie)prText[i];

                //
                //	Первый этап - анализ
                //

                //Нулевой проход - определение частей речи

                for (int j = 0; j < curPred.Count; j++)
                {
                    Slovo curSlovo = curPred[j];
                    if (curSlovo.chastRechi != ChastRechi.Znak)
                    {
                        string eSlovo = curSlovo.eSlovo;
                        if (eSlovo.Length == 1 || eSlovo.Length == 2 && eSlovo[1] == '-')
                        {
                            curSlovo.chastRechi = ChastRechi.Mestoimenie;
                            curSlovo = OtherModule.Analyze(curPred, j);
                        }
                        else
                            switch (eSlovo[0])
                            {
                                case 'Q':
                                case 'W':
                                    curSlovo.chastRechi = ChastRechi.Suschestvitelnoe;
                                    break;
                                case 'F':
                                    curSlovo.chastRechi = ChastRechi.Predlog;
                                    break;
                                case 'E':
                                    curSlovo.chastRechi = ChastRechi.Prilagatelnoe;
                                    break;
                                case 'I':
                                    curSlovo.chastRechi = ChastRechi.Prichastie;
                                    break;
                                case 'A':
                                    curSlovo.chastRechi = ChastRechi.Mestoimenie;
                                    break;
                                case 'R':
                                case 'T':
                                case 'Y':
                                case 'U':
                                case 'O':
                                    curSlovo.chastRechi = ChastRechi.Glagol;
                                    break;
                                //etc...
                                default:
                                    curSlovo.chastRechi = ChastRechi.Mezhdometie;
                                    break;
                            }
                    }

                    curPred.SetSlovo(curSlovo, j);
                }

                prText[i] = curPred;
            }
            return prText;
        }
示例#2
0
        public ArrayList Analyze(string inText)
        {
            Grafemat gr = new Grafemat();
            ArrayList prText = gr.AnalyzeTextEl(inText);

            for(int i=0;i<prText.Count;i++)
            {
                Predlozhenie curPred = (Predlozhenie)prText[i];

                //
                //	Первый этап - анализ
                //

                //Нулевой проход - определение частей речи

                for(int j=0;j<curPred.Count;j++)
                {
                    Slovo curSlovo = curPred[j];
                    if(curSlovo.chastRechi != ChastRechi.Znak)
                    {
                        string eSlovo = curSlovo.eSlovo;
                        if (eSlovo.Length == 1 || eSlovo.Length == 2 && eSlovo[1] == '-')
                        {
                            curSlovo.chastRechi = ChastRechi.Mestoimenie;
                            curSlovo = OtherModule.Analyze(curPred, j);
                        }
                        else
                        switch(eSlovo[0])
                        {
                            case 'Q':
                            case 'W':
                                curSlovo.chastRechi = ChastRechi.Suschestvitelnoe;
                                break;
                            case 'F':
                                curSlovo.chastRechi = ChastRechi.Predlog;
                                break;
                            case 'E':
                                curSlovo.chastRechi = ChastRechi.Prilagatelnoe;
                                break;
                            case 'I':
                                curSlovo.chastRechi = ChastRechi.Prichastie;
                                break;
                            case 'A':
                                curSlovo.chastRechi = ChastRechi.Mestoimenie;
                                break;
                            case 'R':
                            case 'T':
                            case 'Y':
                            case 'U':
                            case 'O':
                                curSlovo.chastRechi = ChastRechi.Glagol;
                                break;
                            //etc...
                            default:
                                curSlovo.chastRechi = ChastRechi.Mezhdometie;
                                break;
                        }
                    }

                    curPred.SetSlovo(curSlovo,j);
                }

                // Первый проход - существительные

                for(int j=0;j<curPred.Count;j++)
                {
                    Slovo curSlovo = curPred[j];
                    if(curSlovo.chastRechi != ChastRechi.Znak)
                    {
                        string eSlovo = curSlovo.eSlovo;
                        if(eSlovo[0]=='Q' || eSlovo[0]=='W')
                        {
                            curSlovo = NounModule.Analyze(curPred,j);
                        }
                    }

                    curPred.SetSlovo(curSlovo,j);
                }

                // Полуторный проход - глаголы

                for(int j=0;j<curPred.Count;j++)
                {
                    Slovo curSlovo = curPred[j];
                    if (curSlovo.chastRechi != ChastRechi.Znak && curSlovo.chastRechi != ChastRechi.Mestoimenie)
                    {
                        string eSlovo = curSlovo.eSlovo;
                        if(eSlovo[0]=='R' || eSlovo[0]=='T' || eSlovo[0]=='Y' || eSlovo[0]=='U')
                        {
                            curSlovo = VerbModule.Analyze(curPred,j);
                        }
                    }

                    curPred.SetSlovo(curSlovo,j);
                }

                //Второй проход - все остальное.
                for(int j=0;j<curPred.Count;j++)
                {
                    Slovo curSlovo = curPred[j];
                    if(curSlovo.chastRechi != ChastRechi.Znak)
                    {
                        string eSlovo = curSlovo.eSlovo;

                        //
                        // Заменить на соответствующее для данной части речи.
                        //
                        if(eSlovo[0]=='E' || eSlovo[0]=='I')
                        {
                            curSlovo = AdjectiveModule.Analyze(curPred,j);
                        }
                        if(eSlovo[0]=='F')
                        {
                            curSlovo = PredlogModule.Analyze(curPred,j);
                        }

                        if(eSlovo[0]=='A')
                        {
                            curSlovo = OtherModule.Analyze(curPred,j);
                        }
                    }

                    curPred.SetSlovo(curSlovo,j);
                }
                prText[i] = curPred;
            }
            return prText;
        }
示例#3
0
        /**
         * Собственно, перевод..
         */
        public string Translate(string inText)
        {
            //Перед тем как переводить, приведем текст в нормальную форму
            inText = NormalizeText(inText);

            Grafemat gr = new Grafemat();
            ArrayList prText = gr.AnalyzeTextEl(inText);

            Count = 0;
            Scet = 0;

            //Считаем слова (для тиков)
            foreach (Predlozhenie curPred in prText)
                for (int i = 0; i < curPred.Count; i++)
                    Count++;

            Count *= 2;

            for (int i = 0; i < prText.Count; i++)
            {
                Predlozhenie curPred = (Predlozhenie)prText[i];

                //
                //	Первый этап - анализ
                //

                //Нулевой проход - определение частей речи

                for (int j = 0; j < curPred.Count; j++)
                {
                    Slovo curSlovo = curPred[j];
                    if (curSlovo.chastRechi != ChastRechi.Znak)
                    {
                        string eSlovo = curSlovo.eSlovo;
                        if (eSlovo.Length == 1 || eSlovo.Length == 2 && eSlovo[1] == '-')
                            curSlovo.chastRechi = ChastRechi.Mestoimenie;
                        else
                            switch (eSlovo[0])
                            {
                                case 'Q':
                                case 'W':
                                    curSlovo.chastRechi = ChastRechi.Suschestvitelnoe;
                                    break;
                                case 'F':
                                case 'P':
                                    curSlovo.chastRechi = ChastRechi.Predlog;
                                    break;
                                case 'E':
                                    curSlovo.chastRechi = ChastRechi.Prilagatelnoe;
                                    break;
                                case 'I':
                                    curSlovo.chastRechi = ChastRechi.Prichastie;
                                    break;
                                case 'A':
                                    curSlovo.chastRechi = ChastRechi.Mestoimenie;
                                    break;
                                case 'R':
                                case 'T':
                                case 'Y':
                                case 'U':
                                case 'O':
                                    curSlovo.chastRechi = ChastRechi.Glagol;
                                    break;
                                //etc...
                                default:
                                    curSlovo.chastRechi = ChastRechi.Mezhdometie;
                                    break;
                            }
                    }

                    curPred.SetSlovo(curSlovo, j);
                }

                // Первый проход - существительные

                for (int j = 0; j < curPred.Count; j++)
                {
                    Slovo curSlovo = curPred[j];
                    if (curSlovo.chastRechi != ChastRechi.Znak && curSlovo.chastRechi != ChastRechi.Mestoimenie)
                    {
                        string eSlovo = curSlovo.eSlovo;
                        if (eSlovo[0] == 'Q' || eSlovo[0] == 'W')
                        {
                            curSlovo = NounModule.Analyze(curPred, j);
                            Scet++;
                            OnTick();
                        }
                    }

                    curPred.SetSlovo(curSlovo, j);
                }

                // Полуторный проход - глаголы

                for (int j = 0; j < curPred.Count; j++)
                {
                    Slovo curSlovo = curPred[j];
                    if (curSlovo.chastRechi != ChastRechi.Znak && curSlovo.chastRechi != ChastRechi.Mestoimenie)
                    {
                        string eSlovo = curSlovo.eSlovo;
                        if (eSlovo[0] == 'R' || eSlovo[0] == 'T' || eSlovo[0] == 'Y' || eSlovo[0] == 'U' || eSlovo[0] == 'I')
                        {
                            curSlovo = VerbModule.Analyze(curPred, j);
                            Scet++;
                            OnTick();
                        }
                    }

                    curPred.SetSlovo(curSlovo, j);
                }

                //Второй проход - все остальное.
                for (int j = 0; j < curPred.Count; j++)
                {
                    Slovo curSlovo = curPred[j];
                    if (curSlovo.chastRechi != ChastRechi.Znak && curSlovo.chastRechi != ChastRechi.Mestoimenie)
                    {
                        string eSlovo = curSlovo.eSlovo;

                        //
                        // Заменить на соответствующее для данной части речи.
                        //
                        if (eSlovo[0] == 'E')
                        {
                            curSlovo = AdjectiveModule.Analyze(curPred, j);
                            Scet++;
                            OnTick();
                        }
                        if (eSlovo[0] == 'F')
                        {
                            curSlovo = PredlogModule.Analyze(curPred, j);
                            Scet++;
                            OnTick();
                        }

                        if (eSlovo[0] == 'A')
                        {
                            curSlovo = OtherModule.Analyze(curPred, j);
                            Scet++;
                            OnTick();
                        }
                    }

                    curPred.SetSlovo(curSlovo, j);
                }

                //
                //	Второй этап - перевод
                //

                for (int j = 0; j < curPred.Count; j++)
                {
                    Slovo curSlovo = curPred[j];
                    try
                    {

                        switch (curSlovo.chastRechi)
                        {
                            case ChastRechi.Suschestvitelnoe:
                                curSlovo = NounModule.Translate(curPred, j);
                                break;
                            case ChastRechi.Prilagatelnoe:
                                curSlovo = AdjectiveModule.Translate(curPred, j);
                                break;
                            case ChastRechi.Prichastie:
                            case ChastRechi.Glagol:
                                curSlovo = VerbModule.Translate(curPred, j);
                                break;
                            case ChastRechi.Predlog:
                                curSlovo = PredlogModule.Translate(curPred, j);
                                break;
                            case ChastRechi.Mestoimenie:
                            case ChastRechi.Mezhdometie:
                            case ChastRechi.Narechie:
                                curSlovo = OtherModule.Translate(curPred, j);
                                break;
                            default:
                                curSlovo = DefaultModule.Translate(curPred, j);
                                break;
                        }
                    }
                    catch
                    { }

                    curPred.SetSlovo(curSlovo, j);
                    Scet++;
                    OnTick();
                }

                prText[i] = curPred;
            }

            string rezult = "";

            Scet = Count;
            OnTick();

            Hashtable suschTable = new Hashtable();

            for (int i = 0; i < prText.Count; i++)
            {
                rezult += ((Predlozhenie)prText[i]).ToEnString(ref suschTable);
            }

            if (this.End != null)
                End(this, new CoreEndEventArgs(rezult));

            return rezult;
        }