Токенизация, стоп-слова, стемминг и теги PoS (с кодом) - Часть 1

NLTK (Natural Language Toolkit) - это API-интерфейс для NLP (обработки естественного языка) с Python. Это действительно мощный инструмент для предварительной обработки текстовых данных для дальнейшего анализа, например, с моделями машинного обучения. Это помогает преобразовать текст в числа, с которыми модель может легко работать. Это первая часть базового введения в NLTK, которая поможет вам получить некоторые базовые знания Python.

Во-первых, вы хотите установить NLTK с помощью pip (или conda). Команда для этого довольно проста как для Mac, так и для Windows: pip install nltk . Если это не сработает, попробуйте взглянуть на эту страницу документации. Обратите внимание, у вас должна быть как минимум версия - 3.5 Python для NLTK.

Чтобы проверить, правильно ли установлен NLTK, просто введите import nltk в своей среде IDE. Если все работает без ошибок, поздравляю! Но подождите, есть еще куча вещей, которые нужно загрузить и установить. В вашей среде IDE после импорта перейдите к следующей строке, введите nltk.download() и запустите этот сценарий. Появится окно установки. Выберите все и нажмите «Загрузить», чтобы загрузить и установить дополнительные пакеты. Это загрузит все словари и другие языковые и грамматические фреймы данных, необходимые для полной функциональности NLTK. NLTK полностью поддерживает английский язык, но другие языки, такие как испанский или французский, не поддерживаются так широко. Теперь мы готовы обрабатывать наш первый естественный язык.

Токенизация

Одна из самых простых вещей, которую мы хотим сделать, - это разделить текст на слова или предложения. Это называется токенизацией.

from nltk import word_tokenize, sent_tokenize
sent = "I will walk 500 miles and I would walk 500 more, just to be the man who walks a thousand miles to fall down at your door!"
print(word_tokenize(sent))
print(sent_tokenize(sent))
output: 
[‘I’, ‘will’, ‘walk’, ‘500’, ‘miles’, ‘.’, ‘And’, ‘I’, ‘would’, ‘walk’, ‘500’, ‘more’, ‘,’, ‘just’, ‘to’, ‘be’, ‘the’, ‘man’, ‘who’, ‘walks’, ‘a’, ‘thousand’, ‘miles’, ‘to’, ‘fall’, ‘down’, ‘at’, ‘your’, ‘door’, ‘.’]
[‘I will walk 500 miles.’, ‘And I would walk 500 more, just to be the man who walks a thousand miles to fall down at your door.’]

Мы получаем текст, элегантно преобразованный в список. Вышеупомянутая токенизация без NLTK потребовала бы часов и часов кодирования с регулярными выражениями! Однако вы можете задаться вопросом о знаках препинания. Об этом нам придется позаботиться отдельно. Мы также могли бы использовать другие токенизаторы, такие как PunktSentenceTokenizer, который представляет собой предварительно обученную неконтролируемую модель машинного обучения. Мы даже можем обучить его самостоятельно, если захотим, используя собственный набор данных. Следите за моими будущими статьями. ** вставьте бесстыдный призыв к саморекламе **: 3

Стоп-слова

Стоп-слова - это в основном слова, которые не имеют сильных значимых коннотаций, например, «и», «а», «это», «они» и т. Д. Они оказывают значимое влияние, когда мы используем их для общения друг с другом, но для компьютерного анализа они на самом деле не так полезны (ну, возможно, они могли бы быть, но компьютерные алгоритмы еще не настолько умны, чтобы точно расшифровать их контекстное влияние, если честно). Давайте посмотрим на пример:

from nltk.corpus import stopwords        # the corpus module is an 
                                         # extremely useful one. 
                                         # More on that later.
stop_words = stopwords.words('english')  # this is the full list of
                                         # all stop-words stored in
                                         # nltk
token = word_tokenize(sent)
cleaned_token = []
for word in token:
    if word not in stop_words:
        cleaned_token.append(word)
print("This is the unclean version:", token)
print("This is the cleaned version:", cleaned_token)
output: 
This is the unclean version: ['I', 'will', 'walk', '500', 'miles', 'and', 'I', 'would', 'walk', '500', 'more', ',', 'just', 'to', 'be', 'the', 'man', 'who', 'walks', 'a', 'thousand', 'miles', 'to', 'fall', 'down', 'at', 'your', 'door', '.']
This is the cleaned version: ['I', 'walk', '500', 'miles', 'I', 'would', 'walk', '500', ',', 'man', 'walks', 'thousand', 'miles', 'fall', 'door', '.']

Как видите, многие слова вроде «будет», «и» удалены. Это сэкономит огромное количество вычислительной мощности и, следовательно, времени, если мы запихнем тела текстов с большим количеством «пустых» слов в модель машинного обучения.

Стемминг

