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

Реализация Word2Vec с библиотекой Gensim в Python

Автор оригинала: Usman Malik.

Реализация Word2Vec с библиотекой Gensim в Python

Вступление

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

Правила различных естественных языков различны. Однако в естественных языках есть одна общая черта: гибкость и эволюция.

Естественные языки очень гибки. Предположим, вы ведете машину, и ваш друг произносит одно из этих трех высказываний: “Остановись”, “Останови машину”, “Половина”. Вы сразу понимаете, что он просит вас остановить машину. Это происходит потому, что естественные языки чрезвычайно гибки. Есть несколько способов сказать одну вещь.

Другим важным аспектом естественных языков является то, что они постоянно развиваются. Например, несколько лет назад не было такого термина, как “Google it”, который относится к поиску чего-то в поисковой системе Google. Естественные языки всегда претерпевают эволюцию.

Напротив, компьютерные языки следуют строгому синтаксису. Если вы хотите, чтобы компьютер напечатал что-то на экране, для этого есть специальная команда. Задача обработки естественного языка состоит в том, чтобы заставить компьютеры понимать и генерировать человеческий язык так, как это делают люди.

Это огромная задача, и здесь есть много препятствий. Эта видеолекция из Мичиганского университета содержит очень хорошее объяснение того, почему НЛП так трудно.

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

Подходы к встраиванию слов

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

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

  1. Мешок слов
  2. Схема TF-IDF
  3. Word2Vec

Мешок слов

Подход “мешок слов” – один из самых простых подходов к встраиванию слов. Ниже приведены шаги для создания вложений слов с использованием подхода “мешок слов”.

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

  • S1 любовь дождь
  • S2 дождь уходи
  • Я в отъезде

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

  1. Чтобы преобразовать вышеприведенные предложения в соответствующие им представления вложения слов с использованием подхода мешка слов, нам необходимо выполнить следующие шаги:
  2. Разберите предложение. Для каждого слова в предложении добавьте 1 вместо слова в словаре и добавьте ноль для всех других слов, которые не существуют в словаре. Например, представление мешка слов для предложения S1 (I love rain) выглядит следующим образом: [1, 1, 1, 0, 0, 0]. Аналогично для S2 и S3 мешок словесных представлений [0, 0, 2, 1, 1, 0] и [1, 0, 0, 0, 1, 1], соответственно.

Обратите внимание, что для S2 мы добавили 2 вместо “дождя” в словаре; это потому, что S2 содержит “дождь” дважды.

Плюсы и минусы Мешка слов

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

Основным недостатком подхода “мешок слов” является то, что нам нужно создавать огромные векторы с пустыми пространствами, чтобы представить число (разреженную матрицу), которое потребляет память и пространство. В предыдущем примере у нас было только 3 предложения. Тем не менее, вы можете видеть три нуля в каждом векторе.

Представьте себе корпус с тысячами статей. В таком случае количество уникальных слов в словаре может составлять тысячи. Если один документ содержит 10% уникальных слов, соответствующий вектор встраивания все равно будет содержать 90% нулей.

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

Тип подхода “мешок слов”, известный как n-граммы, может помочь поддерживать связь между словами. N-грамм относится к непрерывной последовательности из n слов. Например, 2 грамма для предложения “Вы не счастливы”, “Вы есть”, “нет” и “не счастливы”. Хотя подход n-граммов способен фиксировать отношения между словами, размер набора признаков растет экспоненциально при слишком большом количестве n-граммов.

Схема TF-IDF

Схема TF-IDF-это тип подхода к словам мешка, когда вместо добавления нулей и единиц в вектор вложения вы добавляете плавающие числа, которые содержат больше полезной информации по сравнению с нулями и единицами. Идея схемы TF-IDF заключается в том, что слова, имеющие высокую частоту встречаемости в одном документе и меньшую частоту встречаемости во всех других документах, более важны для классификации.

TF-IDF-это произведение двух значений: Частоты термина (TF) и обратной частоты документа (IDF).

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

Term frequence = (Number of Occurences of a word)/(Total words in the document)

Например, если мы посмотрим на предложение S1 из предыдущего раздела, то есть “Я люблю дождь”, то каждое слово в предложении встречается один раз и, следовательно, имеет частоту 1. Напротив, для S2, то есть “дождь, дождь уходит”, частота “дождя” равна двум, в то время как для остальных слов она равна 1.

IDF относится к журналу общего количества документов, деленному на количество документов, в которых существует слово, и может быть вычислен как:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

