Liczenie słów w tekście

Liczenie słów w tekście
kllewy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
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.

Kopiuj
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();
		}
	}
}
S7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
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.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Ja bym robił tak:

Kopiuj
            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.

pedegie
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 204
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)

niezdecydowany
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Bieszczady
1
Kopiuj
   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

Kopiuj
"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ć:

Kopiuj
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.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

Ja bym zrobił tak:

Kopiuj
        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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.