Liczenie słów w tekście

0

W pierwszej wersji tego kodu, wyliczało mi ile jest każdej literki w tekście. Mam go przerobić tak, aby policzył mi ile jest każdego słowa w tekście. Coś mi zaświtało, że może by użyć do tego substring ale nie mam pojęcia jak wskazać gdzie wyraz się kończy. Dopowiem, że robię to na tekście "Pana Tadeusza", czyli linijka po linijce. Proszę o pomoc.

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map.Entry;

public class LiczenieSlow {
    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new FileReader("plik2"));
            String linia;
            HashMap<String, Integer> ilosc = new HashMap<String, Integer>();
            while ((linia = br.readLine()) != null) {
                for (int i = 0; i < linia.length(); i++) {
                    if (!ilosc.containsKey(linia.substring(i, ??))) {
                        ilosc.put(linia.substring(i, ??), 1);
                    }else {
                        ilosc.put(linia.substring(i, ??),+1);
                    }
                }
            }
            for (Entry<String, Integer> entry:ilosc.entrySet()) {
                System.out.println(entry.getKey() + "   x   " + entry.getValue());
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
0

Kodowanie znaków w Javie to chyba ASCII, więc powinno pomóc sprawdzenie jaki kod ma spacja/kropka itp. Indekser/operator[] string'a zwraca chyba char, więc nie powinno być problemu :). Przy czym substring() nie będzie tu chyba pomocny, a przynajmniej w tej postaci. Tak mi się wydaje.

0

Ja bym robił tak:

            while ((linia = br.readLine()) != null) {
                Scanner sc = new Scaner(linia);
                while(sc.hasNext()){
                    String word = sc.next();              
                    if (!ilosc.containsKey(word)) {
                        ilosc.put(word, 1);
                    }else {
                        ilosc.put(word,ilosc.get(word)+1);
                    }
                }
            }

Pewnie trzeba ze zmiennej word pousuwać znaki interpunkcyjne, ustalić czy np. "1815" jest słowem, oraz czy "moja" i "Moja" to różne słowa.

0

wejdź tu - http://edu.pjwstk.edu.pl/wyklady/ppj/scb/ -> Spis treści -> Przetwarzanie danych, napisy i liczby
tam jest ładnie wyjaśnione jak wyłuskiwać podnapisy, zmieniać separator np w Scannerze i o wyrażeniach regularnych trochę (klasy Pattern i Matcher)

1
   Map<String, Integer> m = new HashMap<>();

    for (String a : source) {
        Integer freq = m.get(a);
        m.put(a, (freq == null) ? 1 : freq + 1);
    }

    System.out.println(m.size() + " distinct words:");
    System.out.println(m);

gdzie source możesz uzyskać przez np: zwykłego ordynarnego

"java Freq if it is to be it is up to me to delegate".split(" ")

tak tak, zajeb!@#łem przykład z dokumentacji #thug_life

Updejt:

Jak dostajesz tego Pana Mateusza w stringu to możesz go przefiltrować:

przefiltrowanyPanMateusz = panMateusz.replaceAll("[^A-Za-z0-9 ]", "").toLowerCase();

Dodatkowo możesz zrobić na tym toLowerCase, albo dodać własną implementacje comparatora do colleckji, ale to już chyba zbędne.

1

Ja bym zrobił tak:

        Map<String, Long> wordcount = Files.lines(Paths.get("plik"))
                .flatMap(line -> Stream.of(line.split(" ")))
                .map(String::toLowerCase)
                .collect(Collectors.groupingBy(
                        word -> word,
                        Collectors.counting()
                ));
        System.out.println(wordcount);

Ewentualnie dorzucic jeszcze .filter() przed collect i odciać nie-wyrazy / wywalić interpukcje czy coś jeśli masz taki kaprys

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