Векторное представление слов — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 18: Строка 18:
 
word2vec {{---}} способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл), в векторном представлении будут иметь близкие координаты векторов-слов.  
 
word2vec {{---}} способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл), в векторном представлении будут иметь близкие координаты векторов-слов.  
  
В word2vec существуют две основных модели обучения: Skip-gram и CBOW (англ. ''Continuous Bag of Words''). В модели Skip-gram по слову предсказываются слова из его контекста, а в модели CBOW по контексту подбирается наиболее вероятное слово. На выходном слое используется функция <math>softmax</math> или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу <math>W</math>, соединяющую входной и скрытый слои, происходит выбор одной строки <math>W</math>. Размерность <math>N</math> является гиперпараметром алгоритма, а обученная матрица <math>W</math> {{---}} выходом, так как ее строки содержат векторные представления слов.
+
В word2vec существуют две основных модели обучения: ''Skip-gram'' и ''CBOW'' (англ. ''Continuous Bag of Words''). В модели ''Skip-gram'' по слову предсказываются слова из его контекста, а в модели ''CBOW'' по контексту подбирается наиболее вероятное слово. На выходном слое используется функция <math>softmax</math> или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу <math>W</math>, соединяющую входной и скрытый слои, происходит выбор одной строки <math>W</math>. Размерность <math>N</math> является гиперпараметром алгоритма, а обученная матрица <math>W</math> {{---}} выходом, так как ее строки содержат векторные представления слов.
  
