Изучение NLTK

 Разметка частей речи

Здравствуйте и вновь добро пожаловать на занятия по теме «Обработка данных: обработка естественных языков на языке Python».

В этой лекции мы рассмотрим библиотеку NLTK. NLTK – это аббревиатура, расшифровывающаяся как «инструментарий естественного языка». Мы уже познакомились с функцией tokenize, которую использовали в анализаторе тональности текста. Таким образом, вы уже знаете, что NLTK является весьма полезной библиотекой. Эта библиотека включает в себя инструменты для решения множества задач NLP, так что для вас отпадает необходимость писать их самостоятельно. В этой лекции мы рассмотрим лишь некоторые из них – сугубо для того, чтобы вы вошли во вкус и, возможно, подать вам идеи, как использовать их в ваших собственных проектах.

Первым мы рассмотрим автоматическую разметку частей речи (POS tagging). Вам будет намного понятнее, что она делает, если вместо абстрактных объяснений мы рассмотрим её на конкретном примере. NLTK имеет высокоуровневую функцию pos_tag, в качестве аргумента использующую массив лексических единиц (токенов). Разберём на части речи предложение «Обучение машин является классным» («Machine learning is great»). Не забывайте, что целью этой демонстрации является помочь вам в дальнейшей самостоятельной работе.

import nltk

nltk.pos_tag(‘’Machine learning is great’’.split())

Функция отметила слова «обучение» и «машин» как NN, что означает имя существительное; слово «является» отмечено как глагол единственного числа настоящего времени; «классным» отмечено как прилагательное.

Таким образом, библиотека NLTK замечательно справилась с заданием разбора предложения на части речи.

Если вы хотите ознакомиться с полным списком условных обозначений частей речи, вы можете перейти на страницу Penn Treebank Project по адресу.

Стемминг и лемматизация

Итак, следующее, что мы рассмотрим, – это стемминг и лемматизация.

Как вы уже видели в примере с анализом тональности текста, суть обоих процедур состоит в том, чтобы свести слово к его нормальной (словарной) форме. Так, если слово в множественном числе – например, «собаки» – то оно будет сведено к единственному числу – «собака», слово «прыгающий» будет сведено к «прыгать» и так далее. Это может быть полезным, когда вы пытаетесь создать мешок слов, но желаете уменьшить количество вариантов каждого слова, поскольку «собаки» и «собака», по сути, означают одно и то же.

Итак, в чём же различие между стеммингом и лемматизацией?

Ну, вы можете считать стемминг более простым или сырым способом решения данной задачи. Иногда при стемминге просто отбрасывается окончание слова для получение его словарной формы. Поясним это на примере. Кстати, библиотека NLTK имеет целый ряд различных стеммеров; для демонстрации я выбрал PorterStemmer.

Приведём к нормальному виду слово «волки» (wolves).

from nltk.stem.porter import PorterStemmer

porter_stemmer = PorterStemmer()

porter_stemmer.steam(‘wolves’)

В результате «волки» были приведены к форме «wolv», хотя такого слова вообще не существует.

Попробуем теперь лемматизатор.

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

lemmatizer.lemmatize(‘wolves’)

В результате работы лемматизатора получим «волк» (wolf) – реально существующее и правильное слово.

Распознавание именованных сущностей

В введении мы вкратце говорили о так называемом распознавании именованных сущностей (named entity recognition, NER). Сейчас мы рассмотрим несколько примеров распознавания с использованием библиотеки NLTK.

Прежде всего надо разметить предложение. Напишем предложение «Альберт Эйнштейн родился 14 марта 1879 года».

s = ‘’Albert Einsrein was born on March 14, 1879’’

Теперь разметим это предложение по частям речи с помощью функции pos_tag библиотеки NLTK.

tags = nltk.pos_tag(s.split())

tags

Выведенные в результате на экран метки являются исходными данными для распознавания именованных сущностей. Функция ne_chunk использует их в качестве аргументов.

Для дальнейшей работы нам понадобится загрузить соответствующие функции. Всё как обычно – запускаем загрузчик NLTK и выбираем ne_chunker, а затем – корпус слов.

Запустим программу.

nltk.ne_chunk(tags)

В качестве результата мы получаем то, что называют древом синтаксического анализа. Как вы можете видеть, Альберт Эйнштейн отмечен как лицо. Вы можете получить куда более наглядный вариант разбора, используя функцию draw.

nltk.ne_chunk(tags).draw()

Попробуем в качестве примера ещё одно предложение – «Стив Джобс был главным исполнительным директором корпорации Apple», и разметим его.

s = ‘’Steve Jobs was the CEO of Apple Corp.’’

tags = nltk.pos_tags(s.split())

tags

И запустим распознавание именованных сущностей.

nltk.ne_chunk(tags).draw()

Итак, Стив Джобс был правильно распознан как лицо, а Apple – как организация. Но по ряду причин «главный исполнительный директор» программа также распознала как организацию.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: