예제 #1
0
        private static void BuyOnlineCount()
        {
            string dir = Global.MainDirName + @"\answers";

            if (Directory.Exists(dir) == false)
            {
                Directory.CreateDirectory(dir);
            }

            string filename  = dir + @"\{0}.csv";
            string totalFile = dir + @"\count.csv";

            Console.WriteLine("本程序用来自动提取标准答案");
            Console.WriteLine("将输出至:{0}", dir);
            Console.WriteLine("正在尝试读取数据库...");
            using (AliRecommend2DataEntities db = new AliRecommend2DataEntities())
            {
                var           itemids   = db.T_Item.Select(d => d.itemid).Distinct();
                HashSet <int> itemIdSet = new HashSet <int>();
                foreach (var id in itemids)
                {
                    itemIdSet.Add(id);
                }
                Console.WriteLine("o2o数据集读取成功");

                DateTime firstDate = db.T_UserAction.Min(d => d.actiondate).Date;
                DateTime lastDate  = db.T_UserAction.Max(d => d.actiondate).Date;

                StreamWriter totalWriter = new StreamWriter(totalFile);
                totalWriter.WriteLine("date,count");
                for (DateTime date = firstDate; date <= lastDate; date = date.AddDays(1))
                {
                    DateTime tommorrow = date.AddDays(1);
                    Console.WriteLine("---------------------");
                    Console.WriteLine("正在获取{0}的购买记录。", date.ToString("yyyyMMdd"));
                    var data  = db.T_UserAction.Where(d => d.behaviortype == 4).Where(d => d.actiondate >= date && d.actiondate < tommorrow).Select(d => new { d.userid, d.itemid }).Distinct();
                    var items = data.ToList();
                    Console.WriteLine("正在输出...");
                    int count = 0;
                    using (StreamWriter writer = new StreamWriter(String.Format(filename, date.ToString("yyyyMMdd"))))
                    {
                        writer.WriteLine("userid,itemid");
                        foreach (var item in items)
                        {
                            if (itemIdSet.Contains(item.itemid) == false)
                            {
                                continue;
                            }
                            writer.WriteLine("{0},{1}", item.userid, item.itemid);
                            count++;
                        }
                    }
                    totalWriter.WriteLine("{0},{1}", date.ToString("yyyyMMdd"), count);
                    Console.WriteLine("{0}输出完毕.", date.ToString("yyyyMMdd"));
                }
                totalWriter.Close();
                Console.WriteLine("BuyOnlineCount 所有数据输出完毕.");
            }
        }
        public void Run()
        {
            using (AliRecommend2DataEntities db = new AliRecommend2DataEntities())
            {
                ((IObjectContextAdapter)db).ObjectContext.CommandTimeout = 600;
                long startTime = DateTime.Now.Ticks;
                var  data      = db.T_UserAction.Where(d => d.actiondate >= StartDate && d.actiondate < PredictDate).ToList();
                Console.WriteLine("数据库数据读取完毕,正在进行处理中...");
                FeatureCollection features = new FeatureCollection();

                features.UpdateOnlineItemSet(db);
                Console.WriteLine("正在读取正例数据...");
                features.UpdatePositiveSet(db, PredictDate);

                var categories = data.GroupBy(d => d.category);
                Console.WriteLine("正在添加类别特征...");
                foreach (var categoryData in categories)
                {
                    CategoryFeature categoryFeature = new CategoryFeature(categoryData.Key, PredictDate);
                    categoryFeature.Update(categoryData);
                    features.AddCategoryFeature(categoryFeature);
                }


                var items = data.GroupBy(d => d.itemid);
                Console.WriteLine("正在添加商品特征...");
                //按商品分组,itemData是每个商品的所有记录
                foreach (var itemData in items)
                {
                    ItemFeature itemFeature = new ItemFeature(itemData.Key, PredictDate);
                    itemFeature.Update(itemData);
                    itemFeature.IsOnline = features.CheckIsOnline(itemFeature.Id);
                    //向ItemFeature绑定CategoryFeature
                    itemFeature.CategoryFeature = features.CategoryFeatureDict[itemFeature.CategoryId];
                    features.AddItemFeature(itemFeature);
                }

                var users = data.GroupBy(d => d.userid);
                Console.WriteLine("正在添加用户相关特征...");
                foreach (var userData in users)
                {
                    UserFeature userFeature = new UserFeature(userData.Key, PredictDate);
                    userFeature.Update(userData);
                    features.AddUserFeature(userFeature);

                    var userCategories = userData.GroupBy(d => d.category);
                    foreach (var userCategoryData in userCategories)
                    {
                        UserCategoryFeature userCategoryFeature = new UserCategoryFeature(userCategoryData.Key, PredictDate);
                        userCategoryFeature.Update(userCategoryData);
                        userFeature.UserCategorieDict.Add(userCategoryFeature.CategoryId, userCategoryFeature);
                        features.AddUserCategoryFeature(userCategoryFeature);
                    }

                    var userItems = userData.GroupBy(d => d.itemid);
                    foreach (var userItemData in userItems)
                    {
                        UserItemFeature userItemFeature = new UserItemFeature(userFeature, userItemData.Key);
                        userItemFeature.Update(userItemData);
                        //是否是正例
                        userItemFeature.Label = features.CheckIsPositive(userItemFeature.UserId, userItemFeature.ItemId);
                        //向UserItemFeature 绑定ItemFeature
                        userItemFeature.ItemFeature = features.ItemFeatureDict[userItemFeature.ItemId];
                        //向UserItemFeature绑定UserCategoryFeature
                        userItemFeature.UserCategoryFeature = userItemFeature.UserFeature.UserCategorieDict[userItemFeature.ItemFeature.CategoryId];
                        features.AddUserItemFeature(userItemFeature);
                    }
                }
                if (Global.Normalized)
                {
                    features.Normalize();
                }
                string dirname = Global.GetDirectoryName();
                if (Directory.Exists(dirname) == false)
                {
                    Directory.CreateDirectory(dirname);
                }
                string filename = dirname + Global.GetFileName(PredictDate);
                features.Write(filename);

                Console.WriteLine("运行完毕,耗时{0}s", (DateTime.Now.Ticks - startTime) / 10000000);
                Console.WriteLine("{0} 输出完毕。", filename);
            }
            //Console.ReadKey();
        }