извлекать слова из файла, затем считать частоту - PullRequest
0 голосов
/ 27 ноября 2011

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

Например: word - "новости "появляется 47 раз в 20 файлах.На данный момент мне удается только прочитать все 20 файлов, прочитанных в моей программе (я сохранил все данные в одном файле - (String docBus), но мне нужна помощь с извлечением слов (слово за словом) из (String docBus) встроковый массив ... кстати, файлы содержат знаки препинания, цифры ... и т. д. ... но все, что мне нужно, это подсчитать частоту слов ... поэтому мне нужно избегать этих знаков препинания в моей программе ...мой код пока:

public class Count extends javax.swing.JFrame {

ArrayList<String> fileBusName = new ArrayList<String>();
String docBus = "";

private void returnBusFilenName(){
    String str = "";
    for(int i = 1; i <= 20; i++){
        str = "nlg/bus" + i + ".txt";
        fileBusName.add(str);
    }
}

private String getFile(String file){
    String strLine = "", str = "";
    try{

        BufferedReader in = new BufferedReader(new FileReader(file));
        while((strLine = in.readLine()) != null){
            str += strLine + "\n ";
        }
        in.close();

    }catch(Exception e){

    }
    return str;
}

private void getDocBus(){
    returnBusFilenName();
    for(int i=0; i<=19; i++){
        docBus = docBus + getFile(fileBusName.get(i));
    }   
}

Ответы [ 4 ]

1 голос
/ 27 ноября 2011

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

Вероятно, самый простой способ сделать этоэто иметь карту, которая содержит каждое слово, которое вы найдете, и он найден.Ваша функция обновления может выглядеть примерно так:

String s = //method that scans until a delimiter is found
if (map.get(s)) == null) {
   map.put(s, 1);
} else {
   map.put(s, map.get(s) + 1);
}

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

1 голос
/ 27 ноября 2011

попробуйте использовать java.util.Scanner.

Scanner scanner = new Scanner(inputFile);
scanner.useDelimiter("[^a-zA-Z]"); // non alphabets act as delimeters
String word = scanner.next();
0 голосов
/ 19 июля 2012

У меня есть пара рекомендаций по этому вопросу:

  1. StringBuilder следует использовать вместо String по всем направлениям.Чем больше файлов вы обрабатываете, тем больше с помощью String вы получите
  2. (Word) токенизация - нетривиальная задача.Есть много прекрасных библиотек, которые помогут вам получить набор слов.Отсюда вы можете сделать эту коллекцию уникальной или не уникальной.Так как вам нужно рассчитывать, каждое вхождение уникально.Итак, что касается рекомендации для токенизатора, я бы предложил Penken Treebank Tokenizer, например, здесь, в CMU
0 голосов
/ 27 ноября 2011

Прежде всего, если размер входного файла достаточно велик, например, в ГБ, ТБ или более, вам может быть интересно выполнить ту же работу, используя процессы Hadoop и MapReduce.Однако для меньшего ввода данных они не подходят.Однако в обоих случаях вы можете использовать Apache Lucene для анализа и токенизации вашего входного текста.Lucene в основном предназначен для индексирования и поиска очень больших данных, однако вы все равно можете использовать их для решения своей проблемы, потому что среда Analyzer и Tokenizer очень хороша для таких ситуаций, как ваша.

И если вы не хотите ничегоВы должны просто заменить все знаки препинания и цифры каким-либо другим символом, который не будет мешать следующему процессу, например, пробел ''.Вы можете добиться этого с помощью регулярных выражений.Далее, вы можете снова найти частоту слов, используя регулярные выражения, если вас интересуют некоторые предопределенные слова.Если вам нужно вычислить частоту всех слов, присутствующих во входных данных, вы все равно можете использовать регулярные выражения, чтобы сделать это.Сначала сопоставьте шаблон слова, используя RegEx, затем для каждого подходящего слова, через которое вы можете пройти итерацию, просто сохраняйте хэш-карту с каждым словом в качестве ключа и просто увеличивайте значения хэш-карты на основе ключей.Этот метод также имеет расширенные параметры фильтрации, такие как не считая частоты для слов, длина которых меньше 2 или аналогичных.При написании этого ответа я получил хороший пример , делающий то же самое.:) Надеюсь, это поможет.

...