Например, значение IDF для слова “дождь” равно 0,1760, так как общее количество документов равно 3, а дождь появляется в 2 из них, поэтому log(3/2) равно 0,1760. С другой стороны, если вы посмотрите на слово “любовь” в первом предложении, оно появляется в одном из трех документов , и поэтому его значение IDF равно log(3) , что составляет 0,4771.

Плюсы и минусы TF-IDF

Хотя TF-IDF является улучшением по сравнению с простым подходом “мешок слов” и дает лучшие результаты для общих задач НЛП, общие плюсы и минусы остаются теми же. Нам все еще нужно создать огромную разреженную матрицу, которая также требует гораздо больше вычислений, чем простой подход к сумке слов.

Word2Vec

href=”https://en.wikipedia.org/wiki/Word2vec”>Подход к встраиванию Word2Vec, разработанный Томасом Миколовым , считается самым современным. Подход Word2Vec использует методы глубокого обучения и нейронных сетей для преобразования слов в соответствующие векторы таким образом, чтобы href=”https://en.wikipedia.org/wiki/Word2vec”>Подход к встраиванию Word2Vec, разработанный

Word2Vec возвращает некоторые удивительные результаты. Способность Word2Vec поддерживать семантическую связь отражена классическим примером, когда если у вас есть вектор для слова “Король” и вы удаляете вектор, представленный словом “Мужчина”, из “Короля” и добавляете к нему “Женщины”, вы получаете вектор, близкий к вектору “Королева”. Это отношение обычно представляется как:

King - Man + Women = Queen

Модель Word2Vec поставляется в двух вариантах: Skip Gram Model и Continuous Bag of Words Model (CBOW).

В модели Skip Gram контекстные слова предсказываются с использованием базового слова. Например, учитывая предложение “Я люблю танцевать под дождем”, модель skip gram будет предсказывать “любовь” и “танец”, учитывая слово “to” в качестве входных данных.

Напротив, модель CBOW будет предсказывать “to”, если контекстные слова “love” и “dance” будут подаваться в качестве входных данных модели. Модель изучает эти отношения с помощью глубоких нейронных сетей.

Плюсы и минусы Word2Vec

Word2Vec имеет ряд преимуществ перед bag of words и схемой IF-IDF. Word2Vec сохраняет семантическое значение различных слов в документе. Контекстная информация не теряется. Еще одним большим преимуществом подхода Word2Vec является то, что размер вектора вложения очень мал. Каждое измерение в векторе вложения содержит информацию об одном аспекте слова. Нам не нужны огромные разреженные векторы, в отличие от мешка слов и подходов TF-IDF.

Примечание : Математические детали работы Word2Vec включают в себя объяснение нейронных сетей и вероятности softmax, что выходит за рамки данной статьи. Если вы хотите понять математические основы Word2Vec, пожалуйста, прочтите эту статью: https://arxiv.org/abs/1301.3781

Word2Vec в Python с библиотекой Gensim

В этом разделе мы реализуем модель Word2Vec с помощью библиотеки Python Gensim . Выполните следующие действия:

Создание корпуса

Ранее мы обсуждали, что для создания модели Word2Vec нам нужен корпус. В реальных приложениях модели Word2Vec создаются с использованием миллиардов документов. Например, модель Google Word2Vec обучается с использованием 3 миллионов слов и фраз. Однако для простоты мы создадим модель Word2Vec, используя одну статью Википедии. Наша модель будет не так хороша, как у Google. Хотя этого достаточно, чтобы объяснить, как модель Word2Vec может быть реализована с помощью библиотеки Gensim.

Прежде чем мы сможем обобщить статьи Википедии, нам нужно их извлечь. Для этого мы воспользуемся несколькими библиотеками. Первая библиотека, которую нам нужно загрузить, – это библиотека BeautifulSoup , которая является очень полезной утилитой Python для веб-скрейпинга. Выполните следующую команду в командной строке, чтобы загрузить утилиту Beautiful Soup.

$ pip install beautifulsoup4

Еще одна важная библиотека, которая нам нужна для анализа XML и HTML, – это библиотека lxml . Выполните следующую команду в командной строке, чтобы загрузить lxml:

$ pip install lxml

Статья, которую мы собираемся наскрести, – это статья Википедии об Искусственном интеллекте . Давайте напишем скрипт на Python, чтобы соскрести статью из Википедии:

import bs4 as bs
import urllib.request
import re
import nltk

scrapped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')
article = scrapped_data .read()

