示例#1
0
        public void TestGetTestData()
        {
            var testInput  = "drink^juice|apple,eat^apple|orange,drink^juice|rice,drink^milk|juice,drink^rice|milk,drink^milk|water,orange^apple|juice,apple^drink|juice,rice^drink|milk,milk^water|drink,water^juice|drink,juice^water|drink";
            var testResult = Word2VecTestClass.GetTestDataTriple(testInput);

            Assert.AreNotEqual(0, testResult.Count);
            var expected = new List <string[]>
            {
                new [] { "apple", "drink", "juice" },
                new [] { "orange", "eat", "apple" },
                new [] { "rice", "drink", "juice" },
                new [] { "juice", "drink", "milk" },
                new [] { "milk", "drink", "rice" },
                new [] { "water", "drink", "milk" },
                new [] { "juice", "orange", "apple" },
                new [] { "juice", "apple", "drink" },
                new [] { "milk", "rice", "drink" },
                new [] { "drink", "milk", "water" },
                new [] { "drink", "water", "juice" },
                new [] { "drink", "juice", "water" }
            };

            for (var i = 0; i < testResult.Count; i++)
            {
                var ex = expected[i];
                var tr = testResult[i];
                Assert.AreEqual(ex[0], tr.Item1);
                Assert.AreEqual(ex[1], tr.Item2);
                Assert.AreEqual(ex[2], tr.Item3);
            }
        }
示例#2
0
        public void TestFeedFowardCbow()
        {
            var testSubject = Word2VecTestClass.GetFruitAndJuiceCbowPreset();
            var nextWord    = testSubject.ReadNextWord();

            Console.WriteLine($"Target Word: {nextWord.TargetWord.Word}");
            Console.WriteLine("ContextWords:");
            foreach (var f in nextWord.ContextWords)
            {
                Console.WriteLine(f.Word);
            }
            var testResult = testSubject.FeedFoward(nextWord);

            Console.WriteLine(testResult.Print());

            var expect = new[]
            {
                0.12369933153402476,
                0.12534084483955113,
                0.12465557473825152,
                0.12537247712099528,
                0.12502507795456907,
                0.1248127122711621,
                0.12537976081050728,
                0.1257142207309389,
            };

            for (var i = 0; i < expect.Length; i++)
            {
                var tr = testResult[0, i];
                var ex = expect[i];
                Assert.IsTrue(System.Math.Abs(tr - ex) < 0.000001);
            }
        }
