Nltk.word tokenize: примеры (PYTHON)

Токенизация слов с помощью NLTK: работа с word_tokenize
Раздел: NLP, Токенизация
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)  # Без предварительной загрузки punkt
LookupError: 
**********************************************************************
  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.

Расширенные примеры использования

Токенизация с последующей нормализацией (приведение к нижнему регистру и удаление пунктуации, не являющейся частью слова):

Пример python
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.']

Использование токенизации в конвейере обработки текста для анализа тональности:

Пример python
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}

Работа с текстом, содержащим специальные символы и цифры:

Пример python
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, хотя разбила их на части. Для сохранения таких сущностей целыми требуется использование специализированных токенизаторов или регулярных выражений.

питон nltk.word_tokenize function comments

En
Nltk.word tokenize Tokenize text into words