Что делает 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-задач:

  1. **Препроцессинг текста:
    **

    • Удаление лишних символов

    • Приведение к нижнему регистру

  2. **Токенизация (в том числе word_tokenize)
    **

  3. **Лемматизация / стемминг
    **
  4. **Удаление стоп-слов
    **
  5. **POS-теггинг
    **
  6. **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() — это мощный и гибкий инструмент, особенно при работе с английским текстом. Он обрабатывает пунктуацию, сокращения и многие особенности синтаксиса, обеспечивая качественную сегментацию текста на токены.