public static SentenceUnderstander LoadFromPatterns(
            IEnumerable <GenerativePattern> generativePatterns,
            IRussianGrammarParser grammarParser,
            IRussianLexicon russianLexicon,
            MeaningBuilder meaningBuilder)
        {
            var concreteUnderstanders = new List <ConcretePatternOfUnderstanding>();
            var result = new SentenceUnderstander(concreteUnderstanders);

            foreach (var generativePattern in generativePatterns)
            {
                var concretePatterns = generativePattern
                                       .GenerateConcretePatterns(grammarParser, russianLexicon)
                                       .AsImmutable();

                var ambiguouslyUnderstoodPatterns = (
                    from it in concretePatterns
                    let pattern = it.PatternWithMeaning.Pattern
                                  let understanding = Understand(
                        pattern.AsParsedSentence(),
                        concreteUnderstanders,
                        meaningBuilder)
                                                      where understanding.IsRight
                                                      select new
                {
                    Pattern = pattern,
                    NewPatternId = generativePattern.PatternId,
                    ExistingPatternId = understanding.Right !.PatternId
                }
 public static SentenceUnderstander LoadFromEmbeddedResources(
     IRussianGrammarParser grammarParser,
     IRussianLexicon russianLexicon,
     MeaningBuilder meaningBuilder)
 =>
 LoadFromPatterns(
     ParsePatterns(ReadEmbeddedResource("Ginger.Runner.SentenceUnderstandingRules.txt")),
     grammarParser,
     russianLexicon,
     meaningBuilder);
 public UnderstandingOutcome Understand(ParsedSentence sentence, MeaningBuilder meaningBuilder) =>
 Understand(sentence, _phraseTypeUnderstanders, meaningBuilder);
Beispiel #4
0
            public override void LoadDictionaryPart()
            {
                BinaryReader reader = new BinaryReader(LoadStream, Encoding.UTF8);

                StringPointerBuilder pinyinsBuilder      = new StringPointerBuilder();
                StringPointerBuilder translationsBuilder = new StringPointerBuilder();
                StringPointerBuilder tagsBuilder         = new StringPointerBuilder();

                List <string> thumbPinyinBuilder      = new List <string>();
                List <string> thumbTranslationBuilder = new List <string>();

                while (LoadStream.Position < LoadStream.Length)
                {
                    string hanzi            = string.Empty;
                    string traditional      = string.Empty;
                    string radicals         = string.Empty;
                    string link             = string.Empty;
                    string thumbPinyin      = string.Empty;
                    string thumbTranslation = string.Empty;

                    hanzi       = reader.ReadString();
                    traditional = reader.ReadString();
                    if (Version >= 1)
                    {
                        radicals = reader.ReadString();
                    }
                    link             = reader.ReadString();
                    thumbPinyin      = reader.ReadString();
                    thumbTranslation = reader.ReadString();

                    byte meaningCount = reader.ReadByte();
                    for (byte i = 0; i < meaningCount; ++i)
                    {
                        byte pinyinCount = reader.ReadByte();
                        for (byte j = 0; j < pinyinCount; ++j)
                        {
                            string pinyin = reader.ReadString();
                            pinyinsBuilder.Add(pinyin);
                            thumbPinyinBuilder.Add(pinyin);
                        }
                        byte translationCount = reader.ReadByte();
                        for (byte j = 0; j < translationCount; ++j)
                        {
                            string translation = reader.ReadString();
                            translationsBuilder.Add(translation);
                            if (MeaningBuilder.MeaningMemory.Count == MeaningBuilder.MeaningStart)
                            {
                                thumbTranslationBuilder.Add(translation);
                            }
                        }

                        MeaningBuilder.Add(pinyinsBuilder, translationsBuilder);

                        pinyinsBuilder.Clear();
                        translationsBuilder.Clear();
                    }

                    byte tagCount = reader.ReadByte();
                    for (byte i = 0; i < tagCount; ++i)
                    {
                        tagsBuilder.Add(reader.ReadString());
                    }

                    if (thumbPinyin == string.Empty)
                    {
                        thumbPinyin = BuildThumb(thumbPinyinBuilder);
                    }
                    if (thumbTranslation == string.Empty)
                    {
                        thumbTranslation = BuildThumb(thumbTranslationBuilder);
                    }

                    ulong pinyinMask = 0;
                    if (Version >= 3)
                    {
                        pinyinMask = reader.ReadUInt64();
                    }
                    else
                    {
                        foreach (string pinyin in thumbPinyinBuilder)
                        {
                            pinyinMask |= pinyin.LetterMask();
                        }
                    }

                    Words.Add(new Word(StringBuilder,
                                       hanzi, traditional, thumbPinyin, thumbTranslation, radicals, link,
                                       MeaningBuilder, tagsBuilder, pinyinMask));

                    tagsBuilder.Clear();
                    MeaningBuilder.Clear();
                    thumbPinyinBuilder.Clear();
                    thumbTranslationBuilder.Clear();
                }
            }
Beispiel #5
0
            public override void LoadDictionaryPart()
            {
                XmlReader reader = XmlReader.Create(LoadStream);

                StringPointerBuilder pinyinBuilder      = new StringPointerBuilder();
                StringPointerBuilder translationBuilder = new StringPointerBuilder();
                StringPointerBuilder tagBuilder         = new StringPointerBuilder();

                List <string> thumbPinyinBuilder      = new List <string>();
                List <string> thumbTranslationBuilder = new List <string>();

                while (reader.ReadToFollowing("Word"))
                {
                    JobCancellationToken.ThrowIfCancellationRequested();

                    string hanzi            = string.Empty;
                    string traditional      = string.Empty;
                    string radicals         = string.Empty;
                    string link             = string.Empty;
                    string thumbPinyin      = string.Empty;
                    string thumbTranslation = string.Empty;

                    reader.ReadToFollowing("Hanzi");
                    hanzi = reader.ReadElementContentAsString();

                    Cursor cursor    = Cursor.Traditional;
                    int    wordDepth = reader.Depth;
                    while (reader.Read() && reader.Depth >= wordDepth)
                    {
                        if (reader.NodeType == XmlNodeType.Element)
                        {
                            string name = reader.Name;

                            if (cursor <= Cursor.Traditional && name == "Traditional")
                            {
                                traditional = reader.ReadElementContentAsString();
                                cursor      = Cursor.Traditional + 1;
                            }
                            else if (cursor <= Cursor.Radicals && name == "Radicals")
                            {
                                radicals = reader.ReadElementContentAsString();
                                cursor   = Cursor.Radicals + 1;
                            }
                            else if (cursor <= Cursor.Link && name == "Link")
                            {
                                link   = reader.ReadElementContentAsString();
                                cursor = Cursor.Link + 1;
                            }
                            else if (cursor <= Cursor.ThumbPinyin && name == "ThumbPinyin")
                            {
                                thumbPinyin = reader.ReadElementContentAsString();
                                cursor      = Cursor.ThumbPinyin + 1;
                            }
                            else if (cursor <= Cursor.ThumbTranslation && name == "ThumbTranslation")
                            {
                                thumbTranslation = reader.ReadElementContentAsString();
                                cursor           = Cursor.ThumbTranslation + 1;
                            }
                            else if (cursor <= Cursor.Meaning && name == "Meaning")
                            {
                                int meaningDepth = reader.Depth;
                                cursor = Cursor.ThumbPinyin;
                                while (reader.Read() && reader.Depth > meaningDepth)
                                {
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (cursor <= Cursor.MeaningPinyin && reader.Name == "Pinyin")
                                        {
                                            string pinyin = reader.ReadElementContentAsString();
                                            pinyinBuilder.Add(pinyin);
                                            thumbPinyinBuilder.Add(pinyin);
                                        }
                                        else
                                        {
                                            cursor = Cursor.MeaningTranslation;
                                            string translation = reader.ReadElementContentAsString();
                                            translationBuilder.Add(translation);
                                            if (MeaningBuilder.MeaningMemory.Count == MeaningBuilder.MeaningStart)
                                            {
                                                thumbTranslationBuilder.Add(translation);
                                            }
                                        }
                                    }
                                }
                                MeaningBuilder.Add(pinyinBuilder, translationBuilder);

                                pinyinBuilder.Clear();
                                translationBuilder.Clear();

                                cursor = Cursor.Meaning;
                            }
                            else// if (cursor <= Cursor.Tag && name == "Tag")
                            {
                                // tag is the last element, we do not need to check
                                cursor = Cursor.Tag;
                                tagBuilder.Add(reader.ReadElementContentAsString());
                            }
                        }
                    }

                    if (thumbPinyin == string.Empty)
                    {
                        thumbPinyin = BuildThumb(thumbPinyinBuilder);
                    }
                    if (thumbTranslation == string.Empty)
                    {
                        thumbTranslation = BuildThumb(thumbTranslationBuilder);
                    }

                    ulong pinyinMask = 0;
                    foreach (string pinyin in thumbPinyinBuilder)
                    {
                        pinyinMask |= pinyin.LetterMask();
                    }

                    Words.Add(new Word(StringBuilder,
                                       hanzi, traditional, thumbPinyin, thumbTranslation, radicals, link,
                                       MeaningBuilder, tagBuilder, pinyinMask));

                    tagBuilder.Clear();
                    MeaningBuilder.Clear();
                    thumbPinyinBuilder.Clear();
                    thumbTranslationBuilder.Clear();
                }

                reader.Dispose();
            }
Beispiel #6
0
 public static MeaningBuilder Enrich(MeaningBuilder originalMeaningBuilder) =>
 originalMeaningBuilder with