在java中停止单词和词干分析器

我正在考虑在我的相似程序中加上一个停用词,然后是一个词干分析器(对于搬运工1或2来说取决于最容易实现的)

我想知道,因为我从文件中读取我的文本作为整行并将它们保存为长字符串,所以如果我有两个字符串ex。

String one = "I decided buy something from the shop."; String two = "Nevertheless I decidedly bought something from a shop."; 

现在我得到了那些字符串

词干:我可以直接在它上面使用词干分析器算法,将它保存为字符串然后继续处理相似性,就像在程序中实现词干分析器之前一样,就像运行one.stem(); 之类的事情?

停止说:这是如何解决的? 我只是用; one.replaceall(“我”,“”); 或者是否有一些特定的方法用于此过程? 我想继续使用字符串并获取字符串,然后在其上使用相似性算法来获得相似性。 Wiki没有说太多。

希望你能帮助我! 谢谢。

编辑:这是一个与学校相关的项目,我正在写一篇关于不同算法之间相似性的论文,所以我认为我不允许使用lucene或其他为我工作的库。 另外,在开始使用像Lucene和co这样的库之前,我想尝试理解它是如何工作的。 希望这不是太麻烦^^

如果您出于学术原因未实现此function,则应考虑使用Lucene库。 无论哪种情况,它都可能有助于参考。 它具有标记化,停止词过滤,词干和相似性的类。 这是一个使用Lucene 3.0删除停用词并阻止输入字符串的快速示例:

 public static String removeStopWordsAndStem(String input) throws IOException { Set stopWords = new HashSet(); stopWords.add("a"); stopWords.add("I"); stopWords.add("the"); TokenStream tokenStream = new StandardTokenizer( Version.LUCENE_30, new StringReader(input)); tokenStream = new StopFilter(true, tokenStream, stopWords); tokenStream = new PorterStemFilter(tokenStream); StringBuilder sb = new StringBuilder(); TermAttribute termAttr = tokenStream.getAttribute(TermAttribute.class); while (tokenStream.incrementToken()) { if (sb.length() > 0) { sb.append(" "); } sb.append(termAttr.term()); } return sb.toString(); } 

如果你的字符串使用如下:

 public static void main(String[] args) throws IOException { String one = "I decided buy something from the shop."; String two = "Nevertheless I decidedly bought something from a shop."; System.out.println(removeStopWordsAndStem(one)); System.out.println(removeStopWordsAndStem(two)); } 

产生此输出:

 decid bui someth from shop Nevertheless decidedli bought someth from shop 

是的,你可以包装任何一个词干器,这样你就可以写出类似的东西

 String stemmedString = stemmer.stemAndRemoveStopwords(inputString, stopWordList); 

在内部,你的stemAndRemoveStopwords会

  • 将所有stopWords放在Map中以便快速参考
  • 初始化一个空的StringBuilder以保存输出字符串
  • 迭代输入字符串中的所有单词,以及每个单词
    • 在stopWordList中搜索它; 如果找到,继续循环
    • 否则,使用您喜欢的词干提取器,并将其添加到输出字符串
  • 返回输出字符串

您不必处理整个文本。 只需拆分它,应用你的停用词filter和词干分析算法,然后使用StringBuilder再次构建字符串:

 StrinBuilder builder = new StringBuilder(text.length()); String[] words = text.split("\\s+"); for (String word : words) { if (stopwordFilter.check(word)) { // Apply stopword filter. word = stemmer.stem(word); // Apply stemming algorithm. builder.append(word); } } text = builder.toString();