Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как удалить совпадающие слова? / 15 сообщений из 15, страница 1 из 1
02.05.2017, 17:52
    #39447522
Su-27
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Существует следующая проблема. Есть 2 текстовых файла. В первом файле находится большой по объему текст, а во втором файле перечислены предлоги, союзы, союзные слова и местоимения, которые могут встречаться (а могут и не встречаться) в тексте первого файла. Нужно удалить все совпадающие слова из текста (т.е. все предлоги, союзы, союзные слова и местоимения). Я пытался реализовать это следующим образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    
String text = "";
                Scanner novelFile = new Scanner(new File("C:\\big_text.txt")); 
                while(novelFile.hasNext()){
    		text += novelFile.nextLine() + "\r\n";
                }
    String words = "";
     Scanner deleteWords = new Scanner(new File("C:\\words.txt")); 
    Set<String> wordSet = new HashSet<>();
                while (deleteWords.hasNext()) {
                wordSet.add(deleteWords.next().toLowerCase());
                }
    String word = null;
                     String result;
                     if(text.equals(wordSet)){
                      result=text.replaceAll(word, "");
                   }
...
Рейтинг: 0 / 0
02.05.2017, 20:07
    #39447560
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Непонятно что на выходе то должно быть?
Ваш код крайне неэффективный, я бы делал как-то так -
1) вычитываем файл текста
2) разбиваем его на строки
3) каждую строку разбиваем на слова по пробелу
4) проверяем каждое слово, содержится ли в stop words или нет, если содержится - фильтруем
5) объелиняем все слова обратно в текст
...
Рейтинг: 0 / 0
02.05.2017, 23:30
    #39447616
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
забыл никвычитываем файл текстакуда? :)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Reader inputFile
Set stopWords

Writer outputFile
while (line = inputFile.read) {
  String newLine = getLineWordsWithoutStopWords(line, stopWords)
  outputFile.write(newLine)
}

String getLineWordsWithoutStopWords(srcLine, stopWords) {
  String[] srcLineWords = srcLine.split("\\s")
  
  srcLineWords.each word {
    if (stopWords.contains(word)) continue

    result += word + " "
  } 
}
...
Рейтинг: 0 / 0
02.05.2017, 23:39
    #39447619
Su-27
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
забыл ник, спасибо за ваш ответ! Но мне не совсем понятны некоторые моменты.

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

забыл ник 4) проверяем каждое слово, содержится ли в stop words или нет, если содержится - фильтруем
Каким образом их фильтровать?

забыл ник 5) объелиняем все слова обратно в текст
Как это реализовать?
...
Рейтинг: 0 / 0
03.05.2017, 01:28
    #39447637
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Su-27,

grasoff.net привел довольно понятный псевдокод, разбирайтесь.
Судя по всему вы в java новичок, поэтому вот пару советов

1) вычитывать файл вам надо через BuferredReader, смотреть здесь - https://www.mkyong.com/java/java-read-a-text-file-line-by-line/ (2 раздел). Если хочется разобраться как это лучше и эффективнее сделать на java 8 то смотреть здесь - https://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/ но это более продвинутый левел

2) Чтобы фильтрануть слово вам надо будет реализовать нечто вроде

if stopWords.contains(word) skip else add
В общем смотрите метод contains у Set

3) Объединять слова можно либо через конкатенацию(лучше так не делать в цикле) либо через объект StringBuilder, нагуглите сами о нем
...
Рейтинг: 0 / 0
03.05.2017, 16:34
    #39448020
Su-27
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
забыл ник, спасибо за ваш ответ!

забыл ник 1) вычитывать файл вам надо через BuferredReader, смотреть здесь - https://www.mkyong.com/java/java-read-a-text-file-line-by-line/ (2 раздел).
Сделал считывание файла через BuferredReader, как вы и советовали, но возникла следующая проблема: считывается только первое слово в тексте(его заголовок), а как сделать чтобы считывался весь текст?
...
Рейтинг: 0 / 0
03.05.2017, 17:04
    #39448038
Vurn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
import java.io.*;
import java.nio.CharBuffer;
import java.util.regex.Pattern;

public class Main implements Runnable{
    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("dic.txt"), "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String s;
            while ((s = br.readLine()) != null) {
                sb.append(s).append('|');
            }
            if (sb.length() == 0) {
                return;
            }
            sb.setLength(sb.length() - 1);
            Pattern p = Pattern.compile(sb.toString());

            br.close();
            br =null;
            File f = new File("txt.txt");
            char[] arr= new char[(int)f.length()];
            InputStreamReader isr = new InputStreamReader(new FileInputStream(f),"UTF-8");
            int read = isr.read(arr, 0, arr.length);
            CharBuffer cd = CharBuffer.wrap(arr, 0, read);
            String target = p.matcher(cd).replaceAll("");
            System.out.println(target);

        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public static void main(String[] args) throws IOException {
        new Main().run();
    }
}



