Nltk.pos tag: примеры (PYTHON)

Функция nltk.pos_tag: примеры и применение для тегирования частей речи
Раздел: NLP, Части речи
nltk.pos_tag(tokens: list): list

Основы функции nltk.pos_tag

Функция pos_tag из библиотеки Natural Language Toolkit (NLTK) предназначена для автоматического определения частей речи (Part-of-Speech, POS) слов в тексте. Её применение актуально в задачах лингвистического анализа, обработки естественного языка (NLP), таких как извлечение информации, анализ тональности, синтаксический разбор.

Функция принимает на вход последовательность токенизированных слов (список строк) и возвращает список кортежей. Каждый кортеж содержит исходное слово и присвоенный ему тег части речи в соответствии с выбранным тегсетом.

Основные аргументы:

  • tokens (обязательный): список строк (токенов).
  • tagset (необязательный): строка, указывающая, какой тегсет использовать. По умолчанию используется \"universal\" - упрощенный набор тегов. Альтернативный вариант - \"penntreebank\" (или \"wsj\"), который соответствует более детальному тегсету Penn Treebank.
  • lang (необязательный): строка, указывающая язык модели. По умолчанию \"eng\" (английский). Для других языков требуется предварительная загрузка соответствующих моделей.

Возвращаемое значение - список кортежей вида [(слово1, тег1), (слово2, тег2), ...].

Краткие примеры использования

Пример 1: Базовое использование с тегсетом по умолчанию (Universal).

import nltk
nltk.download('averaged_perceptron_tagger')
tokens = [\"Python\", \"is\", \"a\", \"powerful\", \"language\"]
tags = nltk.pos_tag(tokens)
print(tags)
[('Python', 'NOUN'), ('is', 'VERB'), ('a', 'DET'), ('powerful', 'ADJ'), ('language', 'NOUN')]

Пример 2: Использование детального тегсета Penn Treebank.

tags_detail = nltk.pos_tag(tokens, tagset='penntreebank')
print(tags_detail)
[('Python', 'NNP'), ('is', 'VBZ'), ('a', 'DT'), ('powerful', 'JJ'), ('language', 'NN')]

Похожие функции в Python

В экосистеме Python существуют альтернативные инструменты для тегирования частей речи:

  • spaCy: Библиотека промышленного уровня, предоставляющая быстрые и точные модели для многих языков. Создаёт объекты Doc с предсказанными POS-тегами в атрибуте token.pos_ (универсальный тегсет) или token.tag_ (детальный). Предпочтительна для сложных NLP-пайплайнов, где важны производительность и интеграция других компонентов (например, синтаксического парсера).
  • TextBlob: Упрощенная библиотека, построенная на NLTK. Предлагает простой API: TextBlob(текст).tags. Удобна для быстрого прототипирования.
  • Stanza (от Stanford NLP): Предоставляет точные нейросетевые модели для многих языков, включая поддержку морфологического разбора. Потребляет больше ресурсов, но часто дает более высокое качество, особенно для языков со сложной морфологией.

Аналоги в других языках программирования

Пример на JavaScript (используя библиотеку компромисс):

const nlp = require('compromise');
let doc = nlp('Python is a powerful language');
let tags = doc.out('tags');
console.log(tags);
[ { text: 'Python', normal: 'python', tags: [ 'Noun', 'Singular' ] }, ... ]

Пример на Java (используя Stanford CoreNLP):

import edu.stanford.nlp.pipeline.*;
import java.util.*;

Properties props = new Properties();
props.setProperty(\"annotators\", \"tokenize,ssplit,pos\");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
CoreDocument document = new CoreDocument(\"Python is a powerful language\");
pipeline.annotate(document);
for (CoreLabel token : document.tokens()) {
    System.out.println(token.word() + \" - \" + token.tag());
}
Python - NNP
is - VBZ
a - DT
powerful - JJ
language - NN

Пример на PHP (используя PHP-ML с внешним сервисом или моделью):

// Упрощенный пример через вызов внешнего Python-скрипта
$text = escapeshellarg(\"Python is powerful\");
$output = shell_exec(\"python3 -c \"import nltk, sys; print(nltk.pos_tag(nltk.word_tokenize(sys.argv[1])))\" \" . $text);
echo $output;
[('Python', 'NNP'), ('is', 'VBZ'), ('powerful', 'JJ')]

Распространенные ошибки

1. Непредварительная загрузка необходимых моделей или данных.

import nltk
tokens = [\"Test\"]
try:
    tags = nltk.pos_tag(tokens)
except LookupError as e:
    print(\"Ошибка:\", e)
Ошибка: Resource averaged_perceptron_tagger not found.

2. Передача строки вместо списка токенов.

text = \"Просто строка\"
tags = nltk.pos_tag(text)  # Ошибка
print(tags)
TypeError: 'str' object is not iterable

3. Использование тегсета для другого языка без загрузки соответствующей модели.

# Для русского языка требуется загрузить модель
# nltk.download('punkt')
# и использовать соответствующую модель POS-теггера (например, из pymorphy2 или spacy)
# nltk.pos_tag не имеет встроенной поддержки русского.

Изменения в последних версиях NLTK

В NLTK версии 3.5 (2020) произошли изменения в работе некоторых функций, связанных с токенизацией, но pos_tag осталась стабильной. В более ранних версиях (до 3.1) использовался тегсет Penn Treebank по умолчанию. Сейчас по умолчанию применяется универсальный тегсет (Universal tags). Также улучшена интеграция с дополнительными моделями, но интерфейс функции не претерпел значительных изменений.

Расширенные примеры применения

Пример 1: Фильтрация существительных в тексте.

text = \"Artificial intelligence and machine learning are fascinating fields.\"
tokens = nltk.word_tokenize(text)
tags = nltk.pos_tag(tokens, tagset='universal')
nouns = [word for word, pos in tags if pos == 'NOUN']
print(\"Существительные:\", nouns)
Существительные: ['intelligence', 'machine', 'learning', 'fields']

Пример 2: Анализ частотности частей речи.

from collections import Counter
tags = nltk.pos_tag(tokens, tagset='universal')
pos_counts = Counter(tag for _, tag in tags)
print(\"Частотность POS:\", pos_counts.most_common())
Частотность POS: [('NOUN', 4), ('ADP', 1), ('ADJ', 1), ('VERB', 1)]

Пример 3: Использование с пользовательским токенизатором для обработки специфичного текста.

custom_tokens = ['OpenAI', 'released', 'GPT-4', '.']
tags = nltk.pos_tag(custom_tokens, tagset='penntreebank')
print(tags)
[('OpenAI', 'NNP'), ('released', 'VBD'), ('GPT-4', 'NNP'), ('.', '.')]

Пример 4: Обработка предложений с неоднозначностью.

ambiguous = [\"He\", \"can\", \"can\", \"a\", \"can\"]
tags = nltk.pos_tag(ambiguous)
print(tags)
[('He', 'PRP'), ('can', 'MD'), ('can', 'VB'), ('a', 'DT'), ('can', 'NN')]

питон nltk.pos_tag function comments

En
Nltk.pos tag Part-of-speech tagging