2011-05-25 102 views
3

我想制止的话我相似的程序,然后一个词干的单词和词干(去为搬运工1或2取决于什么最容易实现的)停止在java中

我在想,既然我从文件中读取我的文本作为整行,并将它们保存为一个长字符串,所以如果我有两个字符串前。

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

现在,我得到了这些字符串

词干: 我可以只直接使用词干algoritmen它,将它保存为一个字符串,然后继续在相似的工作就像我实现词干以前那样在程序中,像运行one.stem();之类的事情?

停止词: 这是如何工作的? O.o 我只是使用; one.replaceall(“I”,“”);还是有一些具体的方法来使用这个过程?我想继续使用字符串并在使用相似性算法获取相似性之前先获得一个字符串。维基并没有说太多。

希望你能帮助我!谢谢。

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

回答

0

是的,你可以用任何词干,让您可以编写类似

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

内部,你stemAndRemoveStopwords会

  • 发生在所有禁用词用于快速参考的映射
  • 初始化一个空的StringBuilder以固定输出字符串
  • 迭代输入字符串中的所有单词, d为每个词
    • 在stopWordList中搜索它;如果发现,继续循环的顶部
    • 否则,用你喜欢的词干干它,并把它添加到到输出字符串
  • 返回输出字符串
+0

等待等什么你说的是,有已经在搬运工停用词功能词干? O.o对不起,我觉得我没有得到它。你能解释一下吗?我在想,如果波特的词干已经有这样或那样的功能。使用它会更容易;) – N00programmer 2011-05-25 17:06:53

+0

@ N00 - 词干分析器只是将词汇修剪到词干的算法。它没有停止词的概念;但使用简单的哈希映射去除它们非常简单:将所有停用词放在哈希映射中,在输入词之前,如果它在哈希映射中,则可以放弃它,而不是放弃它。 – tucuxi 2011-05-25 17:21:58

+0

是的,似乎我正在做一个比它更大的交易。谢谢回答。 – N00programmer 2011-05-26 09:36:28

10

如果你不打算使用由于学术原因,您应该考虑使用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 
+0

ahh我认为lucene是一个nono,因为它是一个与学校有关的项目。 – N00programmer 2011-05-25 17:02:18

+0

为什么你不应该考虑将Lucene用于学术目的? – 2017-04-29 16:51:06

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(); 
+0

@EserAygün:啊,但这里的问题是我将levenshtein作为算法之一运行,最好是将文本作为整个字符串处理,而不是作为记号。这就是为什么我想要在整个字符串上运行它然后以字符串结尾的原因,我可以在相似性机器中抛出aka仍然有一个字符串进行比较,而不是重写它以比较levenshtein算法中的记号。 – N00programmer 2011-05-25 12:27:57

+0

噢,好的。那么为什么不使用StringBuilder加入令牌呢?它比处理整个文本更容易。 – 2011-05-25 14:09:21

+0

@EserAygün:嗯......你的意思是先将它切割成令牌,然后停止使用它,然后再把它建立起来,然后在运行levenshtein之前重新建立字符串? :0 – N00programmer 2011-05-25 17:01:38