Для ускорения обучения моделей Skip-gram и CBOW используются модификации <math>softmax</math>, такие как иерархический <math>softmax</math> и ''negative sampling'', позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.
+
Для ускорения обучения моделей ''Skip-gram'' и CBOW используются модификации <math>softmax</math>, такие как иерархический <math>softmax</math> и ''negative sampling'', позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.
  
 
{|align="center"
 
{|align="center"
Строка 39: Строка 39:
 
  '''import''' gensim.downloader '''as''' download_api
 
  '''import''' gensim.downloader '''as''' download_api
 
  russian_model = download_api.load(<font color="green">'word2vec-ruscorpora-300'</font>)<br>
 
  russian_model = download_api.load(<font color="green">'word2vec-ruscorpora-300'</font>)<br>
  <font color="green"># ''Первые 10 слов корпуса''</font>
+
  <font color="grey"># ''Первые 10 слов корпуса''</font>
 
  list(russian_model.vocab.keys())[:<font color="blue">10</font>]
 
  list(russian_model.vocab.keys())[:<font color="blue">10</font>]
  [<font color="green">'весь_DET'</font>, <font color="green">'человек_NOUN'</font>, <font color="green">'мочь_VERB'</font>, <font color="green">'год_NOUN'</font>, <font color="green">'сказать_VERB'</font>, <font color="green">'время_NOUN'</font>, <font color="green">'говорить_VERB'</font>, <font color="green">'становиться_VERB'</font>, <font color="green">'знать_VERB'</font>, <font color="green">'самый_DET'</font>]<br>
+
''<font color="grey"># ['весь_DET', 'человек_NOUN', 'мочь_VERB', 'год_NOUN', 'сказать_VERB', 'время_NOUN', 'говорить_VERB', 'становиться_VERB', 'знать_VERB', 'самый_DET']</font>''<br>  
  <font color="green"># ''Поиск наиболее близких по смыслу слов. После слова указывается часть речи: NOUN, ADJ, VERB, DET''</font>
+
  <font color="grey"># ''Поиск наиболее близких по смыслу слов. После слова указывается часть речи: NOUN, ADJ, VERB, DET''</font>
 
  russian_model.most_similar(<font color="green">'кошка_NOUN'</font>)
 
  russian_model.most_similar(<font color="green">'кошка_NOUN'</font>)
  [(<font color="green">'кот_NOUN'</font>, <font color="blue">0.7570087909698486</font>), (<font color="green">'котенок_NOUN'</font>, <font color="blue">0.7261239290237427</font>), (<font color="green">'собака_NOUN'</font>, <font color="blue">0.6963180303573608</font>),
+
<font color="grey">''#  [('кот_NOUN', 0.7570087909698486), ('котенок_NOUN', 0.7261239290237427), ('собака_NOUN', 0.6963180303573608),''
  (<font color="green">'мяукать_VERB'</font>, <font color="blue">0.6411399841308594</font>), (<font color="green">'крыса_NOUN'</font>, <font color="blue">0.6355636119842529</font>), (<font color="green">'собачка_NOUN'</font>, <font color="blue">0.6092042922973633</font>),
+
#  ''('мяукать_VERB', 0.6411399841308594), ('крыса_NOUN', 0.6355636119842529), ('собачка_NOUN', 0.6092042922973633),''
  (<font color="green">'щенок_NOUN'</font>, <font color="blue">0.6028496026992798</font>), (<font color="green">'мышь_NOUN'</font>, <font color="blue">0.5975362062454224</font>), (<font color="green">'пес_NOUN'</font>, <font color="blue">0.5956044793128967</font>),
+
#  ''('щенок_NOUN', 0.6028496026992798), ('мышь_NOUN', 0.5975362062454224), ('пес_NOUN', 0.5956044793128967),''
  (<font color="green">'кошечка_NOUN'</font>, <font color="blue">0.5920293927192688</font>)]<br>
+
#  ''('кошечка_NOUN', 0.5920293927192688)]''</font><br>
  <font color="green"># ''Вычисление сходства слов''</font>
+
  <font color="grey"># ''Вычисление сходства слов''</font>
 
  russian_model.similarity(<font color="green">'мужчина_NOUN'</font>, <font color="green">'женщина_NOUN'</font>)
 
  russian_model.similarity(<font color="green">'мужчина_NOUN'</font>, <font color="green">'женщина_NOUN'</font>)
  <font color="blue">0.85228276</font><br>
+
<font color="grey">''# 0.85228276''</font><br>
  <font color="green"># ''Поиск лишнего слова''</font>
+
  <font color="grey"># ''Поиск лишнего слова''</font>
 
  russian_model.doesnt_match(<font color="green">'завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN'</font>.split())
 
  russian_model.doesnt_match(<font color="green">'завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN'</font>.split())
  хлопья_NOUN
+
<font color="grey"># ''хлопья_NOUN''</font>
  
 
=== Обучение модели word2vec и fastText на текстовом корпусе ===
 
=== Обучение модели word2vec и fastText на текстовом корпусе ===
Строка 59: Строка 59:
 
  '''from''' gensim.models.fasttext '''import''' FastText
 
  '''from''' gensim.models.fasttext '''import''' FastText
 
  '''import''' gensim.downloader '''as''' download_api<br>
 
  '''import''' gensim.downloader '''as''' download_api<br>
  <font color="green"># ''Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string))''</font>
+
  <font color="grey"># ''Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string))''</font>
 
  corpus = download_api.load(<font color="green">'text8'</font>)<br>
 
  corpus = download_api.load(<font color="green">'text8'</font>)<br>
  <font color="green"># ''Обучим модели word2vec и fastText''</font>
+
  <font color="grey"># ''Обучим модели word2vec и fastText''</font>
 
  word2vec_model = Word2Vec(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>)
 
  word2vec_model = Word2Vec(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>)
 
  fastText_model = FastText(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>)<br>
 
  fastText_model = FastText(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>)<br>
 
  word2vec_model.most_similar(<font color="green">'car'</font>)[:<font color="blue">3</font>]
 
  word2vec_model.most_similar(<font color="green">'car'</font>)[:<font color="blue">3</font>]
  [(<font color="green">'driver'</font>, <font color="blue">0.8033335208892822</font>), (<font color="green">'motorcycle'</font>, <font color="blue">0.7368553876876831</font>), (<font color="green">'cars'</font>, <font color="blue">0.7001584768295288</font>)]<br>  
+
''<font color="grey"># [('driver', 0.8033335208892822), ('motorcycle', 0.7368553876876831), ('cars', 0.7001584768295288)]</font>''<br>  
  fastText_model.most_similar(<font color="green">'car'</font>)[:<font color="blue">3</font>]
+
  fastText_model.most_similar('car')[:3]
  [(<font color="green">'lcar'</font>, <font color="blue">0.8733218908309937</font>), (<font color="green">'boxcar'</font>, <font color="blue">0.8559106588363647</font>), (<font color="green">'ccar'</font>, <font color="blue">0.8268736004829407</font>)]
+
''<font color="grey"># [('lcar', 0.8733218908309937), ('boxcar', 0.8559106588363647), ('ccar', 0.8268736004829407)]</font>
  
 
== См. также ==
 
== См. также ==

Версия 16:47, 4 марта 2019

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

One-hot encoding

One-hot-encoding.png

Пусть число различных слов равно [math]K[/math]. Сопоставим слову с номером [math]i[/math] вектор длины [math]K[/math], в котором [math]i[/math]-тая координата равна единице, а все остальные — нулям. Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.






word2vec

word2vec — способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл), в векторном представлении будут иметь близкие координаты векторов-слов.

В word2vec существуют две основных модели обучения: Skip-gram и CBOW (англ. Continuous Bag of Words). В модели Skip-gram по слову предсказываются слова из его контекста, а в модели CBOW по контексту подбирается наиболее вероятное слово. На выходном слое используется функция [math]softmax[/math] или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу [math]W[/math], соединяющую входной и скрытый слои, происходит выбор одной строки [math]W[/math]. Размерность [math]N[/math] является гиперпараметром алгоритма, а обученная матрица [math]W[/math] — выходом, так как ее строки содержат векторные представления слов.

Для ускорения обучения моделей Skip-gram и CBOW используются модификации [math]softmax[/math], такие как иерархический [math]softmax[/math] и negative sampling, позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.

Схема сети для модели Skip-gram
Схема сети для модели CBOW
Полученные векторы-слова отражают различные грамматические и семантические концепции.
[math]W_{king} + (W_{woman} - W_{man}) = W_{queen}[/math]
[math]W_{walked} - W_{walking} = W_{swam} - W_{swimming}[/math]

fastText

Недостатком word2vec является то, что с его помощью не могут быть представлены слова, не встречающиеся в обучающей выборке. fastText решает эту проблему с помощью [math]N[/math]-грамм символов. Например, [math]3[/math]-граммами для слова яблоко являются ябл, бло, лок, око. Модель fastText строит векторные представления [math]N[/math]-грамм, а векторным представлением слова является сумма векторных представлений всех его [math]N[/math]-грамм. Части слов с большой вероятностью встречаются и в других словах, что позволяет выдавать векторные представления и для редких слов.

Примеры кода с использованием библиотеки Gensim

Загрузка предобученной модели русского корпуса

import gensim
import gensim.downloader as download_api
russian_model = download_api.load('word2vec-ruscorpora-300')
# Первые 10 слов корпуса list(russian_model.vocab.keys())[:10] # ['весь_DET', 'человек_NOUN', 'мочь_VERB', 'год_NOUN', 'сказать_VERB', 'время_NOUN', 'говорить_VERB', 'становиться_VERB', 'знать_VERB', 'самый_DET']
# Поиск наиболее близких по смыслу слов. После слова указывается часть речи: NOUN, ADJ, VERB, DET russian_model.most_similar('кошка_NOUN') # [('кот_NOUN', 0.7570087909698486), ('котенок_NOUN', 0.7261239290237427), ('собака_NOUN', 0.6963180303573608), # ('мяукать_VERB', 0.6411399841308594), ('крыса_NOUN', 0.6355636119842529), ('собачка_NOUN', 0.6092042922973633), # ('щенок_NOUN', 0.6028496026992798), ('мышь_NOUN', 0.5975362062454224), ('пес_NOUN', 0.5956044793128967), # ('кошечка_NOUN', 0.5920293927192688)]
# Вычисление сходства слов russian_model.similarity('мужчина_NOUN', 'женщина_NOUN') # 0.85228276
# Поиск лишнего слова russian_model.doesnt_match('завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN'.split()) # хлопья_NOUN

Обучение модели word2vec и fastText на текстовом корпусе

from gensim.models.word2vec import Word2Vec
from gensim.models.fasttext import FastText
import gensim.downloader as download_api
# Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string)) corpus = download_api.load('text8')
# Обучим модели word2vec и fastText word2vec_model = Word2Vec(corpus, size=100, workers=4) fastText_model = FastText(corpus, size=100, workers=4)
word2vec_model.most_similar('car')[:3] # [('driver', 0.8033335208892822), ('motorcycle', 0.7368553876876831), ('cars', 0.7001584768295288)]
fastText_model.most_similar('car')[:3] # [('lcar', 0.8733218908309937), ('boxcar', 0.8559106588363647), ('ccar', 0.8268736004829407)]

См. также

Источники информации