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): Предоставляет точные нейросетевые модели для многих языков, включая поддержку морфологического разбора. Потребляет больше ресурсов, но часто дает более высокое качество, особенно для языков со сложной морфологией.

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

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')]

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

Пример на 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')]

питон nltk.pos_tag function comments

En
Nltk.pos tag Part-of-speech tagging