Значительная часть данных, которые генерируются сегодня, является неструктурированной. Неструктурированные данные включают комментарии социальных сетей, историю просмотров и отзывы клиентов. Вы оказались в ситуации с кучей текстовых данных для анализа, и не знаете, как поступить? Обработка естественного языка в Python может помочь.
Цель этого руководства — дать вам возможность анализировать текстовые данные в Python с помощью концепций обработки естественного языка (NLP). Сначала вы узнаете, как разбить ваш текст на более мелкие куски, нормализовать слова в их корневых формах, а затем удалить любые помехи в ваших документах, чтобы подготовить их к дальнейшему анализу.
Давайте начнем!
Предпосылки
В этом руководстве мы будем использовать библиотеку Python nltk
На момент написания этого руководства мы использовали версию 3.4 nltk
Чтобы установить библиотеку , вы можете использовать команду pip
pip install nltk==3.4
Чтобы проверить, какая версия nltk
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. Преобразование слов в их базовые формы.
Когда вы обрабатываете естественный язык, вы часто замечаете, что существуют разные грамматические формы одного и того же слова. Например, «идти», «идти» и «ушел» — формы одного и того же глагола «идти».
Хотя потребности вашего проекта могут потребовать от вас сохранения слов в различных грамматических формах, давайте обсудим способ преобразования различных грамматических форм одного и того же слова в его базовую форму. Есть два метода, которые вы можете использовать, чтобы преобразовать слово в его основу.
Первая техника Stemming — это простой алгоритм, который удаляет аффиксы из слова. Для использования в NLTK доступны различные алгоритмы Мы будем использовать алгоритм Портера в этом уроке.
Сначала мы импортируем PorterStemmer
nltk.stem.porter
Далее, мы инициализируем stemmer для переменной 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.download('wordnet')
Как только он загружен, вам нужно импортировать класс WordNetLemmatizer
from nltk.stem.wordnet import WordNetLemmatizer
lem = WordNetLemmatizer()
Чтобы использовать лемматизатор, используйте метод .lemmatize()
Требуется два аргумента — слово и контекст. В нашем примере мы будем использовать «v» для контекста. Давайте рассмотрим контекст более .lemmatize()
print(lem.lemmatize('constitutes', 'v'))
.lemmatize()
Вы заметите, что метод .lemmatize()
Вы также могли бы заметить, что лемматизация занимает больше времени, чем остановка, поскольку алгоритм более сложный.
Давайте проверим, как программно определить второй аргумент метода pos_tag
В NLTK есть функция averaged_perceptron_tagger
Однако сначала вам нужно загрузить ресурс 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
Далее мы сосредоточимся на удалении стоп-слов. Стоп-слова — это часто используемые слова в языке, такие как «I», «a» и «the», которые при анализе текста мало что значат для текста. Поэтому мы удалим стоп-слова из нашего анализа. Сначала загрузите ресурс stopwords
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']
Как видите, пунктуация и стоп-слова были удалены.
Распределение частоты слов
Теперь, когда вы знакомы с основными методами очистки в НЛП, давайте попробуем найти частоту слов в тексте. Для этого упражнения мы будем использовать текст сказки «Мышь», «Птица» и «Колбаса» , который можно бесплатно найти на сайте Gutenberg. Мы будем хранить текст этой сказки в виде строки text
Сначала мы токенизируем text
clean_data
tokens = word_tokenize(text)
cleaned_tokens = clean_data(tokens, stop_words = stop_words)
Чтобы найти частотное распределение слов в вашем тексте, вы можете использовать класс FreqDist
Инициализируйте класс с токенами в качестве аргумента. Затем используйте метод .most_common()
Давайте попробуем найти десять лучших терминов в этом случае.
from nltk import FreqDist
freq_dist = FreqDist(cleaned_tokens)
freq_dist.most_common(10)
Вот десять наиболее часто встречающихся терминов в этой сказке.
python
[('bird', 15),
('sausage', 11),
('mouse', 8),
('wood', 7),
('time', 6),
('long', 5),
('make', 5),
('fly', 4),
('fetch', 4),
('water', 4)]
Неудивительно, что три самых распространенных термина — это три главных персонажа в сказке.
Частота слов не может быть очень важной при анализе текста. Как правило, следующим шагом в NLP является создание статистики — TF — IDF (термин частота — обратная частота документа), которая обозначает важность слова в списке документов.
Вывод
В этом посте вы познакомились с обработкой естественного языка в Python. Вы преобразовали текст в токены, преобразовали слова в их базовые формы и, наконец, очистили текст, чтобы удалить любую часть, которая не добавляла значения для анализа.
Несмотря на то, что вы рассмотрели простые задачи НЛП в этом учебном пособии, есть много методов для изучения. Возможно, вы захотите выполнить моделирование темы на текстовых данных, где цель состоит в том, чтобы найти общую тему, о которой может говорить текст. Более сложной задачей в НЛП является внедрение модели анализа настроений для определения ощущения, лежащего в основе любого текста.
Какие процедуры вы выполняете, когда вам дают кучу текста для работы? Дайте нам знать в комментариях ниже.