По данным McKinsey, НЛП ускоряет синтез различных неавтоматизированных процессов на 60% и оказывает большое влияние, особенно в сфере здравоохранения.

Обработка естественного языка (NLP) стала важной частью современных систем. Он широко используется в поисковых системах, диалоговых интерфейсах, обработчиках документов и так далее. Машины хорошо справляются со структурированными данными, но когда дело доходит до работы с текстом произвольной формы, им приходится нелегко. Целью НЛП является разработка алгоритмов, позволяющих компьютерам понимать текст в произвольной форме и, в конечном итоге, понимать язык.

[Руководство по обработке естественного языка: 30 бесплатных ресурсов ODSC для изучения НЛП]

Эта статья представляет собой отрывок из книги Искусственный интеллект с Python, второе издание Альберто Артасанчеса и Пратика Джоши, полностью обновленного и переработанного издания бестселлера по искусственному интеллекту, обновленного до Python 3.8 и TensorFlow 2 с семью новыми главами, которые охватывают RNN, AI и большие данные, фундаментальные варианты использования, конвейеры данных машинного обучения, чат-боты, большие данные и многое другое. В этой статье объясняются ключевые понятия модели "мешок слов".

Разделение текстовых данных на фрагменты

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

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

Создайте новый файл Python и импортируйте следующие пакеты:

import numpy as np 
from nltk.corpus import brown

Определите функцию для разделения входного текста на куски. Первый параметр — это текст, а второй — количество слов в каждом чанке:

# Split the input text into chunks, where 
# each chunk contains N words 
def chunker(input_data, N): 
    input_words = input_data.split(' ') 
    output = []

Переберите слова и разделите их на куски, используя входной параметр. Функция возвращает список:

cur_chunk = [] 
    count = 0 
    for word in input_words: 
        cur_chunk.append(word) 
        count += 1 
        if count == N: 
            output.append(' '.join(cur_chunk)) 
            count, cur_chunk = 0, [] 
 
    output.append(' '.join(cur_chunk))        return output

Определите основную функцию и прочитайте входные данные, используя корпус Брауна. В этом случае мы прочитаем 12000 слов. Вы можете прочитать столько слов, сколько хотите:

if __name__=='__main__': 
    # Read the first 12000 words from the Brown corpus 
    input_data = ' '.join(brown.words()[:12000])

Определите количество слов в каждом фрагменте:

# Define the number of words in each chunk 
    chunk_size = 700

Разделите входной текст на куски и отобразите вывод:

chunks = chunker(input_data, chunk_size) 
    print('\nNumber of text chunks =', len(chunks), '\n') 
    for i, chunk in enumerate(chunks): 
        print('Chunk', i+1, '==>', chunk[:50])

Полный код приведен в файле text_chunker.py. Если вы запустите код, вы получите следующий вывод:

На предыдущем снимке экрана показаны первые 50 символов каждого фрагмента.

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

Извлечение частоты терминов с использованием модели Bag of Words

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

Алгоритмам машинного обучения нужны числовые данные для работы, чтобы они могли анализировать данные и извлекать значимую информацию. Вот тут и приходит на помощь модель Bag of Words. Эта модель извлекает словарный запас из всех слов в документах и ​​строит модель, используя матрицу терминов документа. Это позволяет нам представлять каждый документ в виде набора слов. Мы просто следим за количеством слов и игнорируем грамматические детали и порядок слов.

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

Рассмотрим следующие предложения:

  • Предложение 1: Дети играют в зале.
  • Предложение 2: В зале много места
  • Предложение 3: Многим детям нравится играть на открытом пространстве.

Если вы рассмотрите все три предложения, у нас есть следующие 14 уникальных слов:

  • в
  • дети
  • являются
  • играть
  • in
  • зал
  • имеет
  • a
  • много
  • of
  • космос
  • как
  • an
  • открыть

