Как лучше всего определить общее количество слов файла в Java?

StackOverflow https://stackoverflow.com/questions/277143

  •  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 может это сделать, я бы посчитал излишним связывать его или вызывать для такого рода задач (если только вы это уже не протестировали).

Если вы работаете в 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 для каждого пробельного символа , если только предыдущий символ был символом пробела. (Пробел, табуляция или новая строка.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top