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

时间:2011-05-25 09:53:35

标签: java nlp stop-words porter-stemmer

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

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

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

现在我收到了那些字符串

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

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

希望你能帮助我!谢谢。

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

3 个答案:

答案 0 :(得分:11)

如果您出于学术原因未执行此操作,则应考虑使用Lucene库。在任何一种情况下,它都可能有助于参考。它具有标记化,停止词过滤,词干和相似性的类。这是一个使用Lucene 3.0删除停用词并阻止输入字符串的简单示例:

public static String removeStopWordsAndStem(String input) throws IOException {
    Set<String> stopWords = new HashSet<String>();
    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

答案 1 :(得分:0)

是的,您可以包装任何词干分析器,以便您可以编写类似

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

在内部,你的stemAndRemoveStopwords将

  • 将所有停用词放在地图中以供快速参考
  • 初始化一个空的StringBuilder以保存输出字符串
  • 迭代输入字符串中的所有单词,以及每个单词
    • 在stopWordList中搜索它;如果找到,继续回到循环顶部
    • 否则,使用您首选的词干分析器来阻止它,并将其添加到输出字符串
  • 返回输出字符串

答案 2 :(得分:0)

您不必处理整个文本。只需将其拆分,应用您的禁用词过滤器和词干分析算法,然后使用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();