Как лучше всего определить общее количество слов файла в Java?
-
07-07-2019 - |
Вопрос
Как лучше всего найти общее количество слов в текстовом файле на Java?Я думаю, что Perl лучше всех справляется с поиском подобных вещей.Если это правда, то лучше всего было бы вызвать функцию Perl из Java?Что бы вы сделали в такой ситуации?Есть идеи получше?
Решение
Поздравляем, вы столкнулись с одной из самых больших лингвистических проблем!Что такое слово?Говорят, что слово — единственное слово, которое на самом деле означает то, что оно есть.Существует целая область лингвистики, посвященная словам/единицам значения – Морфология.
Я предполагаю, что ваш вопрос касается подсчета слов в английском языке.Однако создание независимого от языка счетчика/парсера слов практически невозможно из-за языковых различий.Например, можно подумать, что достаточно просто обработать группы символов, разделенных пробелами.Однако если вы посмотрите на следующий пример на японском языке, вы увидите, что этот подход не работает:
これは日本語の例文です。
Этот пример содержит 3 разных слова, и ни одно из них не разделено пробелами.Обычно границы японских слов анализируются с использованием словарного подхода, и для этого существует ряд коммерческих библиотек.Нам повезло, что у нас есть места на английском языке!Я считаю, что индийские языки, китайский и корейский также имеют схожие проблемы.
Если это решение действительно будет реализовано любым способом, обеспечивающим многоязычный ввод, важно будет иметь возможность подключать различные методы подсчета слов в зависимости от анализируемого языка.
Я думаю, что первый ответ был хорошим ответом, потому что он использует знания Java о значениях пробелов Unicode в качестве разделителей.Он токенизируется путем сопоставления с использованием следующего регулярного выражения: \p{javaWhitespace}+
Другие советы
int count = 0;
Scanner sc = new Scanner(new File("my-text-file.txt"));
while (sc.hasNext()) {
++count;
sc.next();
}
Хотя Perl может это сделать, я бы посчитал излишним связывать его или вызывать для такого рода задач (если только вы это уже не протестировали).
- Я предлагаю искать и учиться на коде, который делает то, что вам нужно, в Интернете, например.здесь: http://schmidt.devlib.org/java/word-count.html
Если вы работаете в Unix, wc -w filename
поможет вам.
Делая некоторые предположения о том, что определяет «слово», одним из решений было бы открыть файл с помощью программы чтения текстового потока и отсканировать его, считая количество несмежных пробельных символов плюс один для конца, например р>
this is some sample text
this is some more sample text
в приведенном выше тексте будет 11 слов, которые будут считаться 9 пробелами, 1 новой строкой и 1 концом файла
Я бы инициализировал word_count
int равным 1, а затем перебрал бы каждый символ в файле и увеличивал word_count
для каждого пробельного символа , если только предыдущий символ был символом пробела. (Пробел, табуляция или новая строка.)