Advertisement
raivof

WordsCombo

Aug 22nd, 2013
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict";
  2.  
  3. var WordsCombo = Class.extend(
  4. {
  5.   debug: true,
  6.   min_word_len: 4,
  7.   frag_min_len: 2,
  8.   frag_max_len: 3,
  9.   num_fragments: 12,
  10.  
  11.   all_words: null,
  12.   words_map: null,
  13.   all_fragments: null,
  14.   all_fragments_sorted: null,
  15.  
  16.   fragments: null,
  17.   matching_words: null,
  18.  
  19.   init: function(words)
  20.   {
  21.     this.all_words = words;
  22.     for (var i=0; i<this.all_words.length; i++)
  23.     {
  24.       this.all_words[i] = this.all_words[i].toLowerCase();
  25.     }
  26.   },
  27.  
  28.   findMatchingWords: function(min_count)
  29.   {
  30.     this.splitWords();
  31.     this.getRandomFragments();
  32.     this.getMatchingWordsFromFragmentsList();
  33.  
  34.     if (this.matching_words.length >= min_count) {
  35.       if (this.debug) console.log('words=', this.matching_words.length);
  36.       return;
  37.     }
  38.  
  39.     //console.log('matching_w: ', this.matching_words, this.matching_words.length);
  40.  
  41.     var t = new Date().getTime();
  42.     var n = 0;
  43.     var except_frags = [];
  44.     while (this.matching_words.length < min_count)
  45.     {
  46.       var frag_words_count = this.getFragmentsWordCount();
  47.       var except_frag = this.removeLeastUsedFragment(frag_words_count);
  48.       except_frags.push(except_frag);
  49.       this.addFragment(except_frags);
  50.  
  51.       this.getMatchingWordsFromFragmentsList();
  52.       //console.log('matching_w: ', this.matching_words, this.matching_words.length);
  53.       n++;
  54.     }
  55.  
  56.     if (this.debug) console.log('words=', this.matching_words.length, 'n=', n, 't=', ( new Date().getTime() - t ) );
  57.     if (this.debug) console.log(this.fragments, this.matching_words);
  58. //    console.log('m1=', this.matching_words.length, frag_words_count);
  59. //    console.log(this.all_fragments_sorted.length, this.fragments);
  60.   },
  61.  
  62.   addFragment: function(except_frags)
  63.   {
  64.     for (var i=0; i<this.all_fragments_sorted.length; i++)
  65.     {
  66.       var frag = this.all_fragments_sorted[i];
  67.  
  68.       if (except_frags.indexOf(frag.s) == -1 && this.fragments.indexOf(frag.s) == -1)
  69.       {
  70.         if (this.debug) console.log('+frag:', frag.s);
  71.         this.fragments.push(frag.s);
  72.         break;
  73.       }
  74.  
  75.     }
  76.     return;
  77. /*
  78.     var frag_count = this.all_fragments_sorted.length; //(this.all_fragments_sorted.length < 30) ? this.all_fragments_sorted.length : 30;
  79.  
  80.     var frag = '';
  81.     do {
  82.       frag = this.all_fragments_sorted[Math.floor(Math.random() * frag_count)];
  83.     } while (this.fragments.indexOf(frag.s) >= 0);
  84.  
  85.     if (this.debug) console.log('+frag:', frag.s);
  86.     this.fragments.push(frag.s);
  87. */
  88.   },
  89.  
  90.   removeLeastUsedFragment: function(frag_words_count)
  91.   {
  92.     var self = this;
  93.     var least_frag = null;
  94.     for (var i=0; i<frag_words_count.length; i++)
  95.     {
  96.       if (least_frag == null)
  97.         least_frag = frag_words_count[i];
  98.       else if (frag_words_count[i].count < least_frag.count)
  99.         least_frag = frag_words_count[i];
  100.  
  101.     }
  102.  
  103.     if (this.debug) console.log('-frag:', least_frag.frag);
  104.     self.fragments.splice(self.fragments.indexOf(least_frag.frag), 1);
  105.     if (least_frag.count == 0) return least_frag.frag;    // nav neviens vārds piesaistīts
  106.  
  107.  
  108.     var i = 0;
  109.     while (i < self.matching_words.length)
  110.     {
  111.       var found = false;
  112.       var w_frags = self.words_map[self.matching_words[i]];
  113.  
  114.       //console.log(self.matching_words[i], w_frags);
  115.  
  116.       if (w_frags.indexOf(least_frag.frag) >= 0)
  117.       {
  118.         if (this.debug) console.log('-word:', self.matching_words[i]);
  119.         self.matching_words.splice(i, 1);
  120.         continue;
  121.       }
  122.  
  123.       i++;
  124.     }
  125.  
  126.     return least_frag.frag;
  127.     //console.log(least_frag, self.fragments, self.matching_words.length, self.matching_words);
  128.   },
  129.  
  130.   getFragmentsWordCount: function()
  131.   {
  132.     var matching_words = this.matching_words;
  133.     var words_map = this.words_map;
  134.  
  135.     var mw_count_map = {};
  136.     for (var j=0; j<matching_words.length; j++)
  137.     {
  138.       for (var k=0; k<words_map[matching_words[j]].length; k++)
  139.       {
  140.         var frag = words_map[matching_words[j]][k];
  141.  
  142.         if (mw_count_map[frag] == null)
  143.         {
  144.           mw_count_map[frag] = {
  145.             count: 0
  146.           };
  147.         }
  148.  
  149.         mw_count_map[frag].count++;
  150.  
  151.       }
  152.     }
  153.  
  154.     for (var i=0; i<this.fragments.length; i++)
  155.     {
  156.       var frag = this.fragments[i];
  157.       if (mw_count_map[frag] == null)
  158.       {
  159.         mw_count_map[frag] = {
  160.           count: 0
  161.         };
  162.       }
  163.     }
  164.  
  165.     var frag_words_count = [];
  166.     for (var frag in mw_count_map)
  167.     {
  168.       frag_words_count.push({
  169.         frag: frag,
  170.         count: mw_count_map[frag].count
  171.       })
  172.     }
  173.  
  174.     return frag_words_count;
  175.   },
  176.  
  177.   getRandomFragments: function()
  178.   {
  179.     var words_map = this.words_map;
  180.     var real_frags = [];
  181.     var frag_count = (this.all_fragments_sorted.length < 100) ? this.all_fragments_sorted.length : 100;
  182.  
  183.     for (var i=0; i<this.num_fragments; i++)
  184.     {
  185.       var frag = '';
  186.       do {
  187.         frag = this.all_fragments_sorted[Math.floor(Math.random() * frag_count)];
  188.       } while (real_frags.indexOf(frag) >= 0);
  189.  
  190.       real_frags.push(frag.s);
  191.     }
  192.  
  193.     this.fragments = real_frags;
  194.   },
  195.  
  196.   getMatchingWordsFromFragmentsList: function()
  197.   {
  198.     var words_map = this.words_map;
  199.     var matching_words = [];
  200.  
  201.     var iter = 0;
  202.     for (var k=0; k<this.fragments.length; k++)
  203.     {
  204.       for (var j=0; j<this.all_fragments[this.fragments[k]].length; j++)
  205.       {
  206.         var word = this.all_fragments[this.fragments[k]][j];
  207.         var matches = true;
  208.         iter++;
  209.         for (var i=0; i<words_map[word].length; i++)
  210.         {
  211.           if (this.fragments.indexOf(words_map[word][i]) == -1)
  212.           {
  213.             matches = false;
  214.             break;
  215.           }
  216.         }
  217.  
  218.         if (matches && matching_words.indexOf(word) == -1)
  219.           matching_words.push(word);
  220.       }
  221.  
  222.  
  223.       //if (this.all_fragments[this.fragments[i]] > 0)
  224.     }
  225.     if (this.debug) console.log('mw=', matching_words.length, 'iter=', iter);
  226.     this.matching_words = matching_words;
  227.     return;
  228.  
  229.     var iter = 0;
  230.     for (var word in words_map)
  231.     {
  232.       iter++;
  233.       var matches = true;
  234.       for (var i=0; i<words_map[word].length; i++)
  235.       {
  236.         if (this.fragments.indexOf(words_map[word][i]) == -1)
  237.         {
  238.           matches = false;
  239.           break;
  240.         }
  241.       }
  242.  
  243.       if (matches)
  244.         matching_words.push(word);
  245.  
  246.     }
  247.  
  248.     console.log('mw=', matching_words.length, 'iter=', iter);
  249.     this.matching_words = matching_words;
  250.   },
  251.  
  252.   splitWords: function()
  253.   {
  254.     this.words_map = {};
  255.     this.all_fragments = {};
  256.  
  257.     var words_map = this.words_map;
  258.     var fragments = this.all_fragments;
  259.  
  260.     var num_words = 0;
  261.  
  262.     var words = this.all_words;
  263.     for (var i=0; i<words.length; i++)
  264.     {
  265.       if (words[i].length < this.min_word_len) continue;
  266.  
  267.       var len = this.frag_min_len + Math.floor(Math.random() * (1 + this.frag_max_len - this.frag_min_len));
  268.  
  269.       var word = words[i];
  270.       var parts = [];
  271.       while (word.length > len)
  272.       {
  273.         var part = word.substr(0, len);
  274.         if (parts.indexOf(part) == -1)
  275.           parts.push(part);
  276.  
  277.         word = word.substr(len);
  278.       }
  279.  
  280.       if (parts.indexOf(word) == -1)
  281.         parts.push(word);
  282.  
  283.  
  284.       var skip = false;
  285.       for (var j=0; j<parts.length; j++)
  286.       {
  287.         if (parts[j].length < this.frag_min_len)
  288.         {
  289.           skip = true;
  290.           break;
  291.         }
  292.       }
  293.       if (skip) continue;
  294.  
  295.       num_words++;
  296.  
  297.       if (!words_map[words[i]]) {
  298.         words_map[words[i]] = parts;
  299.       }
  300.  
  301.       for (var j=0; j<parts.length; j++)
  302.       {
  303.         if (fragments[parts[j]] == null)
  304.           fragments[parts[j]] = [];
  305.  
  306.         fragments[parts[j]].push(words[i]);
  307.       }
  308.  
  309.     }
  310.  
  311.     var frag_list = [];
  312.     this.all_fragments_sorted = frag_list;
  313.  
  314.     for (var k in this.all_fragments)
  315.     {
  316.       frag_list.push({
  317.         s: k,
  318.         count: this.all_fragments[k]
  319.       });
  320.     }
  321.  
  322.     frag_list.sort(function(a, b)
  323.     {
  324.       return b.count - a.count;
  325.     });
  326.  
  327.     if (this.debug) console.log('num_words: ', num_words);
  328.   }
  329.  
  330.  
  331.  
  332.  
  333. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement