Что делает nltk.word_tokenize()?
Функция nltk.word_tokenize() — это часть библиотеки NLTK (Natural Language Toolkit), предназначенная для токенизации текста на уровне слов. Она выполняет важную задачу в обработке естественного языка (NLP): разбивает входной текст на последовательность токенов, при этом учитывая грамматические, пунктуационные и лексические особенности языка (в основном английского).
Основное назначение
Функция nltk.word_tokenize(text) разбивает строку text на список токенов — слов, чисел, знаков препинания и прочих единиц текста, которые имеют смысл в контексте обработки. В отличие от простого разбиения по пробелу (.split()), она учитывает сложные случаи:
-
сокращения: "isn't" → ["is", "n't"]
-
пунктуацию: “Hello!” → ["Hello", "!"]
-
кавычки, скобки, апострофы и т.д.
Что используется внутри
Под капотом nltk.word_tokenize() использует токенизатор TreebankWordTokenizer, основанный на грамматике Penn Treebank — это корпус аннотированного текста, широко применяемый в английской NLP.
TreebankTokenizer содержит регулярные выражения, основанные на:
-
английской пунктуации
-
грамматических правилах: например, отделение 's, n't, ,, --, ...
-
логике сокращений, чисел, спецсимволов
Примеры
from nltk.tokenize import word_tokenize
text = "They've been running, haven't they?"
tokens = word_tokenize(text)
print(tokens)
Вывод:
\['They', "'ve", 'been', 'running', ',', 'have', "n't", 'they', '?'\]
-
've — отделяется как токен
-
'n't → n't — также отдельный токен
-
, и ? — отдельные токены
-
running — остаётся цельным словом
В чём разница с другими методами токенизации
Метод | Пример токенизации "Don't go!" |
---|---|
str.split() | ["Don't", "go!"] |
--- | --- |
word_tokenize() | ["Do", "n't", "go", "!"] |
--- | --- |
TreebankWordTokenizer() | ["Do", "n't", "go", "!"] |
--- | --- |
RegexpTokenizer('\w+') | ["Don", "t", "go"] — удаляет апостроф, пунктуацию |
--- | --- |
ToktokTokenizer (nltk) | ["Don't", "go", "!"] — не разбивает 'n't |
--- | --- |
spaCy токенизация | ["Do", "n't", "go", "!"] или ["Don't", "go", "!"] в зависимости от конфигурации |
--- | --- |
Особенности и тонкости
-
Токенизация чувствительна к контексту языка: word_tokenize() лучше всего работает с английским языком. Для русского она может давать неудовлетворительные результаты.
-
Обрабатывает сокращения:
"he's" → ["he", "'s"],
"we'll" → ["we", "'ll"] -
Знает о стандартах кавычек: "``", "''" → открывающие/закрывающие
-
Знаки препинания обрабатываются как отдельные токены
-
Разбивает дефисы: "well-known" → ["well-known"] (не разбивает)
Тестирование с различными примерами
Пример 1:
text = "She said, 'I'm not going.'"
word_tokenize(text)
Вывод:
\['She', 'said', ',', "'", 'I', "'m", 'not', 'going', '.', "'"\]
Пример 2:
text = "U.S.A. is a country."
word_tokenize(text)
Вывод:
\['U.S.A.', 'is', 'a', 'country', '.'\]
- U.S.A. распознаётся как одно целое
Пример 3:
text = "Let's test NLTK's tokenizer."
word_tokenize(text)
Вывод:
\['Let', "'s", 'test', 'NLTK', "'s", 'tokenizer', '.'\]
- 's разделяется в обоих случаях (let's, NLTK's)
Языковая ограниченность
Функция nltk.word_tokenize() разработана для английского языка. В случае с другими языками, особенно флективными (русский, немецкий), результат может быть неадекватным.
Пример для русского:
text = "Я люблю машинное обучение."
word_tokenize(text)
Вывод:
\['Я', 'люблю', 'машинное', 'обучение', '.'\]
Результат корректен, но только при простых предложениях. Более сложные конструкции или сокращения уже могут вызвать ошибки.
Для русского предпочтительнее:
-
razdel — токенизатор от Natasha
-
spacy (с моделью ru_core_news_md)
-
nltk.RegexpTokenizer() с кастомной регуляркой
Зависимости и инициализация
Чтобы использовать word_tokenize() впервые, нужно загрузить необходимые модели:
import nltk
nltk.download('punkt')
punkt — это обученная модель сегментации текста, которая лежит в основе word_tokenize().
Использование в NLP пайплайнах
word_tokenize() — первая стадия в большинстве NLP-задач:
-
**Препроцессинг текста:
**-
Удаление лишних символов
-
Приведение к нижнему регистру
-
-
**Токенизация (в том числе word_tokenize)
** - **Лемматизация / стемминг
** - **Удаление стоп-слов
** - **POS-теггинг
** - **NER, зависимостный парсинг, классификация и т.д.
**
Альтернатива: ручная замена через RegexpTokenizer
Если нужна токенизация с кастомным поведением:
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize("He's working on AI-based systems.")
Вывод:
\['He', 's', 'working', 'on', 'AI', 'based', 'systems'\]
Здесь "He's" неправильно разбито → потеря смысла.
nltk.word_tokenize() — это мощный и гибкий инструмент, особенно при работе с английским текстом. Он обрабатывает пунктуацию, сокращения и многие особенности синтаксиса, обеспечивая качественную сегментацию текста на токены.