Создание сайтов в Луганске, ЛНР. Начало работы с обработкой естественного языка в Python

Значительная часть данных, генерируемых сегодня, неструктурирована. Неструктурированные данные включают комментарии в социальных сетях, историю просмотров и отзывы клиентов. Вы оказались в ситуации с кучей текстовых данных для анализа, и не знаете, как действовать дальше? Обработка естественного языка в Python может помочь.

Цель этого руководства — дать вам возможность анализировать текстовые данные в Python с помощью концепций обработки естественного языка (NLP). Сначала вы узнаете, как разбить текст на более мелкие фрагменты, нормализовать слова до их корневой формы, а затем удалить любые помехи в ваших документах, чтобы подготовить их к дальнейшему анализу.

Давайте начнем!

Предпосылки

В этом уроке мы будем использовать nltkбиблиотеку Python для выполнения всех операций НЛП над текстом. На момент написания этого руководства мы использовали версию 3.4 nltk. Для установки библиотеки можно использовать pipкоманду в терминале:

pip install nltk==3.4

Чтобы проверить, какая версия у nltkвас стоит в системе, вы можете импортировать библиотеку в интерпретатор Python и проверить версию:

import nltk

print (nltk. __version__)

Для выполнения определенных действий nltkв этом руководстве вам может потребоваться загрузить определенные ресурсы. Мы опишем каждый ресурс по мере необходимости.

Однако, если вы хотите избежать загрузки отдельных ресурсов позже в этом руководстве и получить их сразу, выполните следующую команду:

python -m nltk.downloader all

Шаг 1: конвертировать в токены

Компьютерная система не может сама найти смысл в естественном языке. Первым шагом в обработке естественного языка является преобразование исходного текста в токены. Токен представляет собой комбинацию непрерывных символов, имеющих некоторое значение. Вам решать, как разбить предложение на токены. Например, простой способ — разделить предложение пробелами, чтобы разбить его на отдельные слова.

В библиотеке NLTK вы можете использовать word_tokenize () функцию для преобразования строки в токены. Однако сначала вам необходимо загрузить punktресурс. Выполните следующую команду в терминале:

