Рубрики
Без рубрики

Введение в сумку слов и как кодировать его в Python для NLP

Автор оригинала: FreeCodeCapm Team.

Praven Dubey

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

Проще говоря, это набор слов, чтобы представлять предложение со значением слова и в основном игнорировать порядок, в котором они появляются.

Лук – это подход широко используется с:

  1. Обработка естественного языка
  2. Извлечение информации из документов
  3. Классификации документов

На высоком уровне он включает в себя следующие шаги.

Сгенерированные векторы могут быть введены в свой алгоритм обучения машины.

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

Рассмотрим ниже два предложения.

1. "John likes to watch movies. Mary likes movies too."
2. "John also likes to watch football games."

Эти два предложения также могут быть представлены с коллекцией слов.

1. ['John', 'likes', 'to', 'watch', 'movies.', 'Mary', 'likes', 'movies', 'too.']
2. ['John', 'also', 'likes', 'to', 'watch', 'football', 'games']

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

1. {"John":1,"likes":2,"to":1,"watch":1,"movies":2,"Mary":1,"too":1}
2. {"John":1,"also":1,"likes":1,"to":1,"watch":1,"football":1,   "games":1}

Предполагая, что эти предложения являются частью документа, ниже является комбинированной частотой слова для всего документа. Оба предложения принимаются во внимание.

 {"John":2,"likes":3,"to":2,"watch":2,"movies":2,"Mary":1,"too":1,  "also":1,"football":1,"games":1}

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

Длина вектора всегда будет равна размеру словарного запаса. В этом случае длина вектора 11.

Чтобы представлять наши оригинальные предложения в векторе, каждый вектор инициализируется всем нулями – [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

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

John likes to watch movies. Mary likes movies too.[1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
John also likes to watch football games.[1, 1, 1, 1, 0, 0, 0, 1, 1, 1]

Например, в предложении 1 слово Любит появляется во втором положении и появляется два раза. Таким образом, второй элемент нашего вектора для предложения 1 будет 2: [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]

Вектор всегда пропорционален размеру нашего словаря.

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

Кодирование нашего алгоритма лука

Вход в наш код будет несколько предложений, а выход будет векторы.

Входной массив это:

["Joe waited for the train", "The train was late", "Mary and Samantha took the bus",
"I looked for Mary and Samantha at the bus station",
"Mary and Samantha arrived at the bus station early but waited until noon for the bus"]

Шаг 1: токенизировать предложение

Начнем с удаления стоп-слов от предложений.

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

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

def word_extraction(sentence):    ignore = ['a', "the", "is"]    words = re.sub("[^\w]", " ",  sentence).split()    cleaned_text = [w.lower() for w in words if w not in ignore]    return cleaned_text

Для более надежной реализации стоп-слов вы можете использовать Python NLTK библиотека. Он имеет набор предопределенных слов на язык. Вот пример:

import nltkfrom nltk.corpus import stopwords set(stopwords.words('english'))

Шаг 2: применить токенизацию во все предложения

def tokenize(sentences):    words = []    for sentence in sentences:        w = word_extraction(sentence)        words.extend(w)            words = sorted(list(set(words)))    return words

Способ передает все предложения и добавляет извлеченное слово в массив.

Выход этого метода будет:

['and', 'arrived', 'at', 'bus', 'but', 'early', 'for', 'i', 'joe', 'late', 'looked', 'mary', 'noon', 'samantha', 'station', 'the', 'took', 'train', 'until', 'waited', 'was']

Шаг 3: строить словарный запас и генерировать векторы

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

def generate_bow(allsentences):        vocab = tokenize(allsentences)    print("Word List for Document \n{0} \n".format(vocab));
for sentence in allsentences:        words = word_extraction(sentence)        bag_vector = numpy.zeros(len(vocab))        for w in words:            for i,word in enumerate(vocab):                if word == w:                     bag_vector[i] += 1                            print("{0}\n{1}\n".format(sentence,numpy.array(bag_vector)))

Вот определенный ввод и выполнение нашего кода:

allsentences = ["Joe waited for the train train", "The train was late", "Mary and Samantha took the bus",
"I looked for Mary and Samantha at the bus station",
"Mary and Samantha arrived at the bus station early but waited until noon for the bus"]
generate_bow(allsentences)

Выходные векторы для каждого из предложений:

Output:
Joe waited for the train train[0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 2. 0. 1. 0.]
The train was late[0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1.]
Mary and Samantha took the bus[1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 1. 0. 1. 0. 0. 1. 0. 0. 0. 0.]
I looked for Mary and Samantha at the bus station[1. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1. 1. 0. 0. 0. 0. 0. 0.]
Mary and Samantha arrived at the bus station early but waited until noon for the bus[1. 1. 1. 2. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 1. 1. 0.]

Как вы можете видеть, Каждое предложение было сравнено с нашим списком слов, создаваемых на шаге 1. На основании сравнения, значение элемента элемента вектора может быть увеличено Отказ Эти векторы могут использоваться в алгоритмах ML для классификации и предсказаний документа.

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

ИЗМЕНЕНИЕ СУМКА СЛОВА

Модель лука считает только если известное слово происходит в документе или нет. Это не волнует смысл, контекст и порядок, в котором они появляются.

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

Ограничения банта

  1. Семантическое значение : Основной подход Лука не учитывает значение слова в документе. Он полностью игнорирует контекст, в котором он используется. То же слово может использоваться в нескольких местах на основе контекста или близлежащих слов.
  2. Размер вектора : Для большого документа размер вектор может быть огромным, что приводит к большому количеству вычислений и времени. Вам может потребоваться игнорировать слова, основанные на актуальности для вашего применения.

Это было небольшое введение в метод лука. Код показал, как он работает на низком уровне. Гораздо больше, чтобы понять о луках. Например, вместо разделения нашего предложения в одно слово (1 грамм) вы можете разделить в паре двух слов (би-грамм или 2-грамм). Время от времени представление BI-GRAM, кажется, намного лучше, чем использование 1-грамма. Они часто можно представить с использованием N-грамма. Я перечислил некоторые исследовательские документы в разделе ресурсов для более глубоких знаний.

Вам не нужно кодировать лук всякий раз, когда вам это нужно. Это уже часть многих доступных структур, таких как CountVectorizer в SCI-KIT.

Наш предыдущий код может быть заменен на:

from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()X = vectorizer.fit_transform(allsentences)print(X.toarray())

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

Спасибо за чтение статьи. Показанный код доступен на моем Гадость .

Вы можете следовать за мной на Средний , Twitter и LinkedIn Для любых вопросов вы можете добраться до меня по электронной почте (PRAVEEND806 [AT] Gmail [dot] com).

Ресурсы для читать больше на сумке слов

  1. Wikipedia-Bow
  2. Понимание сумки-слов модели: статистическая структура
  3. SEMANTICS – Сохранение моделей сумки-слов и приложений