| ClipArtMag Science Blog |

Free Cliparts

Встраивания слов - word2vec

Перевод статьи - Word Embeddings - word2vec

Автор - Mubaris NK

Источник оригинальной статьи:

https://mubaris.com/2017/12/14/word2vec/

Обработка естественного языка или NLP сочетает в себе силу компьютерной науки, искусственного интеллекта (AI) и компьютерной лингвистики таким образом, что позволяет компьютерам понимать естественный язык человека и, в некоторых случаях, даже воспроизводить его. Конечной целью NPL является анализ человеческого языка, "понять" его, а затем получить связное значение таким образом, который выгоден для пользователя. В идеальных сценариях NPL выполняет задачу быстрее и намного эффективнее и эффективнее, чем любой человек.

Одной из главных проблем в NPL является "понимание" языка. Мы используем речь или текст в качестве основного средства коммуникации. Но компьютер может понимать только числа или двоичные. Процесс преобразования текста или слова в векторы (числа) называется Встраиванием слов. В этом посте мы обсудим word2vec, который является популярной моделью вложения слов.

Word2vec

Word2vec-это двухслойная нейронная сеть, которая обрабатывает текст. Его вход представляет собой текстовый корпус, а его вывод - это набор векторов: векторов признаков для слов в этом корпусе. Он был представлен в 2013 году командой исследователей во главе с Томасом Миколовым в Google - читайте статью здесь.

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

1) CBOW (непрерывный мешок слов): эта модель пытается предсказать слово на основе его соседей.

2) SkipGram: эта модель пытается предсказать соседей слова.

CBOW стремится найти вероятность слова, происходящего в окрестности (контексте). Таким образом, он обобщает все различные контексты, в которых можно использовать слово. В то время как SkipGram стремится изучать различные контексты по отдельности. Поэтому SkipGram должен иметь достаточно ного данных w.r.t. в каждом контексте. Следовательно SkipGram требуется больше данных для обучения, также SkipGram (при наличии достаточных данных) содержится больше знаний о контексте.

Это понятие слова "соседство" лучше всего описать, рассматривая центральное (или текущее) слово и окно слов вокруг него. Например, если мы рассмотрим предложение " The quick brown fox jumped over the lazy dog" и размер окна 2, у нас будут следующие пары для модели skip-gram:

Training samples

В отличие от этого, для CBOW модели, мы будем вводить контекстные слова в окне (например, “the”, “brown”, “fox”) и целью прогнозирования целевой слово “ quick” (просто поменять ввод с предсказанием трубопровода от skip-gram модели).

Ниже приводится визуализация skip-gram и моделей CBOW :

CBOW Skip gram

Поскольку SkipGram были показаны, чтобы лучше выполнять по аналогии задач, чем модель CBOW, лучше использовать модель SkipGram по большей части. В целом, если вы понимаете одну модель, то довольно легко понять другую: просто переверните входные данные и прогнозы. Поскольку обе статьи сосредоточены на модели skip-gram, этот пост будет делать то же самое.

Процедура Обучения Модели SkipGram

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

\[argmax_{\theta} \frac{1}{T} \sum_{t=1}^{T} \sum_{j \in c, j != 0} log p(w_{t + j} w_{t} ; \theta)\]

Это уравнение по существу говорит о том, что существует некоторая вероятность p наблюдения определенного слова, которое находится в окне размера с текущего слова wt. Эта вероятность обусловлена текущим словом (wt) и некоторой настройкой параметров θ (определяется нашей моделью). Мы хотим установить эти параметры θ таким образом, чтобы эта вероятность была максимизирована по всему корпусу.

Модель SkipGram - это двухслойная нейронная сеть. В скрытом слое используется линейная функция активации в выходном слое используется функция активации Softmax.

Реализация

Gensim - это бесплатная Библиотека Python, предназначенная для автоматического извлечения семантических тем из документов, как можно более эффективно (с компьютерной точки зрения) и безболезненно (с человеческой точки зрения). Мы будем использовать библиотеку Gensim для реализации модели Word2Vec на корпусе " Alice’s Adventures in Wonderland by Lewis Carroll" из проекта Гутенберга. Мы будем использовать NLTK для доступа к корпусу. NLTK является ведущей платформой для создания программ Python для работы с данными человеческого языка.

Прежде всего мы начнем с импорта пакетов.

 

# Word2Vec Model
from gensim.models import Word2Vec
# NLTK
import nltk

# Download Project Gutenberg Corpus
nltk.download("gutenberg")

 

[nltk_data] Downloading package gutenberg to
[nltk_data]     /home/mubaris/nltk_data...
[nltk_data]   Package gutenberg is already up-to-date!





True

 

Нам нужен наш корпус в виде предложений для модели Gensim Word2Vec. Следующий example_corpus имеет 2 предложения.

 


