private static ComparisonItem GetOrCreateComparisonItem(ComparisonItemForUser comparisonItemForUser,
                                                                long groupComparisonId,
                                                                int order,
                                                                StudyLanguageContext c)
        {
            ComparisonItem comparisonItem =
                c.ComparisonItem.FirstOrDefault(
                    e => e.GroupComparisonId == groupComparisonId && e.Title == comparisonItemForUser.Title);

            if (comparisonItem == null)
            {
                comparisonItem = new ComparisonItem {
                    GroupComparisonId = groupComparisonId,
                    Title             = comparisonItemForUser.Title
                };
                c.ComparisonItem.Add(comparisonItem);
            }

            comparisonItem.TitleTranslation = comparisonItemForUser.TitleTranslated;
            comparisonItem.Description      = comparisonItemForUser.Description;
            comparisonItem.Order            = order;
            c.SaveChanges();

            return(comparisonItem);
        }
Exemple #2
0
        public static List <Tuple <ComparisonItem, Double> > SearchScore(this ComparisonItem mainItem, ComparisonGroup GroupToCompare)
        {
            var ret = new List <Tuple <ComparisonItem, Double> >();

            //Iterate through the group of items to calculate that items score
            foreach (var item in GroupToCompare.Items)
            {
                //Holds the sum of the score for this item
                var sum = 0.0;
                //Iterate through each term
                foreach (var term in mainItem.Attributes)
                {
                    var itemValue  = item.GetValue(term.Key);
                    var termWeight = GetTermWeight(term.Key, GroupToCompare);
                    var maxValue   = GroupToCompare.MaxAttributeOccurence(term.Key);
                    //If the term exists
                    if (maxValue != 0 && itemValue != 0)
                    {
                        sum += (itemValue / (maxValue)) * termWeight;
                    }
                }
                ret.Add(new Tuple <ComparisonItem, double>(item, sum));
            }
            return(ret);
        }