nltk.download ('punkt’)

Затем вам нужно импортировать word_tokenizeиз nltk.tokenize, чтобы использовать его:

from nltk.tokenize import word_tokenize

print (word_tokenize («Hi, this is a nice hotel.»))

Вывод кода выглядит следующим образом:

['Hi’, ',', 'this’, 'is’, 'a’, 'nice’, 'hotel’, '.']

Вы заметите, что word_tokenizeэто не просто разбивает строку на основе пробелов, но также разделяет знаки препинания на токены. Вам решать, хотите ли вы сохранить знаки препинания в анализе.

Шаг 2: Преобразование слов в их базовые формы

Когда вы обрабатываете естественный язык, вы часто замечаете, что существуют различные грамматические формы одного и того же слова. Например, «go», «going» и «gone» являются формами одного и того же глагола «go».

Хотя потребности вашего проекта могут потребовать сохранения слов в различных грамматических формах, давайте обсудим способ преобразования различных грамматических форм одного и того же слова в его базовую форму. Есть два метода, которые вы можете использовать для преобразования слова в его основу.

Первая техника — стемпинг. Stemming — это простой алгоритм, удаляющий аффиксы из слова. Существуют различные алгоритмы стемминга, доступные для использования в NLTK. В этом уроке мы будем использовать алгоритм Портера.

Сначала мы импортируем PorterStemmerиз nltk.stem.porter. Затем мы инициализируем стеммер stemmerпеременной, а затем используем.stem () метод для поиска базовой формы слова:

from nltk.stem.porter import PorterStemmer

stemmer = PorterStemmer ()

print (stemmer.stem («going»))

Вывод кода выше go. Если вы запустите стеммер для других форм «go», описанных выше, вы заметите, что стеммер возвращает ту же самую базовую форму «go». Однако, поскольку выделение корней — это всего лишь простой алгоритм, основанный на удалении аффиксов слов, он дает сбой, когда слова реже используются в языке.

Например, когда вы пробуете стеммер на слове «составляет», он дает неинтуитивный результат:

print (stemmer.stem («constitutes»))

Вы заметите, что вывод «constitut».

Этот вопрос решается путем перехода к более сложному подходу к нахождению базовой формы слова в заданном контексте. Процесс называется лемматизацией. Лемматизация нормализует слово на основе контекста и лексики текста. В NLTK вы можете лемматизировать предложения, используя WordNetLemmatizerкласс.

Во-первых, вам нужно загрузить wordnetресурс из загрузчика NLTK в терминале Python:

nltk.download ('wordnet’)

После загрузки вам необходимо импортировать WordNetLemmatizerкласс и инициализировать его:

from nltk.stem.wordnet import WordNetLemmatizer

lem = WordNetLemmatizer ()

Чтобы использовать лемматизатор, используйте.lemmatize () метод. Он принимает два аргумента: слово и контекст. В нашем примере мы будем использовать «v» для контекста. Давайте изучим контекст дальше после просмотра вывода.lemmatize () метода:

print (lem.lemmatize ('constitutes’, 'v’))

Вы заметите, что.lemmatize () метод правильно преобразует слово «составляет» в его базовую форму «состав». Вы также заметите, что лемматизация занимает больше времени, чем поиск корней, поскольку алгоритм более сложен.

Проверим, как программно определить второй аргумент.lemmatize () метода. В NLTK есть pos_tag () функция, помогающая определить контекст слова в предложении. Однако сначала нужно скачать averaged_perceptron_taggerресурс через загрузчик NLTK:

nltk.download ('averaged_perceptron_tagger’)

Затем импортируйте pos_tag () функцию и запустите ее на предложении:

from nltk.tag import pos_tag

sample = «Hi, this is a nice hotel.»

print (pos_tag (word_tokenize (sample)))

Вы заметите, что вывод представляет собой список пар. Каждая пара состоит из токена и его тега, который обозначает контекст токена в общем тексте. Обратите внимание, что тег для знака препинания сам по себе:

[ ('Hi’, 'NNP’),

(',', ','),

('this’, 'DT’),

('is’, 'VBZ’),

('a’, 'DT’),

('nice’, 'JJ’),

('hotel’, 'NN’),

('.', '.') ]

Как вы расшифровываете контекст каждого токена? Вот полный список всех тегов и их соответствующих значений в Интернете. Обратите внимание, что теги всех существительных начинаются с «N», а все глаголы начинаются с «V». Мы можем использовать эту информацию во втором аргументе нашего.lemmatize () метода:

def lemmatize_tokens (stentence):

lemmatizer = WordNetLemmatizer ()

lemmatized_tokens = []

for word, tag in pos_tag (stentence):

if tag.startswith ('NN’):

pos = 'n’

elif tag.startswith ('VB’):

pos = 'v’

else:

pos = 'a’

lemmatized_tokens.append (lemmatizer.lemmatize (word, pos))

return lemmatized_tokens

sample = «Legal authority constitutes all magistrates.»

print (lemmatize_tokens (word_tokenize (sample)))

Вывод приведенного выше кода выглядит следующим образом:

['Legal’, 'authority’, 'constitute’, 'all’, 'magistrate’, '.']

Этот результат ожидается, если слова «состав» и «магистраты» были преобразованы в «состав» и «магистрат» соответственно.

Шаг 3: Очистка данных

Следующим шагом в подготовке данных является очистка данных и удаление всего, что не добавляет смысла вашему анализу. В целом, мы рассмотрим удаление знаков препинания и стоп-слов из вашего анализа.

Удаление знаков препинания — довольно простая задача. Объект punctuationбиблиотеки stringсодержит все знаки препинания на английском языке:

import string

print (string.punctuation)

Вывод этого фрагмента кода выглядит следующим образом:

'!"#$%& \' () *+, -. /:;<=>? @[\\]^_`{|}~'

Чтобы удалить знаки препинания с токенов, вы можете просто запустить это:

for token in tokens:

if token in string.punctuation:

# Do something

Далее мы сосредоточимся на удалении стоп-слов. Стоп-слова — это часто используемые в языке слова, такие как «я», «а» и «то», которые мало что значат в тексте при его анализе. Поэтому мы удалим стоп-слова из нашего анализа. Сначала загрузите stopwordsресурс из загрузчика NLTK:

nltk.download ('stopwords’)

После завершения загрузки импортируйте stopwordsи nltk.corpusиспользуйте.words () метод с «английским» в качестве аргумента. Это список из 179 стоп-слов английского языка:

from nltk.corpus import stopwords

stop_words = stopwords.words ('english’)

Мы можем объединить пример лемматизации с концепциями, обсуждаемыми в этом разделе, чтобы создать следующую функцию clean_data (). Кроме того, перед сравнением, входит ли слово в список стоп-слов, мы преобразуем его в нижний регистр. Таким образом, мы по-прежнему фиксируем стоп-слово, если оно встречается в начале предложения и пишется с заглавной буквы:

def clean_data (tokens, stop_words = ()):

cleaned_tokens = []

for token, tag in pos_tag (tokens):

if tag.startswith («NN»):

pos = 'n’

elif tag.startswith ('VB’):

pos = 'v’

else:

pos = 'a’

lemmatizer = WordNetLemmatizer ()

token = lemmatizer.lemmatize (token, pos)

if token not in string.punctuation and token.lower () not in stop_words:

cleaned_tokens.append (token)

return cleaned_tokens

sample = «The quick brown fox jumps over the lazy dog.»

stop_words = stopwords.words ('english’)

clean_data (word_tokenize (sample), stop_words)

Вывод примера выглядит следующим образом:

['quick’, 'brown’, 'fox’, 'jump’, 'lazy’, 'dog’]

Как видите, знаки препинания и стоп-слова удалены.

Частотное распределение слов

Теперь, когда вы знакомы с основными методами очистки в НЛП, давайте попробуем найти частоту слов в тексте. В этом упражнении мы будем использовать текст сказки «Мышь, птица и колбаса «, которая находится в свободном доступе на Гутенберге. Мы будем хранить текст этой сказки в строке text.

Сначала мы токенизируем, textа затем очищаем его с помощью функции clean_data, которую мы определили выше:

tokens = word_tokenize (text)

cleaned_tokens = clean_data (tokens, stop_words = stop_words)

Чтобы найти частотное распределение слов в вашем тексте, вы можете использовать FreqDistкласс NLTK. Инициализируйте класс с токенами в качестве аргумента. Затем используйте.most_common () метод, чтобы найти часто встречающиеся термины. Попробуем найти первую десятку терминов в этом случае:

from nltk import FreqDist

freq_dist = FreqDist (cleaned_tokens)

freq_dist.most_common (10)

Вот десять наиболее часто встречающихся терминов в этой сказке:

[ ('bird’, 15),

('sausage’, 11),

('mouse’, 8),

('wood’, 7),

('time’, 6),

('long’, 5),

('make’, 5),

('fly’, 4),

('fetch’, 4),

('water’, 4) ]

Неудивительно, что три самых распространенных термина — это три главных героя сказки.

Частота слов может быть не очень важна при анализе текста. Как правило, следующим шагом в НЛП является генерация статистики — TF-IDF (термин частота — обратная частота документа) — которая означает важность слова в списке документов.

Заключение

В этом руководстве мы впервые рассмотрели обработку естественного языка в Python. Мы преобразовали текст в токены, преобразовали слова в их базовые формы и, наконец, очистили текст, удалив любую часть, которая не добавляла смысла анализу.

Несмотря на то, что в этом руководстве мы рассмотрели простые задачи НЛП, существует множество других техник, которые можно изучить. Мы могли бы, например, захотеть выполнить тематическое моделирование текстовых данных, где цель состоит в том, чтобы найти общую тему, о которой может говориться в тексте. Более сложной задачей в НЛП является реализация модели анализа настроений для определения чувства, стоящего за любым текстом.

Делитесь нашими материалами с друзьями!

 

 

Заказать разработку сайта