Я бы сослался на приведенные выше отличные ответы для реструктуризации и избыточности, но также добавил бы (поскольку OP хочет объяснений), что большинство, если не все используемые здесь методы регулярного выражения / разбиения, будут либо толкать слова и включать в себя начальную / конечную пунктуацию,или ошибочно разделить слова.
Использование \w
разделяет на дефисы и одинарные кавычки, что может привести к вводящим в заблуждение результатам, в зависимости от того, что вам нужно.
Например, "привет ...?"имеет большую длину, чем «самая длинная», считая все знаки препинания. Также «Вы» - это одно слово, а не два, поэтому проблематично разделять пробелами или полагаться только на \w
.
При разбиении текстового содержимого на слова следует (если обработка текста, я думаю, этодомашнее задание) не только полагаться на пробелы. Я использую это регулярное выражение в текущем, еще не опубликованном проекте: /[\s.,:;!?_<>{}()[\]"`´^$°§½¼³%&¬+=*~#|/\\]/
Вышеупомянутое регулярное выражение допускает дефисные слова, которые, хотя технически несколько слов объединены, часто читаются / обрабатываются как одно слово, то есть когдасоздать существительное janky-type-compund-noun, как я только что это сделал.
Наконец, язык имеет значение. Разделение текстового содержимого с помощью приведенного выше регулярного выражения работает очень хорошо для английского языка и не разделяет слова по одинарным кавычкам, потому что тогда мы будем разделять «ты лжец!»в ["you", "re", "a", "liar"]
, так что вам все равно придется очистить результирующий массив слов от окружающих одинарных кавычек (опять же, они могут быть множественными, возможно, пользователь написал «Добрый вечер!») по ошибке).
Резюме: фундаментальная часть выполнения NLP (обработка на естественном языке) почти всегда должна включать в себя этап «очистки текста» и полагаться на пробел или встроенный специальный символ \w
, даже при обработке текста на английском языке, не будетотрежь.