Как подсчитать статистику уникальных слов?
Задание: Скачать HTML страницу, с помощью списка разделителей подсчитать количество уникальных слов и вывести статистику в консоль.
Скачал страницу с помощью библиотеки Jsoup, список создал, но как действовать теперь не знаю.
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class Parser {
private static Document getPage() throws IOException {
String url = "https://yandex.ru/";
Document page = Jsoup.parse(new URL(url), 3000);
return page;
}
public static void main(String[] args) throws IOException {
ArrayList<String> listOfSeparators = new ArrayList<String>();
listOfSeparators.add(" ");
listOfSeparators.add(",");
listOfSeparators.add(".");
listOfSeparators.add("!");
listOfSeparators.add("?");
listOfSeparators.add("(");
listOfSeparators.add(")");
listOfSeparators.add("[");
listOfSeparators.add("]");
listOfSeparators.add("-");
listOfSeparators.add(";");
listOfSeparators.add(":");
listOfSeparators.add("\n");
listOfSeparators.add("\r");
listOfSeparators.add("\t");
System.out.println(getPage());
}
}
Ответы (1 шт):
Автор решения: Анастасия
→ Ссылка
Немного изменённый код, приведенный когда-то JonasCz на англоязычном SO
Суть в том, чтобы документ преобразовать в String, по разделителям разделить документ на слова и записывать их в HashMap с учетом уже существующих и подсчетом количества.
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.*;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class Parser {
private static Document getPage() throws IOException {
String url = "https://jsoup.org";
Document page = Jsoup.parse(new URL(url), 3000);
return page;
}
public static void main(String[] args) throws IOException {
ArrayList<String> listOfSeparators = new ArrayList<String>();
listOfSeparators.add(" ");
listOfSeparators.add(",");
listOfSeparators.add(".");
listOfSeparators.add("!");
listOfSeparators.add("?");
listOfSeparators.add("(");
listOfSeparators.add(")");
listOfSeparators.add("[");
listOfSeparators.add("]");
listOfSeparators.add("-");
listOfSeparators.add(";");
listOfSeparators.add(":");
listOfSeparators.add("\n");
listOfSeparators.add("\r");
listOfSeparators.add("\t");
//System.out.println(getPage());
String pagetext = getPage().text();
String separatorsString = String.join("|\\", listOfSeparators);
Map<String, Word> countMap = new HashMap<String, Word>();
BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(pagetext.getBytes(StandardCharsets.UTF_8))));
String line;
while ((line = reader.readLine()) != null) {
String[] words = line.split(separatorsString);
for (String word : words) {
if ("".equals(word)) {
continue;
}
Word wordObj = countMap.get(word);
if (wordObj == null) {
wordObj = new Word();
wordObj.word = word;
wordObj.count = 0;
countMap.put(word, wordObj);
}
wordObj.count++;
}
}
reader.close();
SortedSet<Word> sortedWords = new TreeSet<Word>(countMap.values());
for (Word word : sortedWords) {
System.out.println(word.count + "\t" + word.word);
}
}
public static class Word implements Comparable<Word> {
String word;
int count;
@Override
public int hashCode() { return word.hashCode(); }
@Override
public boolean equals(Object obj) { return word.equals(((Word)obj).word); }
@Override
public int compareTo(Word b) { return b.count - count; }
}
}
Проверить на https://yandex.ru/ не могу, так как он заблокирован, поэтому протестировала на https://jsoup.org.
Результат:
19 the
17 a
15 and
14 HTML
11 to
9 of
7 from
6 DOM
5 source
4 Document
3 you
2 using
1 Parse