Changeset 1731


Ignore:
Timestamp:
Jul 6, 2010, 10:10:32 AM (11 years ago)
Author:
malischewski
Message:

Added simple CSV parser, fitness weight tables are now being loaded from csv files residing in the data directory.
User can choose which fitness weight table the costfunction uses (custom fitness weight table possible, too).

Location:
trunk/CrypPlugins/CostFunction
Files:
4 added
3 edited

Legend:

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

    r1710 r1731  
    3232namespace Cryptool.Plugins.CostFunction
    3333{
    34     [Author("Nils Kopal", "Nils.Kopal@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
     34    [Author("Nils Kopal, Simon Malischewski", "Nils.Kopal@cryptool.org , malischewski@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
    3535    [PluginInfo(false, "CostFunction", "CostFunction", null, "CostFunction/icon.png")]
    3636    public class CostFunction : IAnalysisMisc
     
    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 
     52        //Fitness Weight Table for Weighted Bigrams/Trigrams
     53        private IDictionary<string, double> fwt = new Dictionary<string, double>();
     54
     55        //Weights
     56        private double beta = 1.0;
     57        private double gamma = 1.0;
     58
     59       
    6360        private DataManager dataMgr = new DataManager(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
    6461        private const string DATATYPE = "transposition";
     
    220217                        this.Value = regex(bigramInput);
    221218                        break;
    222                     case 6: // Weighted Bigrams/Trigrams (used by genetic algorithm in transposition analyser
     219                    case 6: // Weighted Bigrams/Trigrams (used by genetic algorithm in transposition analyser)
    223220                        this.Value = calculateWeighted(bigramInput);
    224221                        break;
     
    294291        #region private methods
    295292
    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             //extension:
    308             fwtToemehArumugam.Add("YYY", -5.0);
    309             fwtToemehArumugam.Add("BBB", -5.0);
    310             fwtToemehArumugam.Add("OOO", -5.0);
    311             fwtToemehArumugam.Add("III", -5.0);
    312             fwtToemehArumugam.Add("UUU", -5.0);
    313             fwtToemehArumugam.Add("DDD", -5.0);
    314             fwtToemehArumugam.Add("JJJ", -5.0);
    315             fwtToemehArumugam.Add("QQQ", -5.0);
    316             fwtToemehArumugam.Add("VVV", -5.0);
    317             fwtToemehArumugam.Add("GGG", -5.0);
    318 
    319             fwtToemehArumugam.Add("KKK", -2.0);
    320             fwtToemehArumugam.Add("AAA", -2.0);
    321             fwtToemehArumugam.Add("CCC", -2.0);
    322             fwtToemehArumugam.Add("TTT", -2.0);
    323 
    324             fwtToemehArumugam.Add("FFF", 0.0);
    325             fwtToemehArumugam.Add("SSS", 0.0);
    326             fwtToemehArumugam.Add("HHH", -5.0);
    327             fwtToemehArumugam.Add("MMM", -5.0);
    328             fwtToemehArumugam.Add("NNN", -5.0);
    329             fwtToemehArumugam.Add("PPP", 0.0);
    330             fwtToemehArumugam.Add("RRR", -5.0);
    331             fwtToemehArumugam.Add("ZZZ", -5.0);
    332             fwtToemehArumugam.Add("XXX", 5.0);
    333             fwtToemehArumugam.Add("WWW", 5.0);
    334 
    335             fwtToemehArumugam.Add("AUI", -5.0);
    336             fwtToemehArumugam.Add("UAI", -5.0);
    337             fwtToemehArumugam.Add("IAU", -5.0);
    338             fwtToemehArumugam.Add("AIU", -5.0);
    339             fwtToemehArumugam.Add("UUU", -5.0);
    340             fwtToemehArumugam.Add("WV", -5.0);
    341             fwtToemehArumugam.Add("VW", -5.0);
    342             fwtToemehArumugam.Add("HC", -5.0);
    343             fwtToemehArumugam.Add("ZR", -5.0);
    344             fwtToemehArumugam.Add("RZ", -5.0);
    345             fwtToemehArumugam.Add("ZX", -5.0);
    346             fwtToemehArumugam.Add("XZ", -5.0);
    347             fwtToemehArumugam.Add("J ", -5.0);
    348             fwtToemehArumugam.Add("X ", -5.0);
    349             fwtToemehArumugam.Add("Q ", -5.0);
    350             fwtToemehArumugam.Add("QC", -5.0);
    351             fwtToemehArumugam.Add("QJ", -5.0);
    352             fwtToemehArumugam.Add("QW", -5.0);
    353             fwtToemehArumugam.Add("QZ", -5.0);
    354             fwtToemehArumugam.Add("QX", -5.0);
    355             fwtToemehArumugam.Add("QY", -5.0);
    356             fwtToemehArumugam.Add("QE", -5.0);
    357             fwtToemehArumugam.Add("QI", -5.0);
    358             fwtToemehArumugam.Add("QU", -5.0);
    359             fwtToemehArumugam.Add("QO", -5.0);
    360             fwtToemehArumugam.Add("JX", -5.0);
    361             fwtToemehArumugam.Add("QV", -5.0);
    362             fwtToemehArumugam.Add("ZJ", -5.0);
    363 
    364 
    365             fwtToemehArumugam.Add("EEE", -5.0);
    366             fwtToemehArumugam.Add("E ", 2.0);
    367             fwtToemehArumugam.Add(" T", 1.0);
    368             fwtToemehArumugam.Add("HE", 1.0);
    369             fwtToemehArumugam.Add("TH", 1.0);
    370             fwtToemehArumugam.Add(" A", 1.0);
    371             fwtToemehArumugam.Add("   ", -10.0);
    372             fwtToemehArumugam.Add("ING", 5.0);
    373             fwtToemehArumugam.Add("S ", 1.0);
    374             fwtToemehArumugam.Add("  ", -6.0);
    375             fwtToemehArumugam.Add(" TH", 5.0);
    376             fwtToemehArumugam.Add("THE", 5.0);
    377             fwtToemehArumugam.Add("HE ", 5.0);
    378             fwtToemehArumugam.Add("AND", 5.0);
    379 
    380             fwtToemehArumugam.Add("ARE", 5.0);
    381             fwtToemehArumugam.Add("NOT", 5.0);
     293        // Reads data directory, passes filepaths to parser
     294        private void fillfwt() {
     295             txtList = dataMgr.LoadDirectory(DATATYPE);
     296
     297
     298             switch (this.settings.weighttable)
     299             {
     300                 case 0:
     301                     parseCSV(txtList["fwtmatthews"].DataFile.FullName);
     302                     break;
     303                 case 1:
     304                     parseCSV(txtList["fwttoemeharumugam"].DataFile.FullName);
     305                     break;
     306                 case 2:
     307                     parseCSV(this.settings.customfwtpath);
     308                     break;
     309             }
     310
     311
     312             
     313        }
     314        // simple "parser" for CSV files
     315        private void parseCSV(string path)
     316        {
     317            using (StreamReader readFile = new StreamReader(path))
     318            {
     319                string line;
     320                string[] row;
     321
     322                while ((line = readFile.ReadLine()) != null)
     323                {
     324
     325                    row = line.Split(';');
     326                    if (row.Length == 2)
     327                    {
     328                        fwt.Add(row[0], Double.Parse(row[1]));
     329                    }
     330                }
     331            }
     332           
    382333        }
    383334
    384335        private void weights(string ngram, int ngramlength)
    385336        {
    386             if (fwtMatthews.TryGetValue(ngram, out value) && ngramlength == 2)
    387             {
    388                 betaMatthews += value;
    389             }
    390 
    391             if (fwtMatthews.TryGetValue(ngram, out value) && ngramlength == 3)
    392             {
    393                 gammaMatthews += value;
    394             }
    395 
    396 
    397             if (fwtToemehArumugam.TryGetValue(ngram, out value) && ngramlength == 2)
    398             {
    399                 betaToemehArumugam += value;
    400             }
    401 
    402             if (fwtToemehArumugam.TryGetValue(ngram, out value) && ngramlength == 3)
    403             {
    404                 gammaToemehArumugam += value;
    405             }
     337            if (fwt.TryGetValue(ngram, out value) && ngramlength == 2)
     338            {
     339                beta += value;
     340            }
     341
     342            if (fwt.TryGetValue(ngram, out value) && ngramlength == 3)
     343            {
     344                gamma += value;
     345            }
     346
     347
    406348        }
    407349
     
    422364        public double calculateWeighted(string input)
    423365        {
    424 
    425          
    426 
     366           
    427367            this.statistics = new Dictionary<int, IDictionary<string, double[]>>();
    428368
    429             if (fwtMatthews == null && fwtToemehArumugam == null) { fillfwts(); }
     369            if (fwt == null) { fillfwt(); }
    430370            if (corpusBigrams == null)
    431371            {
     
    442382            double bigramscore = calculateNGrams(input, 2, 3, true); // Sinkov
    443383            double trigramscore = calculateNGrams(input, 3, 3, true);
    444             //testweise
     384         
     385            return (beta * bigramscore) + (gamma * trigramscore);
    445386           
    446            // return  bigramscore + trigramscore;
    447             return (betaToemehArumugam * bigramscore) + (gammaToemehArumugam * trigramscore);
    448             //return betaToemehArumugam * bigramscore;
    449 
    450             /*
    451             Dictionary<string, double> inputBiGrams = new Dictionary<string,double>();
    452             Dictionary<string, double> inputTriGrams = new Dictionary<string,double>();
    453            
    454             // Count input Bigrams
    455             foreach (string g in GramTokenizer.tokenize(input, 2, false))
    456             {
    457                 if (inputBiGrams.ContainsKey(g))
    458                 {
    459                     inputBiGrams[g] = inputBiGrams[g] + 1;
    460                     if (fwtMatthews.TryGetValue(g, out value))
    461                     {
    462                         beta += value;
    463                     }
    464                 }
    465                 else
    466                 {
    467                     inputBiGrams.Add(g, 0);
    468                     if (fwtMatthews.TryGetValue(g, out value))
    469                     {
    470                         beta += value;
    471                     }
    472                 }
    473             }
    474            
    475              debug
    476             foreach (KeyValuePair<string, double[]> g in corpusBigrams)
    477             {
    478                 GuiLogMessage(corpusBigrams[g.Key][0].ToString() + " " + g.Key + " " + corpusBigrams[g.Key][1].ToString(), NotificationLevel.Debug);
    479             }
    480            
    481             // Count input TriGrams
    482             foreach (string g in GramTokenizer.tokenize(input, 3, false))
    483             {
    484                 if (inputTriGrams.ContainsKey(g))
    485                 {
    486                     inputTriGrams[g] = inputTriGrams[g] + 1;
    487                 }
    488                 else
    489                 {
    490                     inputTriGrams.Add(g, 0);
    491                 }
    492             }
    493            
    494             //Union Bigrams
    495             HashSet<string> allBigrams = new HashSet<string>(inputBiGrams.Keys);
    496             allBigrams.UnionWith(corpusBigrams.Keys);
    497 
    498             //Union Trigrams
    499             HashSet<string> allTrigrams = new HashSet<string>(inputTriGrams.Keys);
    500             allTrigrams.UnionWith(corpusTrigrams.Keys);
    501 
    502             // Sum of all input Bigrams absolutes
    503             double sumBigrams = 0.0;
    504 
    505             // Sum of all input Trigrams absolutes
    506             double sumTrigrams = 0.0;
    507 
    508             // First part of the equation: Sum up all [K_b (i,j) - D_b (i,j)]
    509             double bigramscore = 0.0;
    510             foreach (string g in allBigrams)
    511             {
    512                 if (corpusBigrams.ContainsKey(g) && inputBiGrams.ContainsKey(g))
    513                 {
    514                     sumBigrams++;
    515                     bigramscore += corpusBigrams[g][1] - inputBiGrams[g] / sumBigrams;
    516                    
    517                 }
    518                 else if (!corpusBigrams.ContainsKey(g))
    519                 {
    520                     sumBigrams++;
    521                     bigramscore += 0.0 - inputBiGrams[g] / sumBigrams;
    522                    
    523                 }
    524                 else if (!inputBiGrams.ContainsKey(g))
    525                 {
    526                     sumBigrams++;
    527                     bigramscore += corpusBigrams[g][1];
    528                    
    529                 }
    530             }
    531 
    532             // Second part of the equation: Sum up all [K_t (i,j) - D_t (i,j)]
    533             double Trigramscore = 0.0;
    534             foreach (string g in allTrigrams)
    535             {
    536                 if (corpusTrigrams.ContainsKey(g) && inputTriGrams.ContainsKey(g))
    537                 {
    538                     sumTrigrams++;
    539                     Trigramscore += corpusTrigrams[g][1] - inputTriGrams[g] / sumTrigrams;
    540                 }
    541                 else if (!corpusTrigrams.ContainsKey(g))
    542                 {
    543                     sumTrigrams++;
    544                     Trigramscore += 0.0 - inputTriGrams[g] / sumTrigrams;
    545                 }
    546                 else if (!inputTriGrams.ContainsKey(g))
    547                 {
    548                     sumTrigrams++;
    549                     Trigramscore += corpusTrigrams[g][1];
    550                 }
    551             }
    552             double total = beta * bigramscore + gamma * Trigramscore;
    553             if (total != 0.0)
    554             {
    555                 GuiLogMessage(total.ToString(), NotificationLevel.Debug);
    556             }
    557             return total;
    558             */
    559         }//end Execute
     387        }
    560388
    561389        public double regex(string input)
  • trunk/CrypPlugins/CostFunction/CostFunction.csproj

    r1487 r1731  
    125125  </ItemGroup>
    126126  <ItemGroup>
     127    <None Include="Data\fwtToemehArumugam">
     128      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     129    </None>
     130    <None Include="Data\fwtToemehArumugam.metainfo">
     131      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     132    </None>
     133    <None Include="Data\fwtMatthews.metainfo">
     134      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     135    </None>
    127136    <None Include="Data\StatisticsCorpusEN">
    128137      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     
    182191    </BootstrapperPackage>
    183192  </ItemGroup>
     193  <ItemGroup>
     194    <None Include="Data\fwtMatthews">
     195      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     196    </None>
     197  </ItemGroup>
    184198  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    185199  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
  • trunk/CrypPlugins/CostFunction/CostFunctionSettings.cs

    r1426 r1731  
    4242        private static string[] files;
    4343        #endregion
    44    
     44       
    4545        [TaskPane("FunctionType", "Select the type of function", null, 1, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Index of coincidence", "Entropy", "Bigrams: log 2", "Bigrams: Sinkov", "Bigrams: Percentaged", "Regular Expression", "Weighted Bigrams/Trigrams"})]
    4646        public int FunctionType
     
    110110            }
    111111        }
    112        
     112        public string customfwtpath;
     113        public int fwt = 0; //fwt = fitness weight table
     114        [TaskPane("Fitness Weight Table to use", "Select a fitness weight table", null, 8, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Matthews", "Toemeh-Arumugam", "Custom Weight table (*.csv)" })]
     115        public int weighttable
     116        {
     117            get
     118            {
     119                return fwt;
     120            }
     121            set
     122            {
     123                fwt = value;
     124                if (fwt == 2)
     125                {
     126                    OpenFileDialog openfwt = new OpenFileDialog();
     127                    openfwt.Title = "Select fitness weight table";
     128                    openfwt.CheckFileExists = true;
     129                    openfwt.CheckPathExists = true;
     130                    openfwt.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*";
     131                    if (openfwt.ShowDialog() == DialogResult.OK)
     132                    {
     133                        customfwtpath = openfwt.FileName;
     134                    }
     135                    else
     136                    {
     137                        fwt = 0; // Fall back to default
     138                    }
     139                }
     140                OnPropertyChanged("weighttable");
     141            }
     142        }
     143       
     144
    113145        public event TaskPaneAttributeChangedHandler TaskPaneAttributeChanged;
    114146
     
    134166            {
    135167                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("StatisticsCorpus", Visibility.Visible)));
    136 
     168               
    137169            }
    138170            else
     
    140172                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("StatisticsCorpus", Visibility.Collapsed)));
    141173               
     174               
     175            }
     176            if (functionType.Equals(6))
     177            {
     178                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("weighttable", Visibility.Visible)));
     179
     180            }
     181            else
     182            {
     183                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("weighttable", Visibility.Collapsed)));
     184
    142185            }
    143186           
Note: See TracChangeset for help on using the changeset viewer.