parsed_article = bs.BeautifulSoup(article,'lxml')

paragraphs = parsed_article.find_all('p')

article_text = ""

for p in paragraphs:
    article_text += p.text

В приведенном выше скрипте мы сначала загружаем статью Википедии, используя метод urlopen класса request библиотеки urllib . Затем мы читаем содержимое статьи и анализируем его с помощью объекта класса BeautifulSoup . Википедия хранит текстовое содержимое статьи внутри тегов p . Мы используем функцию find_all объекта BeautifulSoup для извлечения всего содержимого из тегов абзаца статьи.

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

Предварительная обработка

На данный момент мы уже импортировали статью. Следующий шаг – предварительная обработка содержимого для модели Word2Vec. Следующий скрипт предварительно обработает текст:

# Cleaing the text
processed_article = article_text.lower()
processed_article = re.sub('[^a-zA-Z]', ' ', processed_article )
processed_article = re.sub(r'\s+', ' ', processed_article)

# Preparing the dataset
all_sentences = nltk.sent_tokenize(processed_article)

all_words = [nltk.word_tokenize(sent) for sent in all_sentences]

# Removing Stop Words
from nltk.corpus import stopwords
for i in range(len(all_words)):
    all_words[i] = [w for w in all_words[i] if w not in stopwords.words('english')]

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

Модель Word2Vec обучается на наборе слов. Во-первых, мы должны преобразовать вашу статью в предложения. Мы используем утилиту nltk.sent_tokenize для преобразования нашей статьи в предложения. Для преобразования предложений в слова мы используем утилиту nltk.word_tokenize . В качестве последнего шага предварительной обработки мы удаляем все стоп-слова из текста.

После завершения выполнения скрипта объект all_words содержит список всех слов в статье. Мы будем использовать этот список для создания нашей модели Word2Vec с библиотекой Gensim.

Создание модели Word2Vec

С помощью Gensim чрезвычайно просто создать модель Word2Vec. Список слов передается в класс Word2Vec пакета gensim.models . Нам нужно указать значение параметра min_count . Значение 2 для min_count указывает на включение в модель Word2Vec только тех слов, которые появляются в корпусе не менее двух раз. Следующий скрипт создает модель Word2Vec, используя статью Википедии, которую мы соскоблили.

from gensim.models import Word2Vec

word2vec = Word2Vec(all_words, min_count=2)

Чтобы просмотреть словарь уникальных слов, существующих в корпусе не менее двух раз, выполните следующий сценарий:

vocabulary = word2vec.wv.vocab
print(vocabulary)

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

Анализ модели

Мы успешно создали нашу модель Word2Vec в последнем разделе. Сейчас самое время исследовать то, что мы создали.

Поиск векторов для слова

Мы знаем, что модель Word2Vec преобразует слова в соответствующие им векторы. Давайте посмотрим, как мы можем рассматривать векторное представление любого конкретного слова.

v1 = word2vec.wv['artificial']

Вектор v1 содержит векторное представление для слова “искусственный”. По умолчанию стомерный вектор создается Gensim Word2Vec. Это гораздо, гораздо меньший вектор по сравнению с тем, что было бы произведено мешком слов. Если мы используем подход мешка слов для встраивания статьи, то длина вектора для каждого будет равна 1206, так как существует 1206 уникальных слов с минимальной частотой 2. Если минимальная частота встречаемости установлена равной 1, то размер вектора мешка слов будет еще больше увеличиваться. С другой стороны, векторы, генерируемые с помощью Word2Vec, не зависят от размера словаря.

Поиск Похожих Слов

Ранее мы говорили, что контекстная информация слов не теряется при использовании подхода Word2Vec. Мы можем проверить это, найдя все слова, похожие на слово “интеллект”.

Взгляните на следующий сценарий:

sim_words = word2vec.wv.most_similar('intelligence')

Если вы выведете переменную sum_words на консоль, то увидите слова, наиболее похожие на “интеллект”, как показано ниже:

('ai', 0.7124934196472168)
('human', 0.6869025826454163)
('artificial', 0.6208730936050415)
('would', 0.583903431892395)
('many', 0.5610555410385132)
('also', 0.5557990670204163)
('learning', 0.554862380027771)
('search', 0.5522681474685669)
('language', 0.5408136248588562)
('include', 0.5248900055885315)

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

Вывод

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

Я бы предложил вам создать собственную модель Word2Vec с помощью любого текстового корпуса и посмотреть, сможете ли вы получить лучшие результаты по сравнению с подходом bag of words.