Nltk.pos tag: примеры (PYTHON)
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')]