Monday, June 25, 2012

Woocommerce sidebar with Cyberchimps NeuroPro

The sidebar kept getting wrapped to the bottom, on my WooCommerce pages, when I'm using CyberChimp's Wordpress Neuro Pro theme. To fix this, I hacked out a few changes:

1. Add these lines to your custom CSS inside the Neuro Pro theme:

.storeSidebar { float: left;}
.products ul, ul.products {clear: none;}
ul.products li.first {clear: none;}


2. Edit the file "wp-content/plugins/woocommerce/templates/archive-product.php" inside your wordpress plugins directory. (And also do the same for "single-product.php" , "taxonomy-product_cat.php", and "

2.a Remove the line:

<?php do_action('woocommerce_sidebar'); ?>



2.b Above the line where the main content gets inserted (eg :

<?php woocommerce_archive_product_content(); ?>



add the lines:

<div class=storeSidebar> 
<?php do_action('woocommerce_sidebar'); ?> 
</div>


That should do it! Well, the sidebar is forced to be on the left (can't be switched to the right), but that's what I wanted in the first place, so that's good enough for me at the moment.

Thursday, April 26, 2012

Stemming, Stopword Removal, Tokenizing

A couple of classes to do tokenizing, stopword removal, and stemming on Strings in java.

Stemmer.java was taken almost COMPLETELY from tartarus.org's PorterStemmer. I only added some functionality so it can be passed entire words, instead of character by character. It can be used by passing it a single word, and it returns the stemmed version. eg:

String word = "running";
String stemmedWord = Stemmer.stem(word);

The overall class is Split.java. This one can take entire sentences or paragraphs and tokenize, remove stopwords, and use the stemmer. It returns an ArrayList of the individual words.

String sentence = "The rain, it  mostly falls...in Spain!";
ArrayList words = Split.words(sentence);


import java.io.*;

/**
  * Stemmer, implementing the Porter Stemming Algorithm
  *
  * The Stemmer class transforms a word into its root form.  The input
  * word can be provided a character at time (by calling add()), or at once
  * by calling one of the various stem(something) methods.
  */

class Stemmer
{  static private char[] b;
   static private int i,     /* offset into b */
               i_end, /* offset to end of stemmed word */
               j, k;
   private static final int INC = 50;
                     /* unit of size whereby b is increased */
   public Stemmer()
   {  b = new char[INC];
      i = 0;
      i_end = 0;
   }
 
   static public String stem(String word)
   {
  b = new char[INC];
     i = 0;
     i_end = 0;
     j = 0;
     k = 0;
 
  char[] w = word.toCharArray();
  int len = w.length;
 
  add(w, len);
 
  stem();
 
  return toString2();
   }

   /**
    * Add a character to the word being stemmed.  When you are finished
    * adding characters, you can call stem(void) to stem the word.
    */

   static public void add(char ch)
   {  if (i == b.length)
      {  char[] new_b = new char[i+INC];
         for (int c = 0; c < i; c++) new_b[c] = b[c];
         b = new_b;
      }
      b[i++] = ch;
   }


   /** Adds wLen characters to the word being stemmed contained in a portion
    * of a char[] array. This is like repeated calls of add(char ch), but
    * faster.
    */

   static public void add(char[] w, int wLen)
   {  if (i+wLen >= b.length)
      {  char[] new_b = new char[i+wLen+INC];
         for (int c = 0; c < i; c++) new_b[c] = b[c];
         b = new_b;
      }
      for (int c = 0; c < wLen; c++) b[i++] = w[c];
   }

   /**
    * After a word has been stemmed, it can be retrieved by toString(),
    * or a reference to the internal buffer can be retrieved by getResultBuffer
    * and getResultLength (which is generally more efficient.)
    */
   static public String toString2() { return new String(b,0,i_end); }

   /**
    * Returns the length of the word resulting from the stemming process.
    */
   static public int getResultLength() { return i_end; }

   /**
    * Returns a reference to a character buffer containing the results of
    * the stemming process.  You also need to consult getResultLength()
    * to determine the length of the result.
    */
   static public char[] getResultBuffer() { return b; }

   /* cons(i) is true <=> b[i] is a consonant. */

   static private final boolean cons(int i)
   {  switch (b[i])
      {  case 'a': case 'e': case 'i': case 'o': case 'u': return false;
         case 'y': return (i==0) ? true : !cons(i-1);
         default: return true;
      }
   }

   /* m() measures the number of consonant sequences between 0 and j. if c is
      a consonant sequence and v a vowel sequence, and <..> indicates arbitrary
      presence,

                gives 0
         vc     gives 1
         vcvc   gives 2
         vcvcvc gives 3
         ....
   */

   static private final int m()
   {  int n = 0;
      int i = 0;
      while(true)
      {  if (i > j) return n;
         if (! cons(i)) break; i++;
      }
      i++;
      while(true)
      {  while(true)
         {  if (i > j) return n;
               if (cons(i)) break;
               i++;
         }
         i++;
         n++;
         while(true)
         {  if (i > j) return n;
            if (! cons(i)) break;
            i++;
         }
         i++;
       }
   }

   /* vowelinstem() is true <=> 0,...j contains a vowel */

   static private final boolean vowelinstem()
   {  int i; for (i = 0; i <= j; i++) if (! cons(i)) return true;
      return false;
   }

   /* doublec(j) is true <=> j,(j-1) contain a double consonant. */

   static private final boolean doublec(int j)
   {  if (j < 1) return false;
      if (b[j] != b[j-1]) return false;
      return cons(j);
   }

   /* cvc(i) is true <=> i-2,i-1,i has the form consonant - vowel - consonant
      and also if the second c is not w,x or y. this is used when trying to
      restore an e at the end of a short word. e.g.

         cav(e), lov(e), hop(e), crim(e), but
         snow, box, tray.

   */

   static private final boolean cvc(int i)
   {  if (i < 2 || !cons(i) || cons(i-1) || !cons(i-2)) return false;
      {  int ch = b[i];
         if (ch == 'w' || ch == 'x' || ch == 'y') return false;
      }
      return true;
   }

   static  private final boolean ends(String s)
   {  int l = s.length();
      int o = k-l+1;
      if (o < 0) return false;
      for (int i = 0; i < l; i++) if (b[o+i] != s.charAt(i)) return false;
      j = k-l;
      return true;
   }

   /* setto(s) sets (j+1),...k to the characters in the string s, readjusting
      k. */

   static private final void setto(String s)
   {  int l = s.length();
      int o = j+1;
      for (int i = 0; i < l; i++) b[o+i] = s.charAt(i);
      k = j+l;
   }

   /* r(s) is used further down. */

   static private final void r(String s) { if (m() > 0) setto(s); }

   /* step1() gets rid of plurals and -ed or -ing. e.g.

          caresses  ->  caress
          ponies    ->  poni
          ties      ->  ti
          caress    ->  caress
          cats      ->  cat

          feed      ->  feed
          agreed    ->  agree
          disabled  ->  disable

          matting   ->  mat
          mating    ->  mate
          meeting   ->  meet
          milling   ->  mill
          messing   ->  mess

          meetings  ->  meet

   */

   static private final void step1()
   {  if (b[k] == 's')
      {  if (ends("sses")) k -= 2; else
         if (ends("ies")) setto("i"); else
         if (b[k-1] != 's') k--;
      }
      if (ends("eed")) { if (m() > 0) k--; } else
      if ((ends("ed") || ends("ing")) && vowelinstem())
      {  k = j;
         if (ends("at")) setto("ate"); else
         if (ends("bl")) setto("ble"); else
         if (ends("iz")) setto("ize"); else
         if (doublec(k))
         {  k--;
            {  int ch = b[k];
               if (ch == 'l' || ch == 's' || ch == 'z') k++;
            }
         }
         else if (m() == 1 && cvc(k)) setto("e");
     }
   }

   /* step2() turns terminal y to i when there is another vowel in the stem. */

   static private final void step2() { if (ends("y") && vowelinstem()) b[k] = 'i'; }

   /* step3() maps double suffices to single ones. so -ization ( = -ize plus
      -ation) maps to -ize etc. note that the string before the suffix must give
      m() > 0. */

   static private final void step3() { if (k == 0) return; /* For Bug 1 */ switch (b[k-1])
   {
       case 'a': if (ends("ational")) { r("ate"); break; }
                 if (ends("tional")) { r("tion"); break; }
                 break;
       case 'c': if (ends("enci")) { r("ence"); break; }
                 if (ends("anci")) { r("ance"); break; }
                 break;
       case 'e': if (ends("izer")) { r("ize"); break; }
                 break;
       case 'l': if (ends("bli")) { r("ble"); break; }
                 if (ends("alli")) { r("al"); break; }
                 if (ends("entli")) { r("ent"); break; }
                 if (ends("eli")) { r("e"); break; }
                 if (ends("ousli")) { r("ous"); break; }
                 break;
       case 'o': if (ends("ization")) { r("ize"); break; }
                 if (ends("ation")) { r("ate"); break; }
                 if (ends("ator")) { r("ate"); break; }
                 break;
       case 's': if (ends("alism")) { r("al"); break; }
                 if (ends("iveness")) { r("ive"); break; }
                 if (ends("fulness")) { r("ful"); break; }
                 if (ends("ousness")) { r("ous"); break; }
                 break;
       case 't': if (ends("aliti")) { r("al"); break; }
                 if (ends("iviti")) { r("ive"); break; }
                 if (ends("biliti")) { r("ble"); break; }
                 break;
       case 'g': if (ends("logi")) { r("log"); break; }
   } }

   /* step4() deals with -ic-, -full, -ness etc. similar strategy to step3. */

   static private final void step4() { switch (b[k])
   {
       case 'e': if (ends("icate")) { r("ic"); break; }
                 if (ends("ative")) { r(""); break; }
                 if (ends("alize")) { r("al"); break; }
                 break;
       case 'i': if (ends("iciti")) { r("ic"); break; }
                 break;
       case 'l': if (ends("ical")) { r("ic"); break; }
                 if (ends("ful")) { r(""); break; }
                 break;
       case 's': if (ends("ness")) { r(""); break; }
                 break;
   } }

   /* step5() takes off -ant, -ence etc., in context vcvc. */

   static private final void step5()
   {   if (k == 0) return; /* for Bug 1 */ switch (b[k-1])
       {  case 'a': if (ends("al")) break; return;
          case 'c': if (ends("ance")) break;
                    if (ends("ence")) break; return;
          case 'e': if (ends("er")) break; return;
          case 'i': if (ends("ic")) break; return;
          case 'l': if (ends("able")) break;
                    if (ends("ible")) break; return;
          case 'n': if (ends("ant")) break;
                    if (ends("ement")) break;
                    if (ends("ment")) break;
                    /* element etc. not stripped before the m */
                    if (ends("ent")) break; return;
          case 'o': if (ends("ion") && j >= 0 && (b[j] == 's' || b[j] == 't')) break;
                                    /* j >= 0 fixes Bug 2 */
                    if (ends("ou")) break; return;
                    /* takes care of -ous */
          case 's': if (ends("ism")) break; return;
          case 't': if (ends("ate")) break;
                    if (ends("iti")) break; return;
          case 'u': if (ends("ous")) break; return;
          case 'v': if (ends("ive")) break; return;
          case 'z': if (ends("ize")) break; return;
          default: return;
       }
       if (m() > 1) k = j;
   }

   /* step6() removes a final -e if m() > 1. */

   static private final void step6()
   {  j = k;
      if (b[k] == 'e')
      {  int a = m();
         if (a > 1 || a == 1 && !cvc(k-1)) k--;
      }
      if (b[k] == 'l' && doublec(k) && m() > 1) k--;
   }

   /** Stem the word placed into the Stemmer buffer through calls to add().
    * Returns true if the stemming process resulted in a word different
    * from the input.  You can retrieve the result with
    * getResultLength()/getResultBuffer() or toString().
    */
   static public void stem()
   {  k = i - 1;
      if (k > 1) { step1(); step2(); step3(); step4(); step5(); step6(); }
      i_end = k+1; i = 0;
   }

   /** Test program for demonstrating the Stemmer.  It reads text from a
    * a list of files, stems each word, and writes the result to standard
    * output. Note that the word stemmed is expected to be in lower case:
    * forcing lower case must be done outside the Stemmer class.
    * Usage: Stemmer file-name file-name ...
    */
   public static void main(String[] args)
   {
 
  System.out.println(Stemmer.stem("parties"));
  System.out.println(Stemmer.stem("hello"));
  System.out.println(Stemmer.stem("running"));
   }
}


import java.util.*;
import java.io.*;

public class Split {

public static void main(String[] args)
{
for(String word : Split.words("The rain in spain falls mainly on the plains, except when it's not exactly working that way! And I need+some= way. How~ will \"(this)\" \"work\"?"))
System.out.println(word);


}

static HashSet stopwords = new HashSet();

public static void addStopwords()
{
try{
BufferedReader br = new BufferedReader(new FileReader("stopwords.txt"));

while(br.ready())
{
stopwords.add(br.readLine());
}

}catch(Exception e){System.out.println(e);}
}

public static ArrayList words(String line)
{
if(stopwords.size() == 0)
addStopwords();

ArrayList result = new ArrayList();

String[] words = line.split("[ \t\n,\\.\"!?$~()\\[\\]\\{\\}:;/\\\\<>+=%*]");
for(int i=0; i < words.length; i++)
{
if(words[i] != null && !words[i].equals(""))
{
String word = words[i].toLowerCase();
if(!stopwords.contains(word))
{
result.add(Stemmer.stem(word));
}
}
}

return result;
}

}

Monday, May 31, 2010

Joining Multiple avi files in ubuntu

cat first.avi second.avi third.avi > temp.avi
mencoder temp.avi -o final.avi -forceidx -ovc copy -oac copy
rm temp.avi

and the joined will be in final.avi

Tuesday, March 2, 2010

if integer weights
./mkidx <> outputFile

if double weights
./mkidx -s (weightMultiplier) <> outputFile

Saturday, February 27, 2010

Metis fix

Error message

In file included from ./metis.h:36,
from coarsen.c:13:
./proto.h:462: error: conflicting types for ‘__log2’
/usr/include/bits/mathcalls.h:145: note: previous declaration of ‘__log2’ was here
make[1]: *** [coarsen.o] Error 1
make[1]: Leaving directory `/home/km/Downloads/metis/metis-4.0/Lib'
make: *** [default] Error 2

can be fixed by

I know about a fix : change log2 by ilog2 in metis source files :

kmetis.c kvmetis.c mkmetis.c util.c
proto.h rename.h

(taken from forum post here: http://www.code-aster.org/forum2/viewtopic.php?id=13444 )

Wednesday, February 17, 2010

Remove Every 2nd (or 3rd, etc) line in Unix

awk 'NR%2 != 0' filename1 > filename2

Friday, January 22, 2010

Unix Sort on multiple columns

To sort, first make sure you're using the correct locale

setenv LC_ALL C

or

export LC_ALL=C

sort -k1,1 -k3,3nr new_test.txt

or (sort -k1,1 -k3nr,3 new_test.txt) not sure which

To sort on first column, and then numerically in reverse order on the third.