Это когда «пустые» буквы (не слова) удаляются из слова и группируются вместе с его «основной формой». Например, слова «играть», «играть» или «играет» передают то же значение (хотя, опять же, не совсем точно, но для анализа с помощью компьютера такие детали все еще не подходят). Поэтому вместо того, чтобы использовать их как разные слова, мы можем объединить их под одним общим термином «игра».

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
words = ['play', 'playing', 'plays', 'played',
         'playfullness', 'playful']
stemmed = [stemmer.stem(word) for word in words]
print(stemmed)
output:
['play', 'play', 'play', 'play', 'playful', 'play']

Мы использовали PorterStemmer, предварительно написанный класс стеммера. Существуют и другие стеммеры, такие как SnowballStemmer и LancasterStemmer, но PorterStemmer - своего рода самый простой. Однако «Play» и «Playful» следовало бы распознать как два разных слова. Обратите внимание, как последнее «игривое» распознается как «игра», а не «игривое». Вот где простота PorterStemmer нежелательна. Вы также можете обучить свои собственные, используя модели машинного обучения с неконтролируемой кластеризацией или контролируемой классификации. А теперь давайте остановим настоящий приговор!

sent2 = "I played the play playfully as the players were playing in
         the play with playfullness"
token = word_tokenize(sent2)
stemmed = ""
for word in token:
    stemmed += stemmer.stem(word) + " "
print(stemmed)
output:
I play the play play as the player were play in the play with playful .

Теперь его можно эффективно токенизировать для дальнейшей обработки или анализа. Довольно аккуратно, правда ?!

Пометка частей речи (поз.)

Следующая важная вещь, которую мы хотим сделать, - это пометить каждое слово в корпусе (корпус - это просто «мешок» слов), который мы создали после преобразования предложений путем токенизации.

from nltk import pos_tag 
token = word_tokenize(sent) + word_tokenize(sent2)
tagged = pos_tag(cleaned_token)                 
print(tagged)
output: 
[('I', 'PRP'), ('will', 'MD'), ('walk', 'VB'), ('500', 'CD'), ('miles', 'NNS'), ('and', 'CC'), ('I', 'PRP'), ('would', 'MD'), ('walk', 'VB'), ('500', 'CD'), ('more', 'JJR'), (',', ','), ('just', 'RB'), ('to', 'TO'), ('be', 'VB'), ('the', 'DT'), ('man', 'NN'), ('who', 'WP'), ('walks', 'VBZ'), ('a', 'DT'), ('thousand', 'NN'), ('miles', 'NNS'), ('to', 'TO'), ('fall', 'VB'), ('down', 'RP'), ('at', 'IN'), ('your', 'PRP$'), ('door', 'NN'), ('.', '.'), ('I', 'PRP'), ('played', 'VBD'), ('the', 'DT'), ('play', 'NN'), ('playfully', 'RB'), ('as', 'IN'), ('the', 'DT'), ('players', 'NNS'), ('were', 'VBD'), ('playing', 'VBG'), ('in', 'IN'), ('the', 'DT'), ('play', 'NN'), ('with', 'IN'), ('playfullness', 'NN'), ('.', '.')]

Метод pos_tag() принимает список токенизированных слов и помечает каждое из них соответствующим идентификатором частей речи в кортежи. Например, VB относится к глаголу, NNS относится к существительным множественного числа, DT относится к определителю. Обратитесь к этому сайту за списком тегов. Эти теги почти всегда довольно точны, но мы должны помнить, что иногда они могут быть неточными. Однако предварительно обученные модели обычно предполагают, что используемый английский язык написан правильно с соблюдением грамматических правил.

Это может быть проблемой при анализе неформальных текстов, например, из Интернета. Помните фреймы данных, которые мы загрузили после установки NLTK с помощью пипса? Они содержат наборы данных, которые изначально использовались для обучения этих моделей. Чтобы применить эти модели в контексте наших собственных интересов, нам нужно сначала обучить эти модели на новых наборах данных, содержащих неформальные языки.

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

Эта статья 2001 года под названием Неоправданная эффективность данных проиллюстрировала, насколько неэффективными могут быть данные, когда дело доходит до расшифровки на их основе значимых закономерностей и тенденций, независимо от того, какой алгоритм машинного обучения мы используем. Но с текстовыми данными это не проблема. САМАЯ самая распространенная форма данных, доступная в Интернете, - это текстовые данные. Представьте себе потенциал и возможности применения машинного обучения в этой огромной базе данных. Но первым препятствием для фактического использования этих куч данных является их преобразование в удобные для вычислений форматы для алгоритмов машинного обучения для анализа, что является этапом предварительной обработки, ключом к которому является NLTK. Удачного обучения!



P.S. Если вам нужны более короткие, по существу статьи о Data Science и о том, как биолог проходит свой путь через информационную революцию, подумайте о том, чтобы подписаться на мой блог.

Спасибо!