Давайте построим гистограмму для каждого предложения, используя количество слов в каждом предложении. Каждый вектор признаков будет 14-мерным, потому что у нас есть 14 уникальных слов:

  • Предложение 1: [2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
  • Предложение 2: [1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0]
  • Предложение 3: [0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1]

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

Давайте посмотрим, как построить модель Bag of Words в NLTK. Создайте новый файл Python и импортируйте следующие пакеты:

import numpy as np 
from sklearn.feature_extraction.text import CountVectorizer 
from nltk.corpus import brown 
from text_chunker import chunker

Считайте входные данные из корпуса Брауна. Мы будем использовать 5400 слов. Не стесняйтесь попробовать это с таким количеством слов, как вы хотите:

# Read the data from the Brown corpus 
input_data = ' '.join(brown.words()[:5400])

Определите количество слов в каждом фрагменте:

# Number of words in each chunk  
chunk_size = 800

Разделите введенный текст на куски:

text_chunks = chunker(input_data, chunk_size)

Преобразуйте куски в элементы словаря:

# Convert to dict items 
chunks = [] 
for count, chunk in enumerate(text_chunks): 
    d = {'index': count, 'text': chunk} 
    chunks.append(d)

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

# Extract the document term matrix 
count_vectorizer = CountVectorizer(min_df=7, max_df=20) 
document_term_matrix = count_vectorizer.fit_transform([chunk['text'] for chunk in chunks])

Извлеките словарь и отобразите его. Словарь относится к списку отдельных слов, которые были извлечены на предыдущем шаге:

# Extract the vocabulary and display it 
vocabulary = np.array(count_vectorizer.get_feature_names()) 
print("\nVocabulary:\n", vocabulary)

Сгенерируйте имена для отображения:

# Generate names for chunks 
chunk_names = [] 
for i in range(len(text_chunks)): 
    chunk_names.append('Chunk-' + str(i+1))

Распечатайте матрицу терминов документа:

# Print the document term matrix 
print("\nDocument term matrix:") 
formatted_text = '{:>12}' * (len(chunk_names) + 1) 
print('\n', formatted_text.format('Word', *chunk_names), '\n') 
for word, item in zip(vocabulary, document_term_matrix.T): 
    # 'item' is a 'csr_matrix' data structure 
    output = [word] + [str(freq) for freq in item.data] 
    print(formatted_text.format(*output))

Полный код приведен в файле bag_of_words.py. Если вы запустите код, вы получите следующий вывод:

Все слова можно увидеть в матрице терминов документа вместе с соответствующими счетчиками в каждом фрагменте.

В этой статье мы рассмотрели различные основные концепции обработки естественного языка. Мы также обсудили модель Bag of Words, в которой мы преобразовывали случайный текст в векторы определенной длины, подсчитывая количество появлений каждого слова. НЛП — это всего лишь часть обширных описательных знаний об ИИ, которыми вас снабжает Искусственный интеллект с Python, второе издание. Новая версия идет дальше, предоставляя вам инструменты, необходимые для изучения удивительного мира интеллектуальных приложений и создания собственных приложений.

Об авторах

Альберто Артасанчес — специалист по обработке и анализу данных с более чем 25-летним опытом консультирования компаний из списка Fortune 500, а также стартапов. У него обширный опыт в области искусственного интеллекта и передовых алгоритмов. Г-н Артасанчес имеет 8 сертификатов AWS, включая сертификаты по специальности «Большие данные» и «Специализация по машинному обучению». Он является амбассадором AWS и часто публикуется в различных блогах по науке о данных. Его часто приглашают в качестве докладчика по самым разным темам: от науки о данных, больших данных и аналитики до оптимизации андеррайтинга и обнаружения мошенничества. Он имеет значительный и обширный опыт проектирования и создания масштабных комплексных платформ машинного обучения. Он получил степень магистра наук в Государственном университете Уэйна и степень бакалавра искусств в колледже Каламазу. Его особенно интересует использование искусственного интеллекта для масштабного создания озер данных. Он женат на своей любимой жене Карен и увлекается кроссфитом.

Пратик Джоши — основатель Plutoshift и опубликованный автор 9 книг об искусственном интеллекте. Он фигурировал в Forbes 30 under 30, NBC, Bloomberg, CNBC, TechCrunch и The Business Journals. Он был приглашенным докладчиком на таких конференциях, как TEDx, Global Big Data Conference, Machine Learning Developers Conference и Silicon Valley Deep Learning. Помимо искусственного интеллекта, некоторые из тем, которые его волнуют, — это теория чисел, криптография и квантовые вычисления. Его главная цель — сделать искусственный интеллект доступным для всех, чтобы он мог влиять на миллиарды людей во всем мире.

Исходное сообщение здесь.

Читайте другие статьи по науке о данных на OpenDataScience.com, включая учебные пособия и руководства от начального до продвинутого уровня! Подпишитесь на нашу еженедельную рассылку здесь и получайте последние новости каждый четверг.