2011-05-25 27 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