Liczenie wyrazów i zdań

0

Muszę policzyć wyrazy i zdania w tekście. Mam obecnie coś takiego:

import java.io.*;
import java.util.Scanner;

class zad{

public static void main(String[] args) {
    try {
        System.out.println("Podaj ścieżkę dostępu do pliku: ");
        BufferedReader bufferr = new BufferedReader(new InputStreamReader(System.in));
        String sciezka = bufferr.readLine();
        FileReader in = new FileReader(sciezka);
        System.out.println("Liczba slów: " + slowa(in));
        in.close();
        buffer.close();

    } catch (FileNotFoundException e) {
        System.out.println("Plik nie istnieje");
        System.exit(1);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public static int slowa(FileReader plik) {
    Scanner s = new Scanner(plik);
    int licznik = 0;
    while (s.hasNext()) {
        s.useDelimiter("\\s*.\\s*").next();
        licznik++;
    }
    s.close();
    return licznik;
}
}

Tylko liczy ilość liter bez kropki. Usunięcie useDelimiter(), liczy słowa ale jeśli kropka jest osobno również ją policzy. Jak to rozwiązać, aby liczyło tylko wyrazy do końca zdania(. ! ?)

0

Metoda useDelimiter() nie służy do tego, by była wywoływana w pętli. Innymi słowy, ona zmienia konfigurację całego scannera i wystarczy wywołać ją raz.

Natomiast ja osobiście podszedłbym do tego inaczej:

  1. wczytywanie pliku linijka po linijce,
  2. wyszukiwanie w każdej linijce ciągów tekstu będących wyrazami (wyrażenie regularne),
  3. jeśli linijka kończy się wyrazem z myślnikiem na końcu, oznacza to przeniesienie wyrazu do następnej linijki - wtedy go nie zliczam, podliczony on zostanie w następnej linii.

W ten sposób jakieś dziwne ciągi znaków interpunkcyjnych czy duże wcięcia nie będą Cię w ogóle obchodzić.

0
zyxist napisał(a):

Metoda useDelimiter() nie służy do tego, by była wywoływana w pętli. Innymi słowy, ona zmienia konfigurację całego scannera i wystarczy wywołać ją raz.

Natomiast ja osobiście podszedłbym do tego inaczej:

  1. wczytywanie pliku linijka po linijce,
  2. wyszukiwanie w każdej linijce ciągów tekstu będących wyrazami (wyrażenie regularne),
  3. jeśli linijka kończy się wyrazem z myślnikiem na końcu, oznacza to przeniesienie wyrazu do następnej linijki - wtedy go nie zliczam, podliczony on zostanie w następnej linii.

W ten sposób jakieś dziwne ciągi znaków interpunkcyjnych czy duże wcięcia nie będą Cię w ogóle obchodzić.

Czyli muszę zapoznać się z metodami klasy Pattern i Matcher?

0

Tak, dokładnie z nimi, ale bez obaw - nie są one trudne :).

0

Ok mam na szybko kod,który liczy zdania(później go dostosuję pod mój program):


import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Main{
public static void main(String[] args){    
final String regex = "[a-zA-Ząćłęóżźń]+\\.";
final String string = "Ogólnie metody. rozwiązywania układów równań. ą."; //do testów

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
int licznik = 0;
//int licznik1 = 0;
while (matcher.find()) {
    licznik++;
}
System.out.println("zdanie: "+licznik);

    }
}

Ale mam kilka pytań:

  1. Czy da się dodać do regex jakos "lub" (chodzi mi o coś takiego jak ||, aby uwzględnić jeszcze inne znaki końca zdania )?
  2. Da się liczyć wyrazy z regex czy trzeba tworzyć regex2?
  3. Jak uwzględnić polskie znaki?
  4. W jaki sposób zliczyć że w 10 zadaniach było 11 wyrazów w 2 z było ich np 5?
0

Kod wygląda następująco:

import java.io.*;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class zad{

public static void main(String[] args) {
    try {
        System.out.println("Podaj ścieżkę dostępu do pliku: ");
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String sciezka = buffer.readLine();
        FileReader in = new FileReader(sciezka);
        FileReader in1 = new FileReader(sciezka);
        System.out.println("Liczba zdań: " + zdania(in));
        System.out.println("Liczba wyrazów: " + wyraz(in1));
        in.close();
        in1.close();
        buffer.close();

    } catch (FileNotFoundException e) {
        System.out.println("Plik nie istnieje");
        System.exit(1);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public static int zdania(FileReader plik) {
    Scanner s = new Scanner(plik);
    String regex = "\\.";
    Pattern pattern = Pattern.compile(regex);
    int licznik = 0;
    while (s.hasNext()) {
        String wiersz = s.next();
        Matcher matcher = pattern.matcher(wiersz);
        if(matcher.find())
        licznik++;
    }
    s.close();
    return licznik;
}

public static int wyraz(FileReader plik) {
    Scanner s = new Scanner(plik);
    String regex = "\\w";
    Pattern pattern = Pattern.compile(regex);
    int licznik = 0;
    while (s.hasNext()) {
        String wiersz = s.next();
        Matcher matcher = pattern.matcher(wiersz);
        if(matcher.find())
        licznik++;
    }
    s.close();
    return licznik;
}

}

Nadal aktualne pytania:1,3 i 4
Będę bardzo wdzięczny za odpowiedź :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0