Changeset 1476


Ignore:
Timestamp:
May 25, 2010, 1:37:42 PM (12 years ago)
Author:
malischewski
Message:

fitness weight table implemented

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/CostFunction/CostFunction.cs

    r1426 r1476  
    5050        private IDictionary<string, double[]> corpusTrigrams;
    5151
     52        //Fitness Weight Tables for Weighted Bigrams/Trigrams
     53        private IDictionary<string, double> fwtMatthews = new Dictionary<string,double>();
     54        private IDictionary<string, double> fwtAndrewJohnClark = new Dictionary<string,double>();
     55        private IDictionary<string, double> fwtToemehArumugam = new Dictionary<string,double>();
     56
     57        private double betaMatthews = 1.0;
     58        private double gammaMatthews = 1.0;
     59
     60        private double betaToemehArumugam = 1.0;
     61        private double gammaToemehArumugam = 1.0;
     62
    5263        private DataManager dataMgr = new DataManager(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
    5364        private const string DATATYPE = "transposition";
     
    197208
    198209                    case 2: // Log 2 Bigrams
    199                         this.Value = calculateNGrams(bigramInput, 2, 2);
     210                        this.Value = calculateNGrams(bigramInput, 2, 2,false);
    200211                        break;
    201212
    202213                    case 3: // sinkov Bigrams
    203                         this.Value = calculateNGrams(bigramInput, 2, 3);
     214                        this.Value = calculateNGrams(bigramInput, 2, 3,false);
    204215                        break;
    205216                    case 4: //percentaged Bigrams
    206                         this.Value = calculateNGrams(bigramInput, 2, 1);
     217                        this.Value = calculateNGrams(bigramInput, 2, 1,false);
    207218                        break;
    208219                    case 5: //regular expressions
     
    283294        #region private methods
    284295
     296        private void fillfwts() {
     297            fwtMatthews.Add("TH", 2.0);
     298            fwtMatthews.Add("HE", 1.0);
     299            fwtMatthews.Add("IN", 1.0);
     300            fwtMatthews.Add("ER", 1.0);
     301            fwtMatthews.Add("AN", 1.0);
     302            fwtMatthews.Add("ED", 1.0);
     303            fwtMatthews.Add("THE", 5.0);
     304            fwtMatthews.Add("ING", 5.0);
     305            fwtMatthews.Add("AND", 5.0);
     306            fwtMatthews.Add("EEE", -5.0);
     307
     308            fwtToemehArumugam.Add("EEE", -5.0);
     309            fwtToemehArumugam.Add("E ", 2.0);
     310            fwtToemehArumugam.Add(" T", 1.0);
     311            fwtToemehArumugam.Add("HE", 1.0);
     312            fwtToemehArumugam.Add("TH", 1.0);
     313            fwtToemehArumugam.Add(" A", 1.0);
     314            fwtToemehArumugam.Add("   ", -10.0);
     315            fwtToemehArumugam.Add("ING", 5.0);
     316            fwtToemehArumugam.Add("S ", 1.0);
     317            fwtToemehArumugam.Add("  ", -6.0);
     318            fwtToemehArumugam.Add(" TH", 5.0);
     319            fwtToemehArumugam.Add("THE", 5.0);
     320            fwtToemehArumugam.Add("HE ", 5.0);
     321            fwtToemehArumugam.Add("AND", 5.0);
     322
     323            fwtToemehArumugam.Add("ARE", 5.0);
     324            fwtToemehArumugam.Add("NOT", 5.0);
     325        }
     326
     327        private void weights(string ngram, int ngramlength)
     328        {
     329            if (fwtMatthews.TryGetValue(ngram, out value) && ngramlength == 2)
     330            {
     331                betaMatthews += value;
     332            }
     333
     334            if (fwtMatthews.TryGetValue(ngram, out value) && ngramlength == 3)
     335            {
     336                gammaMatthews += value;
     337            }
     338
     339
     340            if (fwtToemehArumugam.TryGetValue(ngram, out value) && ngramlength == 2)
     341            {
     342                betaToemehArumugam += value;
     343            }
     344
     345            if (fwtToemehArumugam.TryGetValue(ngram, out value) && ngramlength == 3)
     346            {
     347                gammaToemehArumugam += value;
     348            }
     349        }
    285350
    286351        //public double contains(string input)
     
    301366        {
    302367
     368         
    303369
    304370            this.statistics = new Dictionary<int, IDictionary<string, double[]>>();
    305            
     371
     372            if (fwtMatthews == null && fwtToemehArumugam == null) { fillfwts(); }
    306373            if (corpusBigrams == null)
    307374            {
     
    316383            input = input.ToUpper();
    317384
    318             /* debug foreach (KeyValuePair<string,double[]> g in corpusTrigrams)
    319              {
    320                  GuiLogMessage(corpusTrigrams[g.Key][0].ToString()+ " "+g.Key, NotificationLevel.Debug);
    321              } */
    322 
    323 
     385            double bigramscore = calculateNGrams(input, 2, 0, true);
     386           // double trigramscore = calculateNGrams(input, 3, 0, true);
     387
     388            return -1.0*betaToemehArumugam * bigramscore;
     389
     390            /*
    324391            Dictionary<string, double> inputBiGrams = new Dictionary<string,double>();
    325392            Dictionary<string, double> inputTriGrams = new Dictionary<string,double>();
    326 
     393           
    327394            // Count input Bigrams
    328395            foreach (string g in GramTokenizer.tokenize(input, 2, false))
     
    331398                {
    332399                    inputBiGrams[g] = inputBiGrams[g] + 1;
     400                    if (fwtMatthews.TryGetValue(g, out value))
     401                    {
     402                        beta += value;
     403                    }
    333404                }
    334405                else
    335406                {
    336407                    inputBiGrams.Add(g, 0);
    337                 }
    338             }
    339             /*debug
     408                    if (fwtMatthews.TryGetValue(g, out value))
     409                    {
     410                        beta += value;
     411                    }
     412                }
     413            }
     414           
     415             debug
    340416            foreach (KeyValuePair<string, double[]> g in corpusBigrams)
    341417            {
    342418                GuiLogMessage(corpusBigrams[g.Key][0].ToString() + " " + g.Key + " " + corpusBigrams[g.Key][1].ToString(), NotificationLevel.Debug);
    343             } */
     419            }
    344420           
    345421            // Count input TriGrams
     
    355431                }
    356432            }
    357 
     433           
    358434            //Union Bigrams
    359435            HashSet<string> allBigrams = new HashSet<string>(inputBiGrams.Keys);
     
    365441
    366442            // Sum of all input Bigrams absolutes
    367             double sumBigrams = inputBiGrams.Values.Sum();
     443            double sumBigrams = 0.0;
    368444
    369445            // Sum of all input Trigrams absolutes
    370             double sumTrigrams = inputTriGrams.Values.Sum();
     446            double sumTrigrams = 0.0;
    371447
    372448            // First part of the equation: Sum up all [K_b (i,j) - D_b (i,j)]
     
    376452                if (corpusBigrams.ContainsKey(g) && inputBiGrams.ContainsKey(g))
    377453                {
     454                    sumBigrams++;
    378455                    bigramscore += corpusBigrams[g][1] - inputBiGrams[g] / sumBigrams;
     456                   
    379457                }
    380458                else if (!corpusBigrams.ContainsKey(g))
    381459                {
     460                    sumBigrams++;
    382461                    bigramscore += 0.0 - inputBiGrams[g] / sumBigrams;
     462                   
    383463                }
    384464                else if (!inputBiGrams.ContainsKey(g))
    385465                {
     466                    sumBigrams++;
    386467                    bigramscore += corpusBigrams[g][1];
     468                   
    387469                }
    388470            }
     
    394476                if (corpusTrigrams.ContainsKey(g) && inputTriGrams.ContainsKey(g))
    395477                {
     478                    sumTrigrams++;
    396479                    Trigramscore += corpusTrigrams[g][1] - inputTriGrams[g] / sumTrigrams;
    397480                }
    398481                else if (!corpusTrigrams.ContainsKey(g))
    399482                {
     483                    sumTrigrams++;
    400484                    Trigramscore += 0.0 - inputTriGrams[g] / sumTrigrams;
    401485                }
    402486                else if (!inputTriGrams.ContainsKey(g))
    403487                {
     488                    sumTrigrams++;
    404489                    Trigramscore += corpusTrigrams[g][1];
    405490                }
    406491            }
    407 
    408             return 10*bigramscore+10*Trigramscore;
     492            double total = beta * bigramscore + gamma * Trigramscore;
     493            if (total != 0.0)
     494            {
     495                GuiLogMessage(total.ToString(), NotificationLevel.Debug);
     496            }
     497            return total;
     498            */
    409499        }//end Execute
    410500
     
    569659        /// <param name="length">n-gram length</param>
    570660        /// <returns>The trigram score result</returns>
    571         public double calculateNGrams(string input, int length, int valueSelection)
     661        public double calculateNGrams(string input, int length, int valueSelection, bool weighted)
    572662        {
    573663            this.statistics = new Dictionary<int, IDictionary<string, double[]>>();
    574664            double score = 0;
    575             if (corpusGrams == null)
    576             { corpusGrams = GetStatistics(length); }
     665            if (corpusBigrams == null && length == 2)
     666            { corpusBigrams = GetStatistics(length); }
     667
     668            if (corpusTrigrams == null && length == 3)
     669            { corpusTrigrams = GetStatistics(length); }
    577670            input = input.ToUpper();
    578671            // FIXME: case handling?
     
    585678                if (inputGrams.Add(g))
    586679                {
    587                     if (corpusGrams.ContainsKey(g))
     680                    if (corpusBigrams.ContainsKey(g) && length == 2 )
    588681                    {
    589                         score += corpusGrams[g][valueSelection];
    590 
     682                        score += corpusBigrams[g][valueSelection];
     683                        if (weighted) { weights(g, 2); }
     684                    }
     685                    if (corpusTrigrams.ContainsKey(g) && length == 3)
     686                    {
     687                        score += corpusTrigrams[g][valueSelection];
     688                        if (weighted) { weights(g, 3); }
    591689                    }
    592690                }
     
    794892                    return plugin.calculateEntropy(text, bytesToUse);
    795893                case 2: // Bigrams: log 2
    796                     return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 2);
     894                    return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 2, false);
    797895                case 3: // Bigrams: Sinkov
    798                     return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 3);
     896                    return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 3, false);
    799897                case 4: // Bigrams: Percentaged
    800                     return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 1);
     898                    return plugin.calculateNGrams(plugin.ByteArrayToString(text), 2, 1, false);
    801899                case 5: // regular expression
    802900                    return plugin.regex(plugin.ByteArrayToString(text));
Note: See TracChangeset for help on using the changeset viewer.