Skip to content
Browse files

updated tokenization udfs (now does ngrams, uses newer version of luc…

…ene), modern tfidf macro that works with pig 0.12
  • Loading branch information...
1 parent ab83f22 commit 244bfb774295b4eaedec43fd4007c165b677f431 @thedatachef committed Dec 17, 2013
View
BIN lib/lucene-analyzers-common-4.4.0.jar
Binary file not shown.
View
BIN lib/lucene-core-3.1.0.jar
Binary file not shown.
View
BIN lib/lucene-core-4.4.0.jar
Binary file not shown.
View
97 macros/nlp/tfidf.pig
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Given a set of documents, returns tf-idf feature vectors for those documents.
+ *
+ * documents: { id, text:chararray } Document set.
+ * minWordSize: int Words with less characters than this will not be considered
+ * minGramSize: int Smallest number of words allowable in an n-gram
+ * maxGramSize: int Largest number of words allowable in an n-gram
+ * maxFeatures: int Maximum number of features to return per document
+ * ==>
+ * vectors: { id, features:{(token:chararray, weight:float)} } Ordered by weight desc.
+ */
+define VarahaNlpTFIDF(documents, minWordSize, minGramSize, maxGramSize, maxFeatures) returns vectors {
+
+ define TokenizeText varaha.text.TokenizeText('$minGramSize','$maxGramSize', '$minWordSize');
+
+ --
+ -- Get corpus size first
+ --
+ uniq = distinct (foreach $documents generate id);
+ num_docs = foreach (group uniq all) generate COUNT(uniq) as N; -- ugh.
+
+ --
+ -- Tokenize the documents
+ --
+ tokenized = foreach $documents generate
+ id,
+ flatten(TokenizeText(text)) as (token:chararray);
+
+ --
+ -- Next, get raw term frequencies. Combiners will be made use of here to reduce some of the
+ -- token explosion
+ --
+ term_freqs = foreach (group tokenized by (id, token)) generate
+ flatten(group) as (id, token),
+ COUNT(tokenized) as term_freq;
+
+ --
+ -- Now, compute the 'augmented' frequency to prevent bias toward long docs
+ --
+ max_term_freqs = foreach (group term_freqs by id) generate
+ flatten(term_freqs) as (id, token, term_freq),
+ MAX(term_freqs.term_freq) as max_term_freq;
+
+ aug_term_freqs = foreach max_term_freqs {
+ -- see: http://www.cs.odu.edu/~jbollen/IR04/readings/article1-29-03.pdf
+ aug_freq = 0.5f + (0.5f * term_freq)/max_term_freq;
+ generate
+ id as id,
+ token as token,
+ aug_freq as term_freq;
+ };
+
+ --
+ -- Next, get document frequency; how many documents does a term appear in.
+ --
+ doc_freqs = foreach (group aug_term_freqs by token) {
+ raw_doc_freq = COUNT(aug_term_freqs);
+ idf = LOG((float)num_docs.N/(float)raw_doc_freq);
+ generate
+ flatten(aug_term_freqs) as (id, token, term_freq),
+ idf as idf;
+ };
+
+ --
+ -- Finally, compute tf-idf
+ --
+ weights = foreach doc_freqs generate
+ id as id,
+ token as token,
+ term_freq*idf as weight;
+
+ $vectors = foreach (group weights by id) {
+ ordered = order weights by weight desc;
+ top_N = limit ordered $maxFeatures; -- use this instead of top to maintain ordering
+ generate
+ group as id,
+ top_N.(token,weight) as features;
+ };
+};
View
8 pom.xml
@@ -25,7 +25,7 @@
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
- <version>0.8.0</version>
+ <version>0.12.0</version>
</dependency>
<dependency>
@@ -36,10 +36,10 @@
<dependency>
<groupId>org.apache.lucene</groupId>
- <artifactId>lucene-core</artifactId>
- <version>3.1.0</version>
+ <artifactId>lucene-analyzers-common</artifactId>
+ <version>4.4.0</version>
</dependency>
-
+
<dependency>
<groupId>cc.mallet</groupId>
<artifactId>mallet</artifactId>
View
1,139 src/main/java/varaha/text/StopWords.java
@@ -2,576 +2,579 @@
import java.util.Set;
import java.util.HashSet;
+import org.apache.lucene.util.Version;
+import org.apache.lucene.analysis.util.CharArraySet;
public class StopWords {
- public static final Set<String> ENGLISH_STOP_WORDS = new HashSet<String>() {
- {
- add("a");
- add("about");
- add("above");
- add("across");
- add("after");
- add("again");
- add("against");
- add("all");
- add("almost");
- add("alone");
- add("along");
- add("already");
- add("also");
- add("although");
- add("always");
- add("among");
- add("an");
- add("and");
- add("another");
- add("any");
- add("anybody");
- add("anyone");
- add("anything");
- add("anywhere");
- add("apos");
- add("are");
- add("area");
- add("areas");
- add("around");
- add("as");
- add("ask");
- add("asked");
- add("asking");
- add("asks");
- add("at");
- add("away");
- add("back");
- add("backed");
- add("backing");
- add("backs");
- add("be");
- add("became");
- add("because");
- add("become");
- add("becomes");
- add("been");
- add("before");
- add("began");
- add("behind");
- add("being");
- add("beings");
- add("best");
- add("better");
- add("between");
- add("big");
- add("both");
- add("but");
- add("by");
- add("came");
- add("can");
- add("cannot");
- add("case");
- add("cases");
- add("certain");
- add("certainly");
- add("clear");
- add("clearly");
- add("come");
- add("could");
- add("did");
- add("differ");
- add("different");
- add("differently");
- add("do");
- add("does");
- add("done");
- add("down");
- add("down");
- add("downed");
- add("downing");
- add("downs");
- add("during");
- add("each");
- add("early");
- add("either");
- add("end");
- add("ended");
- add("ending");
- add("ends");
- add("enough");
- add("even");
- add("evenly");
- add("ever");
- add("every");
- add("everybody");
- add("everyone");
- add("everything");
- add("everywhere");
- add("face");
- add("faces");
- add("fact");
- add("facts");
- add("far");
- add("felt");
- add("few");
- add("find");
- add("finds");
- add("first");
- add("for");
- add("four");
- add("from");
- add("full");
- add("fully");
- add("further");
- add("furthered");
- add("furthering");
- add("furthers");
- add("gave");
- add("general");
- add("generally");
- add("get");
- add("gets");
- add("give");
- add("given");
- add("gives");
- add("go");
- add("going");
- add("good");
- add("goods");
- add("got");
- add("great");
- add("greater");
- add("greatest");
- add("group");
- add("grouped");
- add("grouping");
- add("groups");
- add("had");
- add("has");
- add("have");
- add("having");
- add("he");
- add("her");
- add("here");
- add("herself");
- add("high");
- add("high");
- add("high");
- add("higher");
- add("highest");
- add("him");
- add("himself");
- add("his");
- add("how");
- add("however");
- add("i");
- add("if");
- add("important");
- add("in");
- add("interest");
- add("interested");
- add("interesting");
- add("interests");
- add("into");
- add("is");
- add("it");
- add("its");
- add("it's");
- add("itself");
- add("just");
- add("keep");
- add("keeps");
- add("kind");
- add("knew");
- add("know");
- add("known");
- add("knows");
- add("large");
- add("largely");
- add("last");
- add("later");
- add("latest");
- add("least");
- add("less");
- add("let");
- add("lets");
- add("like");
- add("likely");
- add("long");
- add("longer");
- add("longest");
- add("made");
- add("make");
- add("making");
- add("man");
- add("many");
- add("may");
- add("me");
- add("member");
- add("members");
- add("men");
- add("might");
- add("more");
- add("most");
- add("mostly");
- add("mr");
- add("mrs");
- add("much");
- add("must");
- add("my");
- add("myself");
- add("nbsp");
- add("necessary");
- add("need");
- add("needed");
- add("needing");
- add("needs");
- add("never");
- add("new");
- add("new");
- add("newer");
- add("newest");
- add("next");
- add("no");
- add("nobody");
- add("non");
- add("noone");
- add("not");
- add("nothing");
- add("now");
- add("nowhere");
- add("number");
- add("numbers");
- add("of");
- add("off");
- add("often");
- add("old");
- add("older");
- add("oldest");
- add("on");
- add("once");
- add("one");
- add("only");
- add("open");
- add("opened");
- add("opening");
- add("opens");
- add("or");
- add("order");
- add("ordered");
- add("ordering");
- add("orders");
- add("other");
- add("others");
- add("our");
- add("out");
- add("over");
- add("part");
- add("parted");
- add("parting");
- add("parts");
- add("per");
- add("perhaps");
- add("place");
- add("places");
- add("point");
- add("pointed");
- add("pointing");
- add("points");
- add("possible");
- add("present");
- add("presented");
- add("presenting");
- add("presents");
- add("problem");
- add("problems");
- add("put");
- add("puts");
- add("quite");
- add("quot");
- add("rather");
- add("really");
- add("right");
- add("right");
- add("room");
- add("rooms");
- add("said");
- add("same");
- add("saw");
- add("say");
- add("says");
- add("second");
- add("seconds");
- add("see");
- add("seem");
- add("seemed");
- add("seeming");
- add("seems");
- add("sees");
- add("several");
- add("shall");
- add("she");
- add("should");
- add("show");
- add("showed");
- add("showing");
- add("shows");
- add("side");
- add("sides");
- add("since");
- add("small");
- add("smaller");
- add("smallest");
- add("so");
- add("some");
- add("somebody");
- add("someone");
- add("something");
- add("somewhere");
- add("state");
- add("states");
- add("still");
- add("still");
- add("such");
- add("sure");
- add("take");
- add("taken");
- add("than");
- add("that");
- add("the");
- add("their");
- add("them");
- add("then");
- add("there");
- add("therefore");
- add("these");
- add("they");
- add("thing");
- add("things");
- add("think");
- add("thinks");
- add("this");
- add("those");
- add("though");
- add("thought");
- add("thoughts");
- add("three");
- add("through");
- add("thus");
- add("to");
- add("today");
- add("together");
- add("too");
- add("took");
- add("toward");
- add("turn");
- add("turned");
- add("turning");
- add("turns");
- add("two");
- add("under");
- add("until");
- add("up");
- add("upon");
- add("us");
- add("use");
- add("used");
- add("uses");
- add("very");
- add("want");
- add("wanted");
- add("wanting");
- add("wants");
- add("was");
- add("way");
- add("ways");
- add("we");
- add("well");
- add("wells");
- add("went");
- add("were");
- add("what");
- add("when");
- add("where");
- add("whether");
- add("which");
- add("while");
- add("who");
- add("whole");
- add("whose");
- add("why");
- add("will");
- add("with");
- add("within");
- add("without");
- add("work");
- add("worked");
- add("working");
- add("works");
- add("would");
- add("year");
- add("years");
- add("yet");
- add("you");
- add("young");
- add("younger");
- add("youngest");
- add("your");
- add("yours");
+
+ public static final CharArraySet ENGLISH_STOP_WORDS = new CharArraySet(Version.LUCENE_44, 600, true) {
+ {
+ add("a");
+ add("about");
+ add("above");
+ add("across");
+ add("after");
+ add("again");
+ add("against");
+ add("all");
+ add("almost");
+ add("alone");
+ add("along");
+ add("already");
+ add("also");
+ add("although");
+ add("always");
+ add("among");
+ add("an");
+ add("and");
+ add("another");
+ add("any");
+ add("anybody");
+ add("anyone");
+ add("anything");
+ add("anywhere");
+ add("apos");
+ add("are");
+ add("area");
+ add("areas");
+ add("around");
+ add("as");
+ add("ask");
+ add("asked");
+ add("asking");
+ add("asks");
+ add("at");
+ add("away");
+ add("back");
+ add("backed");
+ add("backing");
+ add("backs");
+ add("be");
+ add("became");
+ add("because");
+ add("become");
+ add("becomes");
+ add("been");
+ add("before");
+ add("began");
+ add("behind");
+ add("being");
+ add("beings");
+ add("best");
+ add("better");
+ add("between");
+ add("big");
+ add("both");
+ add("but");
+ add("by");
+ add("came");
+ add("can");
+ add("cannot");
+ add("case");
+ add("cases");
+ add("certain");
+ add("certainly");
+ add("clear");
+ add("clearly");
+ add("come");
+ add("could");
+ add("did");
+ add("differ");
+ add("different");
+ add("differently");
+ add("do");
+ add("does");
+ add("done");
+ add("down");
+ add("down");
+ add("downed");
+ add("downing");
+ add("downs");
+ add("during");
+ add("each");
+ add("early");
+ add("either");
+ add("end");
+ add("ended");
+ add("ending");
+ add("ends");
+ add("enough");
+ add("even");
+ add("evenly");
+ add("ever");
+ add("every");
+ add("everybody");
+ add("everyone");
+ add("everything");
+ add("everywhere");
+ add("face");
+ add("faces");
+ add("fact");
+ add("facts");
+ add("far");
+ add("felt");
+ add("few");
+ add("find");
+ add("finds");
+ add("first");
+ add("for");
+ add("four");
+ add("from");
+ add("full");
+ add("fully");
+ add("further");
+ add("furthered");
+ add("furthering");
+ add("furthers");
+ add("gave");
+ add("general");
+ add("generally");
+ add("get");
+ add("gets");
+ add("give");
+ add("given");
+ add("gives");
+ add("go");
+ add("going");
+ add("good");
+ add("goods");
+ add("got");
+ add("great");
+ add("greater");
+ add("greatest");
+ add("group");
+ add("grouped");
+ add("grouping");
+ add("groups");
+ add("had");
+ add("has");
+ add("have");
+ add("having");
+ add("he");
+ add("her");
+ add("here");
+ add("herself");
+ add("high");
+ add("high");
+ add("high");
+ add("higher");
+ add("highest");
+ add("him");
+ add("himself");
+ add("his");
+ add("how");
+ add("however");
+ add("i");
+ add("if");
+ add("important");
+ add("in");
+ add("interest");
+ add("interested");
+ add("interesting");
+ add("interests");
+ add("into");
+ add("is");
+ add("it");
+ add("its");
+ add("it's");
+ add("itself");
+ add("just");
+ add("keep");
+ add("keeps");
+ add("kind");
+ add("knew");
+ add("know");
+ add("known");
+ add("knows");
+ add("large");
+ add("largely");
+ add("last");
+ add("later");
+ add("latest");
+ add("least");
+ add("less");
+ add("let");
+ add("lets");
+ add("like");
+ add("likely");
+ add("long");
+ add("longer");
+ add("longest");
+ add("made");
+ add("make");
+ add("making");
+ add("man");
+ add("many");
+ add("may");
+ add("me");
+ add("member");
+ add("members");
+ add("men");
+ add("might");
+ add("more");
+ add("most");
+ add("mostly");
+ add("mr");
+ add("mrs");
+ add("much");
+ add("must");
+ add("my");
+ add("myself");
+ add("nbsp");
+ add("necessary");
+ add("need");
+ add("needed");
+ add("needing");
+ add("needs");
+ add("never");
+ add("new");
+ add("new");
+ add("newer");
+ add("newest");
+ add("next");
+ add("no");
+ add("nobody");
+ add("non");
+ add("noone");
+ add("not");
+ add("nothing");
+ add("now");
+ add("nowhere");
+ add("number");
+ add("numbers");
+ add("of");
+ add("off");
+ add("often");
+ add("old");
+ add("older");
+ add("oldest");
+ add("on");
+ add("once");
+ add("one");
+ add("only");
+ add("open");
+ add("opened");
+ add("opening");
+ add("opens");
+ add("or");
+ add("order");
+ add("ordered");
+ add("ordering");
+ add("orders");
+ add("other");
+ add("others");
+ add("our");
+ add("out");
+ add("over");
+ add("part");
+ add("parted");
+ add("parting");
+ add("parts");
+ add("per");
+ add("perhaps");
+ add("place");
+ add("places");
+ add("point");
+ add("pointed");
+ add("pointing");
+ add("points");
+ add("possible");
+ add("present");
+ add("presented");
+ add("presenting");
+ add("presents");
+ add("problem");
+ add("problems");
+ add("put");
+ add("puts");
+ add("quite");
+ add("quot");
+ add("rather");
+ add("really");
+ add("right");
+ add("right");
+ add("room");
+ add("rooms");
+ add("said");
+ add("same");
+ add("saw");
+ add("say");
+ add("says");
+ add("second");
+ add("seconds");
+ add("see");
+ add("seem");
+ add("seemed");
+ add("seeming");
+ add("seems");
+ add("sees");
+ add("several");
+ add("shall");
+ add("she");
+ add("should");
+ add("show");
+ add("showed");
+ add("showing");
+ add("shows");
+ add("side");
+ add("sides");
+ add("since");
+ add("small");
+ add("smaller");
+ add("smallest");
+ add("so");
+ add("some");
+ add("somebody");
+ add("someone");
+ add("something");
+ add("somewhere");
+ add("state");
+ add("states");
+ add("still");
+ add("still");
+ add("such");
+ add("sure");
+ add("take");
+ add("taken");
+ add("than");
+ add("that");
+ add("the");
+ add("their");
+ add("them");
+ add("then");
+ add("there");
+ add("therefore");
+ add("these");
+ add("they");
+ add("thing");
+ add("things");
+ add("think");
+ add("thinks");
+ add("this");
+ add("those");
+ add("though");
+ add("thought");
+ add("thoughts");
+ add("three");
+ add("through");
+ add("thus");
+ add("to");
+ add("today");
+ add("together");
+ add("too");
+ add("took");
+ add("toward");
+ add("turn");
+ add("turned");
+ add("turning");
+ add("turns");
+ add("two");
+ add("under");
+ add("until");
+ add("up");
+ add("upon");
+ add("us");
+ add("use");
+ add("used");
+ add("uses");
+ add("very");
+ add("want");
+ add("wanted");
+ add("wanting");
+ add("wants");
+ add("was");
+ add("way");
+ add("ways");
+ add("we");
+ add("well");
+ add("wells");
+ add("went");
+ add("were");
+ add("what");
+ add("when");
+ add("where");
+ add("whether");
+ add("which");
+ add("while");
+ add("who");
+ add("whole");
+ add("whose");
+ add("why");
+ add("will");
+ add("with");
+ add("within");
+ add("without");
+ add("work");
+ add("worked");
+ add("working");
+ add("works");
+ add("would");
+ add("year");
+ add("years");
+ add("yet");
+ add("you");
+ add("young");
+ add("younger");
+ add("youngest");
+ add("your");
+ add("yours");
- // Common names, you may not want this in general
+ // Common names, you may not want this in general
- add("alex");
- add("alex's");
- add("alexis");
- add("alexis's");
- add("amy");
- add("amy's");
- add("andre");
- add("andre's");
- add("andrea");
- add("andrea's");
- add("ann");
- add("ann's");
- add("anne");
- add("anne's");
- add("arthur");
- add("arthur's");
- add("betty");
- add("betty's");
- add("bill");
- add("bill's");
- add("carol");
- add("carol's");
- add("cathy");
- add("cathy's");
- add("celia");
- add("celia's");
- add("chris");
- add("chris's");
- add("cindy");
- add("cindy's");
- add("cynthia");
- add("cynthia's");
- add("dan");
- add("dan's");
- add("dave");
- add("dave's");
- add("debbi");
- add("debbi's");
- add("debbie");
- add("debbie's");
- add("don");
- add("don's");
- add("donna");
- add("donna's");
- add("doug");
- add("doug's");
- add("dylan");
- add("dylan's");
- add("edward");
- add("edward's");
- add("eileen");
- add("eileen's");
- add("ellen");
- add("ellen's");
- add("emily");
- add("emily's");
- add("eric");
- add("eric's");
- add("erica");
- add("erica's");
- add("eva");
- add("eva's");
- add("helen");
- add("helen's");
- add("jane");
- add("jane's");
- add("jeff");
- add("jeff's");
- add("jenni");
- add("jenni's");
- add("jenny");
- add("jenny's");
- add("jill");
- add("jill's");
- add("jim");
- add("jim's");
- add("joann");
- add("joann's");
- add("joe");
- add("joe's");
- add("judy");
- add("judy's");
- add("karen");
- add("karen's");
- add("kat");
- add("kat's");
- add("katt");
- add("katt's");
- add("kim");
- add("kim's");
- add("linda");
- add("linda's");
- add("lisa");
- add("lisa's");
- add("lloyd");
- add("lloyd's");
- add("lynn");
- add("lynn's");
- add("marcy");
- add("marcy's");
- add("mark");
- add("mark's");
- add("mary");
- add("mary's");
- add("melanie");
- add("melanie's");
- add("mona");
- add("mona's");
- add("nancy");
- add("nancy's");
- add("nicole");
- add("nicole's");
- add("nina");
- add("nina's");
- add("peggy");
- add("peggy's");
- add("renee");
- add("renee's");
- add("riki");
- add("riki's");
- add("rikki");
- add("rikki's");
- add("robert");
- add("robert's");
- add("ruth");
- add("ruth's");
- add("sally");
- add("sally's");
- add("sara");
- add("sara's");
- add("sarah");
- add("sarah's");
- add("sharon");
- add("sharon's");
- add("sue");
- add("sue's");
- add("teddy");
- add("teddy's");
- add("teresa");
- add("teresa's");
- add("terri");
- add("terri's");
- add("terry");
- add("terry's");
- add("tim");
- add("tim's");
- add("timmy");
- add("timmy's");
- add("tom");
- add("tom's");
- add("vicky");
- add("vicky's");
- add("zeke");
- add("zeke's");
- }
- };
+ add("alex");
+ add("alex's");
+ add("alexis");
+ add("alexis's");
+ add("amy");
+ add("amy's");
+ add("andre");
+ add("andre's");
+ add("andrea");
+ add("andrea's");
+ add("ann");
+ add("ann's");
+ add("anne");
+ add("anne's");
+ add("arthur");
+ add("arthur's");
+ add("betty");
+ add("betty's");
+ add("bill");
+ add("bill's");
+ add("carol");
+ add("carol's");
+ add("cathy");
+ add("cathy's");
+ add("celia");
+ add("celia's");
+ add("chris");
+ add("chris's");
+ add("cindy");
+ add("cindy's");
+ add("cynthia");
+ add("cynthia's");
+ add("dan");
+ add("dan's");
+ add("dave");
+ add("dave's");
+ add("debbi");
+ add("debbi's");
+ add("debbie");
+ add("debbie's");
+ add("don");
+ add("don's");
+ add("donna");
+ add("donna's");
+ add("doug");
+ add("doug's");
+ add("dylan");
+ add("dylan's");
+ add("edward");
+ add("edward's");
+ add("eileen");
+ add("eileen's");
+ add("ellen");
+ add("ellen's");
+ add("emily");
+ add("emily's");
+ add("eric");
+ add("eric's");
+ add("erica");
+ add("erica's");
+ add("eva");
+ add("eva's");
+ add("helen");
+ add("helen's");
+ add("jane");
+ add("jane's");
+ add("jeff");
+ add("jeff's");
+ add("jenni");
+ add("jenni's");
+ add("jenny");
+ add("jenny's");
+ add("jill");
+ add("jill's");
+ add("jim");
+ add("jim's");
+ add("joann");
+ add("joann's");
+ add("joe");
+ add("joe's");
+ add("judy");
+ add("judy's");
+ add("karen");
+ add("karen's");
+ add("kat");
+ add("kat's");
+ add("katt");
+ add("katt's");
+ add("kim");
+ add("kim's");
+ add("linda");
+ add("linda's");
+ add("lisa");
+ add("lisa's");
+ add("lloyd");
+ add("lloyd's");
+ add("lynn");
+ add("lynn's");
+ add("marcy");
+ add("marcy's");
+ add("mark");
+ add("mark's");
+ add("mary");
+ add("mary's");
+ add("melanie");
+ add("melanie's");
+ add("mona");
+ add("mona's");
+ add("nancy");
+ add("nancy's");
+ add("nicole");
+ add("nicole's");
+ add("nina");
+ add("nina's");
+ add("peggy");
+ add("peggy's");
+ add("renee");
+ add("renee's");
+ add("riki");
+ add("riki's");
+ add("rikki");
+ add("rikki's");
+ add("robert");
+ add("robert's");
+ add("ruth");
+ add("ruth's");
+ add("sally");
+ add("sally's");
+ add("sara");
+ add("sara's");
+ add("sarah");
+ add("sarah's");
+ add("sharon");
+ add("sharon's");
+ add("sue");
+ add("sue's");
+ add("teddy");
+ add("teddy's");
+ add("teresa");
+ add("teresa's");
+ add("terri");
+ add("terri's");
+ add("terry");
+ add("terry's");
+ add("tim");
+ add("tim's");
+ add("timmy");
+ add("timmy's");
+ add("tom");
+ add("tom's");
+ add("vicky");
+ add("vicky's");
+ add("zeke");
+ add("zeke's");
+ }
+ };
}
View
162 src/main/java/varaha/text/TokenizeText.java
@@ -20,63 +20,175 @@
import java.io.IOException;
import java.io.StringReader;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.HashSet;
+import java.util.regex.Pattern;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
import org.apache.pig.data.DataBag;
import org.apache.pig.data.BagFactory;
-import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;
-import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
+import org.apache.lucene.analysis.shingle.ShingleFilter;
+import org.apache.lucene.analysis.pattern.PatternReplaceFilter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.analysis.standard.StandardTokenizer;
+import org.apache.lucene.analysis.miscellaneous.LengthFilter;
+import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
/**
- * TokenizeText uses the Lucene libraries StandardAnalyzer class to tokenize a
+ * TokenizeText uses the Lucene library's StandardAnalyzer class to tokenize a
* raw text input. A list of the stopwords used is available {@link StopWords}.
- * Output is a pig bag containing tokens.
+ * Output is a pig data bag containing tokens.
*
* <dt><b>Example:</b></dt>
* <dd><code>
* register varaha.jar;<br/>
- * documents = LOAD 'documents' AS (doc_id:chararray, text:chararray);<br/>
- * tokenized = FOREACH documents GENERATE doc_id AS doc_id, FLATTEN(TokenizeText(text)) AS (token:chararray);
+ *
+ * define TokenizeText varaha.text.TokenizeText('$minGramSize', '$maxGramSize', '$minWordSize');
+ *
+ * documents = load 'documents' as (doc_id:chararray, text:chararray);<br/>
+ * tokenized = foreach documents generate doc_id, flatten(TokenizeText(text)) as (token:chararray);
* </code></dd>
* </dl>
- *
+ *
+ *
+ * @param minGramSize Minimum number of individual terms to include in the returned ngrams
+ * @param maxGramSize Maximum number of individual terms to include in the returned ngrams
+ * @param minWordSize Minimum number of characters allowed per term in the returned ngrams
+ *
* @see
* @author Jacob Perkins
- *
*/
-public class TokenizeText extends EvalFunc<DataBag> {
+public class TokenizeText extends EvalFunc<DataBag>{
private static TupleFactory tupleFactory = TupleFactory.getInstance();
private static BagFactory bagFactory = BagFactory.getInstance();
private static String NOFIELD = "";
- private static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_31, StopWords.ENGLISH_STOP_WORDS);
+ private static Pattern SHINGLE_FILLER = Pattern.compile(".* _ .*|_ .*|.* _| _");
+ private static StandardAnalyzer analyzer;
+
+ private Integer minWordSize;
+ private Integer minGramSize;
+ private Integer maxGramSize;
+ private Boolean outputUnigrams;
+
+ public TokenizeText(String minGramSize, String maxGramSize) {
+ this(minGramSize, maxGramSize, "3");
+ }
+
+ public TokenizeText(String minGramSize, String maxGramSize, String minWordSize) {
+ this.minWordSize = Integer.parseInt(minWordSize);
+ this.minGramSize = Integer.parseInt(minGramSize);
+ this.maxGramSize = Integer.parseInt(maxGramSize);
+ this.analyzer = new StandardAnalyzer(Version.LUCENE_44, StopWords.ENGLISH_STOP_WORDS);
+ validateSizes();
+ }
+ public void validateSizes() {
+ outputUnigrams = false;
+ if (minGramSize == 1 && maxGramSize > 1) {
+ minGramSize = 2;
+ outputUnigrams = true;
+ }
+ }
+
+ /**
+ Uses Lucene's StandardAnalyzer and tuns the tokens through several lucene filters
+ - LengthFilter: Filter individual words to be of length > minWordSize
+ - ShingleFilter: Converts word stream into n-gram stream
+ - PatternReplaceFilter: Removes the 'filler' character that ShingleFilter puts in to
+ replace stopwords
+ */
public DataBag exec(Tuple input) throws IOException {
if (input == null || input.size() < 1 || input.isNull(0))
return null;
+
+ TokenStream stream = analyzer.tokenStream(NOFIELD, input.get(0).toString());
+ LengthFilter filtered = new LengthFilter(Version.LUCENE_44, stream, minWordSize, Integer.MAX_VALUE); // Let words be long
- // Output bag
- DataBag bagOfTokens = bagFactory.newDefaultBag();
-
- StringReader textInput = new StringReader(input.get(0).toString());
- TokenStream stream = analyzer.tokenStream(NOFIELD, textInput);
- CharTermAttribute termAttribute = stream.getAttribute(CharTermAttribute.class);
+ DataBag result;
+ if (minGramSize == 1 && maxGramSize == 1) {
+ result = fillBag(filtered);
+ } else {
+ ShingleFilter nGramStream = new ShingleFilter(filtered, minGramSize, maxGramSize);
+ nGramStream.setOutputUnigrams(outputUnigrams);
+ PatternReplaceFilter replacer = new PatternReplaceFilter(nGramStream, SHINGLE_FILLER, NOFIELD, true);
+ result = fillBag(replacer);
+ }
+ return result;
+ }
- while (stream.incrementToken()) {
- Tuple termText = tupleFactory.newTuple(termAttribute.toString());
- bagOfTokens.add(termText);
- termAttribute.setEmpty();
+ /**
+ Fills a DataBag with tokens from a TokenStream
+ */
+ public DataBag fillBag(TokenStream stream) throws IOException {
+ DataBag result = bagFactory.newDefaultBag();
+ CharTermAttribute termAttribute = stream.addAttribute(CharTermAttribute.class);
+ try {
+ stream.reset();
+ while (stream.incrementToken()) {
+ if (termAttribute.length() > 0) {
+ Tuple termText = tupleFactory.newTuple(termAttribute.toString());
+ result.add(termText);
+ }
+ }
+ stream.end();
+ } finally {
+ stream.close();
}
- return bagOfTokens;
+ return result;
}
}
+
+
+// package varaha.text;
+//
+// import java.io.IOException;
+// import java.io.StringReader;
+// import java.util.Iterator;
+// import java.util.Set;
+// import java.util.HashSet;
+//
+// import org.apache.pig.EvalFunc;
+// import org.apache.pig.data.Tuple;
+// import org.apache.pig.data.TupleFactory;
+// import org.apache.pig.data.DataBag;
+// import org.apache.pig.data.BagFactory;
+//
+// import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
+// import org.apache.lucene.util.Version;
+// import org.apache.lucene.analysis.Token;
+// import org.apache.lucene.analysis.TokenStream;
+// import org.apache.lucene.analysis.standard.StandardAnalyzer;
+// import org.apache.lucene.analysis.standard.StandardTokenizer;
+//
+// /**
+// *
+// */
+// public class TokenizeText extends EvalFunc<DataBag> {
+//
+// private static TupleFactory tupleFactory = TupleFactory.getInstance();
+// private static BagFactory bagFactory = BagFactory.getInstance();
+// private static String NOFIELD = "";
+// private static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_31, StopWords.ENGLISH_STOP_WORDS);
+//
+// public DataBag exec(Tuple input) throws IOException {
+// if (input == null || input.size() < 1 || input.isNull(0))
+// return null;
+//
+// // Output bag
+// DataBag bagOfTokens = bagFactory.newDefaultBag();
+//
+// StringReader textInput = new StringReader(input.get(0).toString());
+// TokenStream stream = analyzer.tokenStream(NOFIELD, textInput);
+// CharTermAttribute termAttribute = stream.getAttribute(CharTermAttribute.class);
+//
+// while (stream.incrementToken()) {
+// Tuple termText = tupleFactory.newTuple(termAttribute.toString());
+// bagOfTokens.add(termText);
+// termAttribute.setEmpty();
+// }
+// return bagOfTokens;
+// }
+// }

0 comments on commit 244bfb7

Please sign in to comment.
Something went wrong with that request. Please try again.