示例#3
0
        public void TestBackpropagateSkipGram()
        {
            var WI = new[, ] {
                { 0.0368690499741906, 0.0135390551358178, -0.0377502766147956, 0.0336466886725494, -0.0270974517460435 },
                { 0.016440156808328, 0.0169175251931499, 0.0922190173492855, -0.031504701977365, -0.0114259869379112 },
                { -0.0127991043556477, 0.0487416296958652, -0.0701314578625054, -0.0536020711779604, -0.0154984786713023 },
                { 0.0657846277420338, 0.00954156336818894, -0.0136355384782122, -0.0162582306732695, 0.0366232909898382 },
                { 0.0211230152850612, 0.0597162170148065, 0.057514813056921, -0.0456053966403033, 0.0368811796125402 },
                { 0.0958493649940236, -0.0770609196168654, -0.0213859166583912, -0.0380667455206005, -0.059526237547177 },
                { 0.0255941354323151, -0.0347667583891967, 0.0813340035180254, -0.0742663991517696, 0.064415111748695 },
                { -0.09638258432801, 0.0478759082722831, -0.00176863414317772, 0.0383402774754634, -0.048905799700369 }
            };

            var WO = new[, ] {
                { -0.0702967214259769, 0.0859662250550306, -0.0469181300825058, 0.0750174499931826, -0.0862165990221391, -0.025250033999444, 0.0277256570419882, 0.0687815535668198 },
                { -0.0643791042102404, -0.0336792340193313, -0.0982879727139547, 0.011368115391288, 0.0984938144676824, 0.0220246880883466, -0.00235211108920729, 0.021364244130144 },
                { -0.0938820250303866, 0.0536523073695844, 0.015810846870677, 0.0204317684846147, 0.0960061897505104, 0.0433280812312514, 0.0465293434199548, 0.0599207696318258 },
                { 0.0455908204175489, 0.0266330542632533, 0.0242098380458587, -0.0212760037375968, 0.0244631621634882, 0.0349988715420472, -0.0567920621283315, -0.0829100279057911 },
                { -0.0940704868147478, -0.0859107999996798, 0.093844279644007, -0.0646651228725282, 0.000752150221146719, -0.0685755731391607, -0.0400362076889892, -0.0787345594627478 }
            };

            var oneHot = new double[, ] {
                { 1, 0, 0, 0, 0, 0, 0, 0 }
            };
            var expectedOutput = new double[, ] {
                { 0, 1, 0, 1, 0, 0, 0, 0 }
            };
            var actualOutput = oneHot.DotProduct(WI).DotProduct(WO).GetSoftmax();

            var testSubject = Word2VecTestClass.GetFruitAndJuiceCbowPreset();

            testSubject.WI = WI;
            testSubject.WO = WO;
            testSubject.Backpropagate(oneHot, actualOutput, expectedOutput);

            var expectedWI = new[, ]
            {
                { 0.06832391877374158, 0.0102198806703854, -0.02896077629135472, 0.03484245859783144, -0.048742468748119175 },
                { 0.016440156808328, 0.0169175251931499, 0.0922190173492855, -0.031504701977365, -0.0114259869379112 },
                { -0.0127991043556477, 0.0487416296958652, -0.0701314578625054, -0.0536020711779604, -0.0154984786713023 },
                { 0.0657846277420338, 0.00954156336818894, -0.0136355384782122, -0.0162582306732695, 0.0366232909898382 },
                { 0.0211230152850612, 0.0597162170148065, 0.057514813056921, -0.0456053966403033, 0.0368811796125402 },
                { 0.0958493649940236, -0.0770609196168654, -0.0213859166583912, -0.0380667455206005, -0.059526237547177 },
                { 0.0255941354323151, -0.0347667583891967, 0.0813340035180254, -0.0742663991517696, 0.064415111748695 },
                { -0.09638258432801, 0.0478759082722831, -0.00176863414317772, 0.0383402774754634, -0.048905799700369 },
            };

            var expectedWO = new[, ] {
                { -0.0712222542811498, 0.0924147349563861, -0.0478348666338179, 0.0814666326878734, -0.0871339949705385, -0.0261724288026183, 0.0268054360904665, 0.067859952075192 },
                { -0.0647189784506933, -0.0313112117578562, -0.0986246167750825, 0.0137363847159791, 0.0981569282627097, 0.0216859662035703, -0.00269003469202615, 0.0210258135652898 },
                { -0.092934370525502, 0.0470496682264595, 0.0167494948265954, 0.0138284404673656, 0.0969455128641142, 0.0442725226798988, 0.0474715590585729, 0.0608643988075684 },
                { 0.0447461792929195, 0.0325179632914124, 0.0233732244266215, -0.0153904807183556, 0.0236259467785824, 0.0341570942031326, -0.0576318556106014, -0.0837510812687247 },
                { -0.0933902528000395, -0.0906502274058155, 0.0945180486855311, -0.0694050447580429, 0.00142640389627994, -0.0678976454820252, -0.0393598777361693, -0.0780572148616271 }
            };

            Assert.IsTrue(MatrixOps.AreEqual(testSubject.WI, expectedWI));
            Assert.IsTrue(MatrixOps.AreEqual(testSubject.WO, expectedWO));
        }
