4

我正在考虑在我的相似性程序中放置一个停用词,然后是一个词干分析器(选择搬运工 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("I", ""); 还是有一些特定的方法可以用于这个过程?我想继续使用该字符串并获取一个字符串,然后再对其使用相似度算法来获取相似度。维基并没有说太多。

希望你能帮帮我!谢谢。

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

4

3 回答 3

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
于 2011-05-25T10:50:08.703 回答
0

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

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

在内部,您的 stemAndRemoveStopwords 将

  • 将所有停用词放在地图中以便快速参考
  • 初始化一个空的 StringBuilder 来保存输出字符串
  • 遍历输入字符串中的所有单词,并为每个单词
    • 在 stopWordList 中搜索;如果找到,继续循环顶部
    • 否则,使用您喜欢的词干分析器将其词干,并将其添加到输出字符串
  • 返回输出字符串
于 2011-05-25T10:38:28.317 回答
0

您不必处理整个文本。只需拆分它,应用您的停用词过滤器和词干算法,然后使用 a 再次构建字符串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();
于 2011-05-25T11:22:48.063 回答