не проверял, но должно работать с "полпинка". словарь - "dic.txt", текст для правки - "txt.txt", кодировка UTF-8
...
Рейтинг: 0 / 0
03.05.2017, 17:09
    #39448041
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Vurnне проверял, но должно работать с "полпинка". словарь - "dic.txt", текст для правки - "txt.txt", кодировка UTF-8
Жуть какая.
...
Рейтинг: 0 / 0
03.05.2017, 18:30
    #39448112
Su-27
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Vurn
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
import java.io.*;
import java.nio.CharBuffer;
import java.util.regex.Pattern;

public class Main implements Runnable{
    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("dic.txt"), "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String s;
            while ((s = br.readLine()) != null) {
                sb.append(s).append('|');
            }
            if (sb.length() == 0) {
                return;
            }
            sb.setLength(sb.length() - 1);
            Pattern p = Pattern.compile(sb.toString());

            br.close();
            br =null;
            File f = new File("txt.txt");
            char[] arr= new char[(int)f.length()];
            InputStreamReader isr = new InputStreamReader(new FileInputStream(f),"UTF-8");
            int read = isr.read(arr, 0, arr.length);
            CharBuffer cd = CharBuffer.wrap(arr, 0, read);
            String target = p.matcher(cd).replaceAll("");
            System.out.println(target);

        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public static void main(String[] args) throws IOException {
        new Main().run();
    }
}



не проверял, но должно работать с "полпинка". словарь - "dic.txt", текст для правки - "txt.txt", кодировка UTF-8

Vurn, спасибо за ваш ответ! Я проверил, но код работает не так как нужно. Ваша программа удаляет некоторую часть слов.
Вот первое предложение из текста: "In the corner of a first-class smoking carriage, Mr. Justice Wargrave, lately retired from the bench, puffed at a cigar and ran an interested eye through the political news in the Times."
А вот что выводит программа: "In corner a -cls smokg carriage, Mr. Jtice Wargrave, lely retired bench, puffed a cigar d r terested eye polical s Tis."
...
Рейтинг: 0 / 0
03.05.2017, 19:16
    #39448131
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Su-27
Код: java
1.
if(text.equals(wordSet))



Это как вообще?
...
Рейтинг: 0 / 0
03.05.2017, 19:48
    #39448148
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
BlazkowiczЭто как вообще?Тип аргумента object . Все ок. Всегда будет false (:
...
Рейтинг: 0 / 0
03.05.2017, 19:57
    #39448155
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
UsmanТип аргумента object . Все ок. Всегда будет false (:
Спасибо, кэп. Просто не понятно чего этим студент хотел добиться.
...
Рейтинг: 0 / 0
03.05.2017, 20:02
    #39448159
Vurn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Su-27Vurn, спасибо за ваш ответ! Я проверил, но код работает не так как нужно. Ваша программа удаляет некоторую часть слов.
Вот первое предложение из текста: "In the corner of a first-class smoking carriage, Mr. Justice Wargrave, lately retired from the bench, puffed at a cigar and ran an interested eye through the political news in the Times."
А вот что выводит программа: "In corner a -cls smokg carriage, Mr. Jtice Wargrave, lely retired bench, puffed a cigar d r terested eye polical s Tis."

Ошибся в паттерне. Вот правильный паттерн:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
import java.io.*;
import java.nio.CharBuffer;
import java.util.regex.Pattern;

public class Main implements Runnable{
    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("dic.txt"), "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String s;
            while ((s = br.readLine()) != null) {
                sb.append(s).append("\\b\\s?").append('|');
            }
            if (sb.length() == 0) {
                return;
            }
            sb.setLength(sb.length() - 1);
            Pattern p = Pattern.compile(sb.toString(),Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);

            br.close();
            br =null;
            File f = new File("txt.txt");
            char[] arr= new char[(int)f.length()];
            InputStreamReader isr = new InputStreamReader(new FileInputStream(f),"UTF-8");
            int read = isr.read(arr, 0, arr.length);
            CharBuffer cd = CharBuffer.wrap(arr, 0, read);
            String target = p.matcher(cd).replaceAll("");
            System.out.println(target);

        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public static void main(String[] args) throws IOException {
        new Main().run();
    }
}
...
Рейтинг: 0 / 0
03.05.2017, 22:45
    #39448242
Vurn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Хехе! Вот еще более правильный паттерн:
Код: java
1.
2.
3.
            while ((s = br.readLine()) != null) {
                sb.append("\\b").append(s).append("\\b\\s?|");
            }
...
Рейтинг: 0 / 0
03.05.2017, 23:47
    #39448252
Su-27
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить совпадающие слова?
Vurn, все работает. Спасибо вам большое!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как удалить совпадающие слова? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]