2008-11-09 6 views
10

Допустим, у вас есть текстовый файл, как этот: http://www.gutenberg.org/files/17921/17921-8.txtИзвлечение слова из текстового файла

ли кто-нибудь есть хороший алгоритм, или с открытым исходным кодом, чтобы извлечь слова из текстового файла? Как получить все слова, избегая специальных символов и сохраняя такие вещи, как «это» и т. Д.

Я работаю на Java. Thanks

ответ

17

Это звучит как правильная работа для регулярных выражений. Вот некоторые Java-код, чтобы дать вам представление о том, в случае, если вы не знаете, как начать:

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())); 
} 

Узор [\w']+ матчи все символы слово и апостроф, несколько раз. Строка примера будет печататься поочередно. Посмотрите на Java Pattern class documentation, чтобы узнать больше.

0

Вы можете попробовать регулярное выражение, используя узор, который вы создали, и запустить подсчет количества найденных паттернов.

3

псевдокод будет выглядеть следующим образом:

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 

код питона будет что-то вроде этого:

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

где

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

или любые другие символы, которые вы хотите удалить.

Я считаю, что Java имеет эквивалентные функции в классе String: String .split().


Вывод выполнения этого кода на текст, который вы указали в ссылке:

>>> 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

Преимущество этого кода над регулярными выражениями в том, что может быть сделано просто за один проход. – 2008-11-09 22:43:05

+0

Да Java имеет метод «split», но он не имеет эквивалента метода «strip». – 2008-11-09 22:43:30

1

В принципе, вы хотите, чтобы соответствовать

([A-Za-Z]) + (» ([A-Za-Z]) *)?

правый?

3

Вот хороший подход к вашей проблеме: Эта функция принимает текст в качестве входных данных и возвращает массив всех слов внутри данного текста

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; 

} 
Смежные вопросы