2011-05-06 44 views
3

我有一個文件中的單詞列表。它們可能包含諸如「誰」,「沒有」等詞。因此,當從中讀取時,我需要使它們適合「誰是誰」和「沒有」。這必須在Java中完成。我需要這樣做而不會浪費太多時間。什麼是使用Java處理單詞收縮的有效方法?

這實際上是在使用solr的搜索過程中處理這樣的查詢。

下面是一個示例代碼,我使用哈希表

Map<String, String> con = new HashMap<String, String>(); 
     con.put("'s", " is"); 
     con.put("'d", " would"); 
     con.put("'re", " are"); 
     con.put("'ll", " will"); 
     con.put("n't", " not"); 
     con.put("'nt", " not"); 

     String temp = null; 
     String str = "where'd you're you'll would'nt hello"; 

     String[] words = str.split(" "); 
     int index = -1 ; 
     for(int i = 0;i<words.length && (index =words[i].lastIndexOf('\''))>-1;i++){ 
      temp = words[i].substring(index); 
      if(con.containsKey(temp)){ 
       temp = con.get(temp); 
      } 
      words[i] = words[i].substring(0, index)+temp; 
      System.out.println(words[i]);   
     } 
+0

我喜歡'ain't' - >'不是';) – 2011-05-06 11:44:27

+0

「他決定去」表明「的」可以是「他有」。另外,爲什麼要麻煩?你有一些想法,收縮是不恰當的嗎?你會怎麼做「不」或「不會」? – tchrist 2011-05-06 13:16:14

+0

@tchrist是正確的,這是依賴於上下文的。你可以設計和算法考慮,但如果你想正確地做到這一點,你可能需要做全面的解析。這可能是不值得的,因爲無論如何,你從這個擴展中獲得的大部分內容都在停止列表中。 – 2011-05-06 14:19:32

回答

3

如果你擔心包含如「誰是」發現包含如「誰是」文檔的查詢嘗試,那麼你應該看看使用Stemmer,這是專門爲此目的而設計的。

你可以很容易地添加一個stemmer購買配置它作爲你solr配置中的過濾器。請參閱http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

編輯:
SnowballPorterFilterFactory可能會爲您完成這項工作。

+0

當前正在使用solr.PorterStemFilterFactory。在這裏,例如「你是」的查詢變成了「你是」,因此它在索引中搜索「你」和「重新」並且找不到匹配。如果「你是」是「你是」,那麼它會搜索「你」(就像是一個普通的詞),並且會返回結果。這似乎是現在的問題。 – Varshith 2011-05-06 12:36:44

+0

@ user608167如果幹部分裂「你是」 - >「你再幹」,我會很驚訝。你確定你的記號器在干擾器出場之前沒有這麼做嗎?你能發佈你的配置嗎? – Qwerky 2011-05-06 13:13:47

+0

我是solr的初學者。我從更高的層面看待它。記號器讓你 - >你。而stemmer的輸出也是「你重新」。所以這個索引就是搜索你的。如何處理這個? – Varshith 2011-05-06 13:45:18

0

的代碼可以寫成

Map<String, String> con = new HashMap<String, String>(); 
    con.put("'s", " is"); 
    con.put("'d", " would"); 
    con.put("'re", " are"); 
    con.put("'ll", " will"); 
    con.put("n't", " not"); 
    con.put("'nt", " not"); 

    String str = "where'd you're you'll would'nt hello"; 

    for(String key : con.keySet()) { 
     str = str.replaceAll(key + "\\b" , con.get(key)); 
    } 

與你的邏輯。但假設它的script's是一個顯示佔有權的詞,將它改爲script is會改變其含義。

1

從@詹姆斯Jithin的最後一句話繼:

  • 了「的」 - >‘被’改造是不正確,如果這個詞是一個所有格形式。
  • 「d」 - >「would」轉換在古代形式中是不正確的,其中「d」可以是「ed」的縮寫。
  • 「'nt」 - >「not」轉換不正確,因爲這實際上只是「not」收縮的錯誤拼寫。 (我的意思是「wo'nt」顯然是錯的......不是的)

所以,在我看來,最好的方法來實現這一點將是枚舉少數的收縮是共同和有效的,並獨自離開休息。這也有一個好處,就是你可以用一個簡單的字符串匹配而不是後綴匹配來實現它。

相關問題