Nltk.word tokenize: примеры (PYTHON)
nltk.word_tokenize(text: str): listОписание функции word_tokenize
Функция word_tokenize из модуля nltk.tokenize предназначена для разделения текстовой строки на отдельные слова или токены. Применяется в задачах предобработки текста перед лингвистическим анализом, машинным обучением или обработкой естественного языка (NLP).
Функция использует модель Punkt для предварительного разделения текста на предложения, что повышает точность токенизации, особенно в случае с точками, являющимися частью сокращений.
Аргументы:
- text (строка, обязательный): Входной текст для токенизации.
- language (строка, необязательный): Язык, используемый для токенизации. Значение по умолчанию -
'english'. Поддерживаемые языки зависят от загруженных моделей Punkt (например,'russian','spanish').
Возвращаемое значение:
- list (список строк): Список слов (токенов), извлеченных из входного текста. Знаки пунктуации, за исключением апострофов и дефисов внутри слов, обычно становятся отдельными токенами.
Примеры использования
Простой пример токенизации английского текста:
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
text = "Hello, world! This is NLTK."
tokens = word_tokenize(text)
print(tokens)['Hello', ',', 'world', '!', 'This', 'is', 'NLTK', '.']
Токенизация текста на другом языке с указанием параметра:
text_ru = "Привет, мир! Это пример."
tokens_ru = word_tokenize(text_ru, language='russian')
print(tokens_ru)['Привет', ',', 'мир', '!', 'Это', 'пример', '.']
Обработка текста со сложной пунктуацией и сокращениями:
text2 = "Mr. O'Neill paid $9.99 for a ticket at 5 p.m."
tokens2 = word_tokenize(text2)
print(tokens2)['Mr.', "O'Neill", 'paid', '$', '9.99', 'for', 'a', 'ticket', 'at', '5', 'p.m.']
Альтернативные функции в Python
Библиотека NLTK предлагает другие токенизаторы:
- sent_tokenize: Разделяет текст на предложения.
- regexp_tokenize: Разделяет текст по заданному регулярному выражению, что обеспечивает гибкость для специфичных шаблонов.
- TweetTokenizer: Специализированный токенизатор для текстов из социальных сетей, корректно обрабатывающий хештеги, упоминания и эмодзи.
- MWETokenizer: Токенизатор для выделения многокомпонентных выражений как единого токена.
В других библиотеках:
- spacy: Промышленный NLP-пайплайн, включающий более сложную и быструю токенизацию с учетом контекста и языка.
- str.split(): Базовая встроенная функция Python для простого разделения по пробелам, не учитывающая пунктуацию.
Выбор зависит от задачи: word_tokenize подходит для общего случая, TweetTokenizer - для соцсетей, а spacy - для комплексной обработки с высокой точностью.
Токенизация в других языках программирования
JavaScript (библиотека natural):
const natural = require('natural');
const tokenizer = new natural.WordTokenizer();
const tokens = tokenizer.tokenize("Hello, world! This is natural.");
console.log(tokens);[ 'Hello', 'world', 'This', 'is', 'natural' ]
Java (библиотека OpenNLP):
import opennlp.tools.tokenize.WhitespaceTokenizer;
String text = "Hello world! This is OpenNLP.";
String[] tokens = WhitespaceTokenizer.INSTANCE.tokenize(text);
System.out.println(Arrays.toString(tokens));[Hello, world!, This, is, OpenNLP.]
PHP (использование explode или регулярных выражений):
$text = "Hello, world! This is PHP.";
$tokens = preg_split('/[\s\p{P}]+/u', $text, -1, PREG_SPLIT_NO_EMPTY);
print_r($tokens);Array
(
[0] => Hello
[1] => world
[2] => This
[3] => is
[4] => PHP
)C# (библиотека SharpNLP): Требует установки пакетов и имеет схожий с NLTK подход, но менее распространен. Обычно используют встроенные методы разделения строк или специализированные NLP-библиотеки.
Отличие от Python-функции в том, что многие реализации проще и менее интеллектуальны, часто не различают точки в сокращениях без дополнительной настройки.
Типичные ошибки при использовании
1. Отсутствие загруженных ресурсов NLTK (модели Punkt).
import nltk
from nltk.tokenize import word_tokenize
text = "Test."
tokens = word_tokenize(text) # Без предварительной загрузки punktLookupError: ********************************************************************** Resource punkt not found. Please use the NLTK Downloader to obtain the resource...
2. Передача аргумента нестрокового типа.
tokens = word_tokenize(123) # Передача числаAttributeError: 'int' object has no attribute 'split'
3. Ожидание объединения знаков пунктуации со словами. Функция по умолчанию разделяет большинство знаков препинания.
tokens = word_tokenize("Hello... world?")
print(tokens)['Hello', '...', 'world', '?']
Изменения в функции
В последних версиях NLTK (например, 3.5 и выше) изменения в word_tokenize в основном связаны с обновлениями внутренних моделей Punkt для поддержки большего количества языков и улучшения точности. Сама функция сохраняет обратную совместимость по аргументам и возвращаемому значению. Для получения актуальной информации рекомендуется обращаться к официальной документации NLTK.
Расширенные примеры использования
Токенизация с последующей нормализацией (приведение к нижнему регистру и удаление пунктуации, не являющейся частью слова):
import string
from nltk.tokenize import word_tokenize
text = "Mr. O'Neill said: 'Hello, world! At 5 p.m.'"
tokens = word_tokenize(text)
normalized_tokens = [word.lower() for word in tokens if word not in string.punctuation]
print(normalized_tokens)['mr.', "o'neill", 'said', 'hello', 'world', 'at', '5', 'p.m.']
Использование токенизации в конвейере обработки текста для анализа тональности:
from nltk.tokenize import word_tokenize
from nltk.sentiment import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')
analyzer = SentimentIntensityAnalyzer()
text_review = "The film was great, but the ending was disappointing."
tokens = word_tokenize(text_review)
scores = analyzer.polarity_scores(text_review)
print("Токены:", tokens)
print("Оценки тональности:", scores)Токены: ['The', 'film', 'was', 'great', ',', 'but', 'the', 'ending', 'was', 'disappointing', '.']
Оценки тональности: {'neg': 0.272, 'neu': 0.508, 'pos': 0.22, 'compound': -0.341}Работа с текстом, содержащим специальные символы и цифры:
text_special = "Email: test@example.com, URL: https://site.org, version 2.0"
tokens_special = word_tokenize(text_special)
print(tokens_special)['Email', ':', 'test', '@', 'example.com', ',', 'URL', ':', 'https', ':', '//site.org', ',', 'version', '2.0']
В этом примере видно, что модель корректно обработала email и URL, хотя разбила их на части. Для сохранения таких сущностей целыми требуется использование специализированных токенизаторов или регулярных выражений.