Удалите стоп-слова из файла - многократное повторение приводит к дублированию контента и не удаляет слова - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь просмотреть кучу файлов, прочитать каждый из них и удалить все стоп-слова из указанного списка с такими словами.Результатом является катастрофа - содержимое всего файла копируется снова и снова.

Что я пробовал:
- Сохранение файла в виде строки и попытка просмотра с помощью регулярных выражений
- сохраняя файл в виде строки и перебирая строки за строкой и сравнивая токены со стоп-словами, хранящимися в LinkedHashSet, я также могу сохранить их в файле
- пытался несколько раз перевернуть логику ниже, получаявсе более и более нелепый вывод.
- попытался просмотреть текст / строку методом .contains(), но безуспешно

Моя общая логика следующая:

for every word in the stopwords set:
    while(file has more lines):
        save current line into String
        while (current line has more tokens):
            assign current token into String
            compare token with current stopword:
                if(token equals stopword):
                     write in the output file "" + " " 
                else: write in the output file the token as is

Пробовал, что в этом вопросе и многие другие вопросы SO, но просто не могу достичь того, что мне нужно.

Реальный код ниже:

private static void removeStopWords(File fileIn) throws IOException {
        File stopWordsTXT = new File("stopwords.txt");
        System.out.println("[Removing StopWords...] FILE: " + fileIn.getName() + "\n");

        // create file reader and go over it to save the stopwords into the Set data structure
        BufferedReader readerSW = new BufferedReader(new FileReader(stopWordsTXT));
        Set<String> stopWords = new LinkedHashSet<String>();

        for (String line; (line = readerSW.readLine()) != null; readerSW.readLine()) {
            // trim() eliminates leading and trailing spaces
            stopWords.add(line.trim());
        }           

        File outp = new File(fileIn.getPath().substring(0, fileIn.getPath().lastIndexOf('.')) + "_NoStopWords.txt");
        FileWriter fOut = new FileWriter(outp);

        Scanner readerTxt = new Scanner(new FileInputStream(fileIn), "UTF-8");
        while(readerTxt.hasNextLine()) {
            String line = readerTxt.nextLine();
            System.out.println(line);
            Scanner lineReader = new Scanner(line);

            for (String curSW : stopWords) {
                while(lineReader.hasNext()) {
                    String token = lineReader.next();
                    if(token.equals(curSW)) {
                        System.out.println("---> Removing SW: " + curSW);
                        fOut.write("" + " ");
                    } else {
                        fOut.write(token + " ");
                    }
                }
            }
            fOut.write("\n");
        }       
        fOut.close();
}

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

Часть моего списка стоп-слов

about
above
after
again
against
all
am
and
any
are
as
at

Под токенами я имею в виду слова, то есть получение каждого слова из строки и сравнение его с текущим стоп-словом

1 Ответ

0 голосов
/ 25 апреля 2018

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

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

Затем, когда вы сравнили их, я избавился от одного из ваших циклов, так как вы можете легко использовать метод .contains (), чтобы проверить, было ли слово stopWord.

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

-Мойпримерные стоп-слова txt файл: стоп-слова Words

-Мой входной файл сэмплов был точно таким же, поэтому он должен перехватывать все три слова.

Код:

// create file reader and go over it to save the stopwords into the Set data structure
BufferedReader readerSW = new BufferedReader(new FileReader("stopWords.txt"));
Set<String> stopWords = new LinkedHashSet<String>();
String stopWordsLine = readerSW.readLine();
while (stopWordsLine != null) {
 // trim() eliminates leading and trailing spaces
 Scanner words = new Scanner(stopWordsLine);
 String word = words.next();
 while(word != null) {
       stopWords.add(word.trim());   //Add the stop words to the set

       if(words.hasNext()) {
             word = words.next();   //If theres another line, read it
       }
       else {
            break;    //else break the inner while loop
       }

}

stopWordsLine = readerSW.readLine();
}           

BufferedReader outp = new BufferedReader(new FileReader("Words.txt"));
String line = outp.readLine();

while(line != null) {

 Scanner lineReader = new Scanner(line);
 String line2 = lineReader.next();
 while(line2 != null) {
     if(stopWords.contains(line2)) {
           System.out.println("removing " + line2);
         }
     if(lineReader.hasNext()) { //If theres another line, read it
        line2 = lineReader.next();
      }
      else {
           break;       //else break the first while loop
      }

}

lineReader.close();
    line = outp.readLine();
} 

OutPut:

removing Stop

removing words

removing Words

Дайте мне знать, могу ли я подробнее рассказать о своем коде или почему я что-то сделал!

...