Exemple #3
0
        static void Main(string[] args)
        {
            var wc           = new WebClient();
            var wizardOfOz   = new ComparisonItem(wc.DownloadString("https://www.gutenberg.org/cache/epub/420/pg420.txt").GetWordCount());
            var RobinHood    = new ComparisonItem(wc.DownloadString("https://www.gutenberg.org/cache/epub/964/pg964.txt").GetWordCount());
            var fantasyGroup = new ComparisonGroup()
            {
            };

            fantasyGroup.AddItem(wizardOfOz);
            fantasyGroup.AddItem(RobinHood);

            var l = "You who so plod amid serious things that you feel it shame to give yourself up even for a few short moments to mirth and joyousness".SearchScore(fantasyGroup);
        }
 internal ComparisonItemForUser(ComparisonItem comparisonItem)
     : this(comparisonItem.Title, comparisonItem.TitleTranslation, comparisonItem.Description)
 {
     Id = comparisonItem.Id;
 }
        /// <summary>
        /// Получает группу сравнения по названию
        /// </summary>
        /// <param name="userLanguages">языковые настройки пользователя</param>
        /// <param name="title">название представления</param>
        /// <returns>представление или null если не найдено</returns>
        public ComparisonForUser GetWithFullInfo(UserLanguages userLanguages, string title)
        {
            long sourceLanguageId      = userLanguages.From.Id;
            long translationLanguageId = userLanguages.To.Id;

            ComparisonForUser result = Adapter.ReadByContext(c => {
                var comparisonsQuery = (from gc in c.GroupComparison
                                        join ci in c.ComparisonItem on gc.Id equals ci.GroupComparisonId
                                        join cr in c.ComparisonRule on ci.Id equals cr.ComparisonItemId
                                        join cre in c.ComparisonRuleExample on cr.Id equals cre.ComparisonRuleId
                                        join st in c.SentenceTranslation on cre.SentenceTranslationId equals st.Id
                                        join s1 in c.Sentence on st.SentenceId1 equals s1.Id
                                        join s2 in c.Sentence on st.SentenceId2 equals s2.Id
                                        where gc.Title == title && gc.LanguageId == _languageId &&
                                        ((s1.LanguageId == sourceLanguageId &&
                                          s2.LanguageId == translationLanguageId)
                                         ||
                                         (s1.LanguageId == translationLanguageId &&
                                          s2.LanguageId == sourceLanguageId))
                                        orderby ci.Order, cr.Order, cre.Order
                                        select new { gc, ci, cr, cre, st, s1, s2 });
                var comparisonsInfos = comparisonsQuery.AsEnumerable();
                var firstComparison  = comparisonsInfos.FirstOrDefault();
                if (firstComparison == null)
                {
                    return(null);
                }
                var innerResult           = new ComparisonForUser(firstComparison.gc);
                long prevComparisonItemId = IdValidator.INVALID_ID;
                long prevComparisonRuleId = IdValidator.INVALID_ID;
                ComparisonItemForUser comparisonItemForUser = null;
                ComparisonRuleForUser comparisonRuleForUser = null;
                foreach (var comparisonInfo in comparisonsInfos)
                {
                    ComparisonItem comparisonItem = comparisonInfo.ci;
                    if (prevComparisonItemId != comparisonItem.Id)
                    {
                        prevComparisonItemId = comparisonItem.Id;

                        if (comparisonItemForUser != null)
                        {
                            innerResult.AddItem(comparisonItemForUser);
                        }

                        comparisonItemForUser = new ComparisonItemForUser(comparisonItem);
                    }

                    ComparisonRule comparisonRule = comparisonInfo.cr;
                    if (comparisonRule.Id != prevComparisonRuleId)
                    {
                        prevComparisonRuleId = comparisonRule.Id;

                        comparisonRuleForUser = new ComparisonRuleForUser(comparisonRule);
                        comparisonItemForUser.AddRule(comparisonRuleForUser);
                    }

                    SourceWithTranslation sourceWithTranslation =
                        ConverterEntities.ConvertToSourceWithTranslation(comparisonInfo.st.Id,
                                                                         comparisonInfo.st.Image,
                                                                         comparisonInfo.s1.LanguageId,
                                                                         comparisonInfo.s1,
                                                                         comparisonInfo.s2);
                    sourceWithTranslation.IsCurrent = false;
                    var example = new ComparisonRuleExampleForUser(comparisonInfo.cre, sourceWithTranslation);
                    comparisonRuleForUser.AddExample(example);
                }

                if (comparisonItemForUser != null)
                {
                    innerResult.AddItem(comparisonItemForUser);
                }

                return(innerResult);
            });

            return(result);
        }
        public ComparisonForUser GetOrCreate(ComparisonForUser comparisonForUser)
        {
            if (!comparisonForUser.IsValid())
            {
                return(null);
            }

            bool isSuccess           = true;
            ComparisonForUser result = null;

            Adapter.ActionByContext(c => {
                GroupComparison groupComparison = GetOrCreateGroupComparison(comparisonForUser, c);
                if (IdValidator.IsInvalid(groupComparison.Id))
                {
                    LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                        "ComparisonsQuery.GetOrCreate не удалось создать! Название: {0}, описание: {1}",
                        comparisonForUser.Title,
                        comparisonForUser.Description);
                    isSuccess = false;
                    return;
                }
                result = new ComparisonForUser(groupComparison);

                int orderItem = 1;
                foreach (ComparisonItemForUser comparisonItemForUser in comparisonForUser.Items)
                {
                    ComparisonItem comparisonItem = GetOrCreateComparisonItem(comparisonItemForUser, groupComparison.Id,
                                                                              orderItem++, c);
                    if (IdValidator.IsInvalid(comparisonItem.Id))
                    {
                        LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                            "ComparisonsQuery.GetOrCreate не удалось создать пункт для сравнения! " +
                            "Id сравнения: {0}, название {1}, перевод названия {2}, описание {3}",
                            groupComparison.Id, comparisonItemForUser.Title, comparisonItemForUser.TitleTranslated,
                            comparisonItemForUser.Description);
                        isSuccess = false;
                        continue;
                    }

                    var newComparisonItemForUser = new ComparisonItemForUser(comparisonItem);
                    result.AddItem(newComparisonItemForUser);

                    int orderRule = 1;
                    foreach (ComparisonRuleForUser comparisonRuleForUser in comparisonItemForUser.Rules)
                    {
                        ComparisonRule comparisonRule = GetOrCreateComparisonRule(comparisonRuleForUser,
                                                                                  comparisonItem.Id, orderRule++, c);
                        long ruleId = comparisonRule.Id;
                        if (IdValidator.IsInvalid(ruleId))
                        {
                            LoggerWrapper.LogTo(LoggerName.Errors).ErrorFormat(
                                "ComparisonsQuery.GetOrCreate не удалось создать правило для сравнения! " +
                                "Id пункта сравнения: {0}, описание {1}",
                                comparisonItem.Id, comparisonRule.Description);
                            isSuccess = false;
                            continue;
                        }

                        var newComparisonRuleForUser = new ComparisonRuleForUser(comparisonRule);
                        newComparisonItemForUser.AddRule(newComparisonRuleForUser);

                        isSuccess = EnumerableValidator.IsNotEmpty(comparisonRuleForUser.Examples) &&
                                    CreateExamples(comparisonRuleForUser.Examples, newComparisonRuleForUser, c);
                    }
                }

                if (isSuccess)
                {
                    //удалить пункты, правила, примеры, которые не были переданы в этот раз
                    DeleteOldInfos(c, result);
                }
            });
            return(isSuccess && result != null && result.IsValid() ? result : null);
        }
 /// <summary>
 /// Returns the Cosine Similarity for two Text Items
 /// </summary>
 /// <param name="item">The first item</param>
 /// <param name="ItemToCompare">The Second Item</param>
 /// <returns>The Score of the Cosine Similarity (-1 to 1) 1 being a perfect match.</returns>
 public static Double CosineCoefficient(this ComparisonItem item, ComparisonItem ItemToCompare)
 {
     return(CosineCoefficient(ComparisonGenerator(item.Attributes, ItemToCompare.Attributes)));
 }
 private bool IndexesNotVisisted(ComparisonItem first)
 {
     return(!_visitedSourceIndexes.Contains(first.SourceIndex) && !_visitedTargetIndexes.Contains(first.TargetIndex));
 }