示例#4
0
        internal static Word2VecTestClass InitTestClassVectors(Word2VecTestClass testSubject)
        {
            testSubject.WI = new[, ] {
                { 0.0368690499741906, 0.0135390551358178, -0.0377502766147956, 0.0336466886725494, -0.0270974517460435 },
                { 0.016440156808328, 0.0169175251931499, 0.0922190173492855, -0.031504701977365, -0.0114259869379112 },
                { -0.0127991043556477, 0.0487416296958652, -0.0701314578625054, -0.0536020711779604, -0.0154984786713023 },
                { 0.0657846277420338, 0.00954156336818894, -0.0136355384782122, -0.0162582306732695, 0.0366232909898382 },
                { 0.0211230152850612, 0.0597162170148065, 0.057514813056921, -0.0456053966403033, 0.0368811796125402 },
                { 0.0958493649940236, -0.0770609196168654, -0.0213859166583912, -0.0380667455206005, -0.059526237547177 },
                { 0.0255941354323151, -0.0347667583891967, 0.0813340035180254, -0.0742663991517696, 0.064415111748695 },
                { -0.09638258432801, 0.0478759082722831, -0.00176863414317772, 0.0383402774754634, -0.048905799700369 }
            };

            testSubject.WO = new[, ] {
                { -0.0702967214259769, 0.0859662250550306, -0.0469181300825058, 0.0750174499931826, -0.0862165990221391, -0.025250033999444, 0.0277256570419882, 0.0687815535668198 },
                { -0.0643791042102404, -0.0336792340193313, -0.0982879727139547, 0.011368115391288, 0.0984938144676824, 0.0220246880883466, -0.00235211108920729, 0.021364244130144 },
                { -0.0938820250303866, 0.0536523073695844, 0.015810846870677, 0.0204317684846147, 0.0960061897505104, 0.0433280812312514, 0.0465293434199548, 0.0599207696318258 },
                { 0.0455908204175489, 0.0266330542632533, 0.0242098380458587, -0.0212760037375968, 0.0244631621634882, 0.0349988715420472, -0.0567920621283315, -0.0829100279057911 },
                { -0.0940704868147478, -0.0859107999996798, 0.093844279644007, -0.0646651228725282, 0.000752150221146719, -0.0685755731391607, -0.0400362076889892, -0.0787345594627478 }
            };

            testSubject.Vocab.GetNodeByWord("apple").Index  = 0;
            testSubject.Vocab.GetNodeByWord("drink").Index  = 1;
            testSubject.Vocab.GetNodeByWord("eat").Index    = 2;
            testSubject.Vocab.GetNodeByWord("juice").Index  = 3;
            testSubject.Vocab.GetNodeByWord("milk").Index   = 4;
            testSubject.Vocab.GetNodeByWord("orange").Index = 5;
            testSubject.Vocab.GetNodeByWord("rice").Index   = 6;
            testSubject.Vocab.GetNodeByWord("water").Index  = 7;
            return(testSubject);

            /* //javascript arrays
             *
             * var wi = [
             * [0.0368690499741906,0.0135390551358178,-0.0377502766147956,0.0336466886725494,-0.0270974517460435],
             * [0.016440156808328,0.0169175251931499,0.0922190173492855,-0.031504701977365,-0.0114259869379112],
             * [-0.0127991043556477,0.0487416296958652,-0.0701314578625054,-0.0536020711779604,-0.0154984786713023],
             * [0.0657846277420338,0.00954156336818894,-0.0136355384782122,-0.0162582306732695,0.0366232909898382],
             * [0.0211230152850612,0.0597162170148065,0.057514813056921,-0.0456053966403033,0.0368811796125402],
             * [0.0958493649940236,-0.0770609196168654,-0.0213859166583912,-0.0380667455206005,-0.059526237547177],
             * [0.0255941354323151,-0.0347667583891967,0.0813340035180254,-0.0742663991517696,0.064415111748695],
             * [-0.09638258432801,0.0478759082722831,-0.00176863414317772,0.0383402774754634,-0.048905799700369]
             * ];
             *
             * var wo =  [
             * [-0.0702967214259769,0.0859662250550306,-0.0469181300825058,0.0750174499931826,-0.0862165990221391,-0.025250033999444,0.0277256570419882,0.0687815535668198],
             * [-0.0643791042102404,-0.0336792340193313,-0.0982879727139547,0.011368115391288,0.0984938144676824,0.0220246880883466,-0.00235211108920729,0.021364244130144],
             * [-0.0938820250303866,0.0536523073695844,0.015810846870677,0.0204317684846147,0.0960061897505104,0.0433280812312514,0.0465293434199548,0.0599207696318258],
             * [0.0455908204175489,0.0266330542632533,0.0242098380458587,-0.0212760037375968,0.0244631621634882,0.0349988715420472,-0.0567920621283315,-0.0829100279057911],
             * [-0.0940704868147478,-0.0859107999996798,0.093844279644007,-0.0646651228725282,0.000752150221146719,-0.0685755731391607,-0.0400362076889892,-0.0787345594627478]
             * ];
             *
             */
        }
