private SimpleBracketsTaskModel GenerateFromPresentSimplePositive(ParsedSentModel parsedSent) { var verbIndex = parsedSent.Tokens .FindIndexOf(x => PositiveVerbTags.Contains(x.Tag)); if (verbIndex == -1) { return(null); } var verbToken = parsedSent.Tokens[verbIndex]; var startItems = parsedSent.Tokens .Take(verbIndex) .Select(x => x.Word); var endItems = parsedSent.Tokens .Skip(verbIndex + 1) .SkipLast(1) .Select(x => x.Word); var allTaskTokens = startItems .Concat(new[] { OptionString }) .Concat(endItems) .ToList(); var sent = string.Join(' ', allTaskTokens); sent = $"{sent}{parsedSent.Tokens[^1].Word}";
private CreateTaskItemModel GenerateTaskItem( string generationId, GenerateTaskModel generateTaskModel, ParsedSentModel parsedSent) { var bracketsModel = parsedSent.SentType switch { SentTypes.PresentSimpleNegative => GenerateFromPresentSimpleNegative(parsedSent), SentTypes.PresentSimpleQuestion => GenerateFromPresentSimpleQuestion(parsedSent), SentTypes.PresentSimplePositive => GenerateFromPresentSimplePositive(parsedSent), _ => throw new ArgumentException($"SentType not supported {parsedSent.SentType}") }; if (bracketsModel == null) { return(null); } return(new CreateTaskItemModel { TaskGenerationId = generationId, SourceSentId = parsedSent.Id, GrammarPart = generateTaskModel.GrammarPart, SentType = parsedSent.SentType, TaskType = TaskType.SimpleBrackets, EnglishLevel = parsedSent.EnglishLevel, Content = bracketsModel.ToBsonDocument(), }); }
private SimpleBracketsTaskModel GenerateFromPresentSimpleNegative(ParsedSentModel parsedSent) { var subjectTokens = GetSubject(parsedSent.Tokens); var auxToken = parsedSent.Tokens[subjectTokens.Count]; var isTobeAux = auxToken.Lemma == "be"; IReadOnlyCollection <SentTokenModel> verbTokens = Array.Empty <SentTokenModel>(); if (!isTobeAux) { var verbIndex = parsedSent.Tokens .FindIndexOf(x => x.Tag == GrammarTags.VB); verbTokens = parsedSent.Tokens .Skip(subjectTokens.Count + 2) .Take(verbIndex - subjectTokens.Count - 1) .ToList(); } var firstContentPart = subjectTokens .Select(x => x.Word) .ToList(); var endPart = parsedSent.Tokens .Skip(subjectTokens.Count + 2 + verbTokens.Count) .SkipLast(1) .Select(x => x.Word) .ToList(); var firstPartStr = string.Join(' ', firstContentPart); var endPartStr = string.Join(' ', endPart); var content = $"{firstPartStr} {OptionString} {endPartStr}{parsedSent.Tokens.Last().Word}"; var verbStr = isTobeAux ? "be" : string.Join(' ', verbTokens.Select(x => x.Lemma)); var option = $"not {verbStr}"; var auxWord = MapVerbTokenWithoutShortForm(auxToken); var verbAnswer = string.Join(' ', verbTokens.Select(x => x.Word).ToList()); var answerShort = $"{auxWord}n't {verbAnswer}"; var answerLong = $"{auxWord} not {verbAnswer}"; var line = new SimpleBracketsLineModel { Answer = new[] { answerShort, answerLong, }, Content = content, Option = option, }; return(new SimpleBracketsTaskModel { Lines = new[] { line }, }); }
public async Task <EnglishLevel> GetSentLevelAsync(ParsedSentModel sent) { var words = sent.Tokens .Where(x => x.Pos != GrammarTags.PUNCT) .Select(x => x.Lemma.ToLower()) .ToList(); var wordsMetadata = await _wordMetadataRepository.GetAsync(words); if (wordsMetadata.Count == 0) { return(EnglishLevel.None); } return(wordsMetadata.Max(x => x.Level)); }