example_sentence = [['this', 'is', 'a', 'sentence'], ['second', 'sentence'],
['another', 'sentence']]

# Converting the corpus in to sentences
sentences = nltk.corpus.gutenberg.sents("carroll-alice.txt")

 

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

 


# Creating the model
model = Word2Vec(sentences, size=150, min_count=4, window=5, workers=4, sg=1)

 

Там мы наша модель. Позвольте мне объяснить аргументы.

size: (по умолчанию 100) количество размеров вложения, например, длина плотного вектора для представления каждого знака (слова).

window: (по умолчанию 5) максимальное расстояние между целевым словом и словами вокруг целевого слова.

min_count: (по умолчанию 5) минимальное количество слов, которое следует учитывать при обучении модели; слова с вхождением меньше этого числа будут игнорироваться.

workers: (по умолчанию 3) Количество потоков, используемых во время обучения.

sg: (по умолчанию 0 или CBOW) тренировочный алгоритм, либо CBOW (0) или skip gram (1).

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

 


# Vocabulary
words = list(model.wv.vocab)

# Vector of Alice
alice = model.wv["Alice"]
print(alice)

 


[ 0.12896043  0.02943942  0.16370748 -0.07625519 -0.00826628 -0.00353342
  0.12328927 -0.07531034 -0.06177002  0.09647282  0.03362986 -0.02997118
 -0.05007924  0.09212659  0.07132912  0.16243213 -0.29858825  0.18719195
  0.02595143  0.01386956 -0.15193544  0.09392646 -0.06538922 -0.05666091
  0.16926786  0.21055809 -0.0648766  -0.16892284  0.27633667 -0.04381052
  0.07857908  0.1461474   0.06817818 -0.0357273  -0.28752351  0.13935697
 -0.03184435  0.2402489   0.02026348  0.04282037  0.05627181  0.07880288
  0.08609539  0.06406744  0.18007798  0.02402422 -0.13297294  0.0033468
  0.01976873  0.01767304 -0.04149737  0.16874173  0.10499206 -0.08900665
  0.0977525   0.06589122  0.01379999 -0.09205106  0.04052607  0.14080274
 -0.02682975 -0.03543742 -0.12036515 -0.02565189 -0.06261415 -0.10798275
 -0.14207236 -0.07081407  0.27981269 -0.05318935 -0.07135037 -0.08173097
 -0.05527892  0.02395226  0.08671912 -0.04056617  0.02169161 -0.01858786
 -0.00410686  0.06729784 -0.04358509  0.18316497  0.07948966  0.02275082
  0.08571164  0.06222373 -0.1389409  -0.0698042   0.01086436  0.18955809
  0.15223378 -0.05003522  0.01672419 -0.09315669 -0.03163765 -0.08073105
  0.09383699 -0.00891203 -0.07321226  0.09350048 -0.07768501 -0.17239663
 -0.28071246  0.02471785 -0.02146135  0.00578363  0.08035611 -0.05875581
 -0.0067123  -0.09600651  0.03247541  0.13892047  0.10834643 -0.00687588
 -0.10518014  0.17959517 -0.18189816  0.12606408  0.07878652 -0.07759473
  0.02858162 -0.01801082 -0.00908613  0.02999768  0.01901592 -0.08107233
 -0.05174483  0.01158905  0.04703816 -0.00074181  0.02505895 -0.21482743
 -0.04586244  0.13998622 -0.03205461  0.11394737 -0.0459122  -0.09286188
  0.05483688 -0.08368739  0.00788889 -0.01870637 -0.13955207 -0.17281808
 -0.09798446  0.0198724  -0.26866159  0.12399895 -0.07194    -0.03187025]

 

Это векторное представление " Alice". Вы можете сложить вектор каждого слова в словаре.

 


# Saving the model
model.save("alice.bin")

# Loading the saved model
model = Word2Vec.load("alice.bin")

 

С помощью модели можно выполнять различные задачи NLP word.

 


# Similarity between 2 words
print(model.wv.similarity("Alice", "Rabbit"))
print(model.wv.similarity("That", "baby"))

# Similar Words
print(model.wv.most_similar(positive=["Alice", "cat"], negative=["baby"]))

 


0.975325289838
0.970169193531
[('much', 0.9961279630661011), ('That', 0.9954456686973572),
('must', 0.9953832030296326), ('tell', 0.9952795505523682),
('say', 0.9951117634773254), ('doesn', 0.995048999786377),
('Well', 0.9950287342071533), ('It', 0.9949702620506287),
('But', 0.9948418736457825), ('wouldn', 0.9947409629821777)]

 

Код доступен в этом репозитории Github Repo

Ресурсы

Видео

Статьи

Книги