/*
 * 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.
 */

package opennlp.tools.textsimilarity;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TextSimilarityBagOfWords
{
	public double assessRelevanceAndGetScore(String para1, String para2)
	{
		List<String> wordsOfPara1 = TextProcessor.fastTokenize(para1, false); 
		List<String> wordsOfPara2 = TextProcessor.fastTokenize(para2, false); 
		List<String> overlap = new ArrayList<String>(wordsOfPara1);
		overlap.retainAll(wordsOfPara2);
		overlap.removeAll(Arrays.asList(stopList));
		
		return overlap.size();
	}
	
	public String[] stopList = new String[]{
			"a",

			"about",

			"above",

			"across",

			"after",

			"again",

			"against",

			"all",

			"almost",

			"alone",

			"along",

			"already",

			"also",

			"although",

			"always",

			"among",

			"an",

			"and",

			"another",

			"any",

			"anybody",

			"anyone",

			"anything",

			"anywhere",

			"are",

			"area",

			"areas",

			"around",

			"as",

			"ask",

			"asked",

			"asking",

			"asks",

			"at",

			"away",

			"b",

			"back",

			"backed",

			"backing",

			"backs",

			"be",

			"became",

			"because",

			"become",

			"becomes",

			"been",

			"before",

			"began",

			"behind",

			"being",

			"beings",

			"best",

			"better",

			"between",

			"big",

			"both",

			"but",

			"by",

			"c",

			"came",

			"can",

			"cannot",

			"case",

			"cases",

			"certain",

			"certainly",

			"clear",

			"clearly",

			"come",

			"could",

			"d",

			"did",

			"differ",

			"different",

			"differently",

			"do",

			"does",

			"done",

			"down",

			"down",

			"downed",

			"downing",

			"downs",

			"during",

			"e",

			"each",

			"early",

			"either",

			"end",

			"ended",

			"ending",

			"ends",

			"enough",

			"even",

			"evenly",

			"ever",

			"every",

			"everybody",

			"everyone",

			"everything",

			"everywhere",

			"f",

			"face",

			"faces",

			"fact",

			"facts",

			"far",

			"felt",

			"few",

			"find",

			"finds",

			"first",

			"for",

			"four",

			"from",

			"full",

			"fully",

			"further",

			"furthered",

			"furthering",

			"furthers",

			"g",

			"gave",

			"general",

			"generally",

			"get",

			"gets",

			"give",

			"given",

			"gives",

			"go",

			"going",

			"good",

			"goods",

			"got",

			"great",

			"greater",

			"greatest",

			"group",

			"grouped",

			"grouping",

			"groups",

			"h",

			"had",

			"has",

			"have",

			"having",

			"he",

			"her",

			"here",

			"herself",

			"high",

			"high",

			"high",

			"higher",

			"highest",

			"him",

			"himself",

			"his",

			"how",

			"however",

			"i",

			"if",

			"important",

			"in",

			"interest",

			"interested",

			"interesting",

			"interests",

			"into",

			"is",

			"it",

			"its",

			"itself",

			"j",

			"just",

			"k",

			"keep",

			"keeps",

			"kind",

			"knew",

			"know",

			"known",

			"knows",

			"l",

			"large",

			"largely",

			"last",

			"later",

			"latest",

			"least",

			"less",

			"let",

			"lets",

			"like",

			"likely",

			"long",

			"longer",

			"longest",

			"m",

			"made",

			"make",

			"making",

			"man",

			"many",

			"may",

			"me",

			"member",

			"members",

			"men",

			"might",

			"more",

			"most",

			"mostly",

			"mr",

			"mrs",

			"much",

			"must",

			"my",

			"myself",

			"n",

			"necessary",

			"need",

			"needed",

			"needing",

			"needs",

			"never",

			"new",

			"new",

			"newer",

			"newest",

			"next",

			"no",

			"nobody",

			"non",

			"noone",

			"not",

			"nothing",

			"now",

			"nowhere",

			"number",

			"numbers",

			"o",

			"of",

			"off",

			"often",

			"old",

			"older",

			"oldest",

			"on",

			"once",

			"one",

			"only",

			"open",

			"opened",

			"opening",

			"opens",

			"or",

			"order",

			"ordered",

			"ordering",

			"orders",

			"other",

			"others",

			"our",

			"out",

			"over",

			"p",

			"part",

			"parted",

			"parting",

			"parts",

			"per",

			"perhaps",

			"place",

			"places",

			"point",

			"pointed",

			"pointing",

			"points",

			"possible",

			"present",

			"presented",

			"presenting",

			"presents",

			"problem",

			"problems",

			"put",

			"puts",

			"q",

			"quite",

			"r",

			"rather",

			"really",

			"right",

			"right",

			"room",

			"rooms",

			"s",

			"said",

			"same",

			"saw",

			"say",

			"says",

			"second",

			"seconds",

			"see",

			"seem",

			"seemed",

			"seeming",

			"seems",

			"sees",

			"several",

			"shall",

			"she",

			"should",

			"show",

			"showed",

			"showing",

			"shows",

			"side",

			"sides",

			"since",

			"small",

			"smaller",

			"smallest",

			"so",

			"some",

			"somebody",

			"someone",

			"something",

			"somewhere",

			"state",

			"states",

			"still",

			"still",

			"such",

			"sure",

			"t",

			"take",

			"taken",

			"than",

			"that",

			"the",

			"their",

			"them",

			"then",

			"there",

			"therefore",

			"these",

			"they",

			"thing",

			"things",

			"think",

			"thinks",

			"this",

			"those",

			"though",

			"thought",

			"thoughts",

			"three",

			"through",

			"thus",

			"to",

			"today",

			"together",

			"too",

			"took",

			"toward",

			"turn",

			"turned",

			"turning",

			"turns",

			"two",

			"u",

			"under",

			"until",

			"up",

			"upon",

			"us",

			"use",

			"used",

			"uses",

			"v",

			"very",

			"w",

			"want",

			"wanted",

			"wanting",

			"wants",

			"was",

			"way",

			"ways",

			"we",

			"well",

			"wells",

			"went",

			"were",

			"what",

			"when",

			"where",

			"whether",

			"which",

			"while",

			"who",

			"whole",

			"whose",

			"why",

			"will",

			"with",

			"within",

			"without",

			"work",

			"worked",

			"working",

			"works",

			"would",

			"x",

			"y",

			"year",

			"years",

			"yet",

			"you",

			"young",

			"younger",

			"youngest",

			"your",

			"yours",

			"z" };

	

}
