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

Как лучше всего найти общее количество слов в текстовом файле на Java? Я думаю, что Perl лучше всего подходит для поиска таких вещей. Если это правда, то вызов функции Perl из Java был бы лучшим? Что бы вы сделали в таком состоянии? Есть идеи получше?


person ashokgelal    schedule 10.11.2008    source источник


Ответы (5)


Поздравляем, вы столкнулись с одной из самых больших лингвистических проблем! Что такое слово? Говорят, что слово — это единственное слово, которое на самом деле означает то, что оно есть. Есть целая область языкознания, посвященная словам/единицам значения - Морфология.

Я предполагаю, что ваш вопрос относится к подсчету слов на английском языке. Однако создание независимого от языка счетчика/парсера слов практически невозможно из-за лингвистических различий. Например, можно подумать, что достаточно просто обработать группы символов, разделенных пробелом. Однако, если вы посмотрите на следующий пример на японском языке, вы увидите, что такой подход не работает:

これは日本語の例文です。

Этот пример содержит 3 разных слова, и ни одно из них не разделено пробелами. Как правило, границы японских слов анализируются с использованием подхода на основе словаря, и для этого существует ряд коммерческих библиотек. Нам повезло, что есть пробелы на английском языке! Я считаю, что индийские языки, китайский и корейский также имеют схожие проблемы.

Если это решение будет фактически развернуто любым способом, обеспечивающим многоязычный ввод, будет важно иметь возможность подключать различные методы подсчета слов в зависимости от анализируемого языка.

Я думаю, что первый ответ был хорошим, потому что он использует знания Java о значениях пробелов Unicode в качестве разделителей. Он токенизирует путем сопоставления с использованием следующего регулярного выражения: \p{javaWhitespace}+

person Elijah    schedule 10.11.2008
comment
Будьте осторожны при использовании \p{javaWhiteSpace} в Java, потому что это не соответствует свойству Unicode \p{Space}, которое вы можете найти в Perl. Оба охватывают кодовые точки 0009, 000A, 000B, 000C, 000D, 00A0, 2007 и 202F. Пробелы Java также включают 001C, 001D, 001E, которые не являются пробелами Unicode. Пробелы Java игнорируют несколько кодовых точек пробелов Unicode, наиболее вопиющей из которых является 00A0, NO-BREAK SPACE. Это доставляло мне неприятности раньше, так что будьте очень осторожны. - person tchrist; 30.10.2010
comment
Отличный комментарий. Недавно я обнаружил, что то же самое верно и для C#. - person Elijah; 01.11.2010

Хотя Perl может это сделать, я бы посчитал излишним связать его/вызвать его для такого рода задач (если вы еще не проверили это).

  • Мое предложение состояло бы в том, чтобы искать и учиться на коде, который делает то, что вам нужно в Интернете, например. здесь: http://schmidt.devlib.org/java/word-count.html< /а>
person lexu    schedule 10.11.2008

Если вы используете Unix, wc -w filename поможет.

person Leon Timmermans    schedule 10.11.2008

делая некоторые предположения о том, что определяет «слово», одним из решений было бы открыть файл с помощью средства чтения текстового потока и отсканировать его, подсчитав количество несмежных пробельных символов плюс один в конце, например.

 this is some sample text
 this is some more sample text

в приведенном выше тексте будет 11 слов, которые считаются 9 пробелами, 1 новой строкой и 1 концом файла.

person Steven A. Lowe    schedule 10.11.2008

Я бы инициализировал word_count int значением 1, затем прокручивал каждый символ в файле и увеличивал word_count для каждого символа пробела, если только предыдущий символ не был символом пробела. (Пробел, табуляция или новая строка.)

person Paige Ruten    schedule 10.11.2008