示例#5
0
        public void TestGetTestDataVocab()
        {
            var testInput  = "drink^juice|apple,eat^apple|orange,drink^juice|rice,drink^milk|juice,drink^rice|milk,drink^milk|water,orange^apple|juice,apple^drink|juice,rice^drink|milk,milk^water|drink,water^juice|drink,juice^water|drink";
            var testInter  = Word2VecTestClass.GetTestDataTriple(testInput);
            var testResult = Word2VecTestClass.GetTestDataVocabTriple(testInter);

            Assert.IsNotNull(testResult);
            foreach (var t in testResult)
            {
                Console.WriteLine(String.Join(", ", t.Key, t.Value));
            }
        }
示例#6
0
        public static Word2VecTestClass GetFruitAndJuiceCbowPreset()
        {
            var testInput =
                "drink^juice|apple,eat^apple|orange,drink^juice|rice,drink^milk|juice,drink^rice|milk,drink^milk|water,orange^apple|juice,apple^drink|juice,rice^drink|milk,milk^water|drink,water^juice|drink,juice^water|drink";
            var testSubject = new Word2VecTestClass
            {
                Size         = 5,
                Sample       = 0,
                LearningRate = 0.2D,
                IsCbow       = true,
                IsDebugMode  = true
            };

            testSubject.InitTest(testInput);

            return(InitTestClassVectors(testSubject));
        }
示例#7
0
        public void TestInitTest()
        {
            var testInput   = "drink^juice|apple,eat^apple|orange,drink^juice|rice,drink^milk|juice,drink^rice|milk,drink^milk|water,orange^apple|juice,apple^drink|juice,rice^drink|milk,milk^water|drink,water^juice|drink,juice^water|drink";
            var testSubject = new Word2VecTestClass();

            testSubject.InitTest(testInput);
            //"apple", "drink", "juice"
            var testResult = testSubject.ReadNextWord();

            Assert.IsNotNull(testResult);
            Assert.IsNotNull(testResult.TargetWord);
            Assert.IsNotNull(testResult.ContextWords);
            Assert.AreEqual(2, testResult.ContextWords.Count);
            Assert.AreEqual("apple", testResult.TargetWord.Word);
            Assert.IsTrue(testResult.ContextWords.Any(v => v.Word == "drink"));
            Assert.IsTrue(testResult.ContextWords.Any(v => v.Word == "juice"));
        }
示例#8
0
        public void TestFeedFowardSkipGram()
        {
            var testSubject = Word2VecTestClass.GetFruitAndJuiceCbowPreset();

            testSubject.IsCbow = false;
            var nextWord = testSubject.ReadNextWord();

            Console.WriteLine($"Target Word: {nextWord.TargetWord.Word}");
            Console.WriteLine("ContextWords:");
            foreach (var f in nextWord.ContextWords)
            {
                Console.WriteLine(f.Word);
            }

            var testResult = testSubject.FeedFoward(nextWord);

            Console.WriteLine(testResult.Print());
            var expect = new[]
            {
                0.12551623323909344,
                0.12548466723855337,
                0.12432332158733014,
                0.12539342630127645,
                0.12441274579106223,
                0.12509066599491453,
                0.12479585887972285,
                0.12498308096804703,
            };

            for (var i = 0; i < expect.Length; i++)
            {
                var tr = testResult[0, i];
                var ex = expect[i];
                Assert.IsTrue(System.Math.Abs(tr - ex) < 0.000001);
            }
        }
示例#9
0
        public void TestFeedFoward()
        {
            var testSubject = Word2VecTestClass.GetFruitAndJuicePreset();

            var initVector = new double[1, testSubject.WI.CountOfRows()];
            var testResult = testSubject.FeedFoward(null, initVector);

            var nextWord = testSubject.ReadNextWord();

            Console.WriteLine(nextWord.TargetWord.Word);
            foreach (var f in nextWord.ContextWords)
            {
                Console.WriteLine(f.Word);
            }

            testResult = testSubject.FeedFoward(nextWord);
            Console.WriteLine(testResult.Print());
            var expect = new[]
            {
                0.12564016936189557,
                0.12439491130889098,
                0.12421460746660097,
                0.12525675156413787,
                0.12494957008987123,
                0.12491166410164599,
                0.1252102034070606,
                0.12542212269989678
            };

            for (var i = 0; i < expect.Length; i++)
            {
                var tr = testResult[0, i];
                var ex = expect[i];
                Assert.IsTrue(System.Math.Abs(tr - ex) < 0.000001);
            }
        }