2008-11-09 4 views
10

Diyelim ki böyle bir metin dosyası var diyelim: http://www.gutenberg.org/files/17921/17921-8.txtÖzü kelimeler

herkes bir metin dosyası kelimeleri ayıklamak için iyi bir algoritma veya açık kaynak kodu vardır mu? Tüm sözcükler, özel karakterlerden kaçınarak ve "bu" gibi şeyler saklanırken nasıl yapılır ...

Java'da çalışıyorum. Teşekkürler

cevap

17

Bu, normal ifadeler için doğru iş gibi görünür. İşte size bir fikir vermek için bazı Java kodu nasıl başlayacağınızı bilmiyorsanız durumda, geçerli:

String input = "Input text, with words, punctuation, etc. Well, it's rather short."; 
Pattern p = Pattern.compile("[\\w']+"); 
Matcher m = p.matcher(input); 

while (m.find()) { 
    System.out.println(input.substring(m.start(), m.end())); 
} 

desen [\w']+ maçları tüm kelime karakterler ve kesme işareti, birden çok kez. Örnek dizesi, word-by-word olarak basılacaktır. Daha fazla bilgi için Java Pattern class documentation'a bakın.

+1

Regexp'i sayılar, alt çizgi içermeyen ve bir alıntıyla başlayan sözcüklere sahip olmamak için biraz değiştirmem gerekiyordu, aksi halde, iyi! –

+0

\ w gibi kaçmak zorunda kaldı: 'Pattern.compile ("[\\ w'] +"); – ScrollerBlaster

+0

@ScrollerBlaster Bu doğru. Tamir edeceğim, teşekkürler! – Tomalak

0

Yaptığınız kalıbı kullanarak regex'i deneyebilir ve bu desenin bulunma sayısını sayabilirsin.

3

yalancı kod şu şekilde görünecektir:

create words, a list of words, by splitting the input by whitespace 
for every word, strip out whitespace and punctuation on the left and the right 

piton kodu şöyle bir şey olurdu:

words = input.split() 
words = [word.strip(PUNCTUATION) for word in words] 

nerede

PUNCTUATION = ",. \n\t\\\"'][#*:" 

veya kaldırmak istediğiniz diğer karakterler.

Java'nın String sınıfında eşdeğer işlevleri olduğunu düşünüyorum: String .split(). Eğer bağlantıda verilen metin üzerinde bu kodu çalışan


Çıktı: Temelde

>>> print words[:100] 
['Project', "Gutenberg's", 'Manual', 'of', 'Surgery', 'by', 'Alexis', 
'Thomson', 'and', 'Alexander', 'Miles', 'This', 'eBook', 'is', 'for', 
'the', 'use', 'of', 'anyone', 'anywhere', 'at', 'no', 'cost', 'and', 
'with', 'almost', 'no', 'restrictions', 'whatsoever', 'You', 'may', 
'copy', 'it', 'give', 'it', 'away', 'or', 're-use', 'it', 'under', 
... etc etc. 
+0

içindeki tüm kelimelerin dizisi döndürür tek geçişte basitçe yapılabilir. –

+0

Evet Java'nın 'bölünmüş' bir yöntemi var, ancak 'şerit' yöntemine eşdeğer değil. –

1

, eşleşmesini istediğiniz

([A-Za-z]) + (' ([A-Za-z]) *)?

doğru mu?

3

İşte soruna iyi bir yaklaşım: Bu fonksiyon girdi olarak metninizi alır ve düzenli ifadeler üzerinden bu kodun avantajı öyle mi verilen metne

private ArrayList<String> get_Words(String SInput){ 

    StringBuilder stringBuffer = new StringBuilder(SInput); 
    ArrayList<String> all_Words_List = new ArrayList<String>(); 

    String SWord = ""; 
    for(int i=0; i<stringBuffer.length(); i++){ 
     Character charAt = stringBuffer.charAt(i); 
     if(Character.isAlphabetic(charAt) || Character.isDigit(charAt)){ 
      SWord = SWord + charAt; 
     } 
     else{ 
      if(!SWord.isEmpty()) all_Words_List.add(new String(SWord)); 
      SWord = ""; 
     } 

    } 

    return all_Words_List; 

}