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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Обучение модели word2vec и fastText на текстовом корпусе)
 
(не показано 37 промежуточных версий 2 участников)
Строка 1: Строка 1:
'''Статья находится в разработке'''
+
'''Векторное представление слов''' (англ. ''word embedding'') {{---}} общее название для различных подходов к моделированию языка и обучению представлений в обработке естественного языка, направленных на сопоставление словам из некоторого словаря векторов небольшой размерности.
 +
 
 +
== One-hot encoding ==
 +
[[Файл:One-hot-encoding.png|thumb|right|250px|[https://www.shanelynn.ie/get-busy-with-word-embeddings-introduction/ Источник]]]
 +
Пусть число различных слов равно <math>K</math>. Сопоставим слову с номером <math>i</math> вектор длины <math>K</math>, в котором <math>i</math>-тая координата равна единице, а все остальные {{---}} нулям. Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
  
'''Векторное представление слов''' - общее название для различных подходов к моделированию языка и обучению представлений в обработке естественного языка, направленных на сопоставление словам (и, возможно, фразам) из некоторого словаря векторов из значительно меньшего количества слов в словаре. Для этого используют нейронные сети, методы понижения размерности в применении к матрицам совместных упоминаний слов (word co-occurrence matrices) и явные представления, обучающиеся на контекстах упоминаний слов (explicit representations).
 
  
TODO:
 
tf-idf
 
cosinus measure
 
bag-of-words (BOW)
 
continuous BOW
 
N-gram
 
skip-gram
 
word2vec with skip-grams learning
 
  
== One-hot encoding ==
 
Наиболее простой способ представления слов в виде векторов. Пусть число различных слов равно |V|. Сопоставим слову номер i вектор длины |V|, в котором i-тая координата равна 1, а все остальные - нули. Недостатком подходя является то, что близкие по смыслу слова обладают совершенно разными векторами, из-за чего не получится искать синонимы слов.
 
  
[[Файл:One-hot-encoding.png|300px]]
 
  
 
== word2vec ==
 
== word2vec ==
word2vec - способ построения сжатого пространства векторов слов. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, «обучаясь» на входных текстовых данных, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл), в векторном представлении будут иметь близкие координаты векторов-слов. В word2vec существуют две основных модели обучения: skip-grams и CBOW (Continuous Bag of Words). В модели skip-grams по слову предсказываются слова из его контекста, а в модели CBOW по контексту подбирается наиболее вероятное слово.  
+
word2vec {{---}} способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл), в векторном представлении имеют высокое ''косинусное сходство'' (англ. [https://en.wikipedia.org/wiki/Cosine_similarity cosine similarity]):
  
Полученные векторы-слова могут быть использованы для вычисления «семантического расстояния» между словами. После обучения векторы отражают различные грамматические и семантические концепции.
+
:<math>\text{similarity}(\mathbf{A}, \mathbf{B}) = \cos(\theta) = {\mathbf{A} \cdot \mathbf{B} \over \|\mathbf{A}\| \|\mathbf{B}\|} = \frac{ \sum\limits_{i=1}^{n}{A_i  B_i} }{ \sqrt{\sum\limits_{i=1}^{n}{A_i^2}}  \sqrt{\sum\limits_{i=1}^{n}{B_i^2}} },</math>
  
W_{king} - W_{man} + W_{woman} = W_{queen}
+
 
W_{shirt} - W_{clothing} + W_{furniture} = W_{chair}
+
В 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'', позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.
 +
 
 +
{|align="center"
 +
|-valign="top"
 +
|[[Файл:skip-gram.png|270px|thumb|[http://www.claudiobellei.com/2018/01/06/backprop-word2vec/ Схема сети для модели Skip-gram]]]
 +
|[[Файл:cbow.png|260px|thumb|[http://www.claudiobellei.com/2018/01/06/backprop-word2vec/ Схема сети для модели CBOW]]]
 +
|[[Файл:Words-space.png|thumb|right|500px|Полученные векторы-слова отражают различные грамматические и семантические [https://towardsdatascience.com/word-embedding-with-word2vec-and-fasttext-a209c1d3e12c концепции].<br>
 +
<math>W_{king} + (W_{woman} - W_{man}) = W_{queen}</math><br>
 +
<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(<font color="green">'word2vec-ruscorpora-300'</font>)<br>
 +
<font color="grey"># ''Выведем первые 10 слов корпуса.<br># ''В модели "word2vec-ruscorpora-300" после слова указывается часть речи: NOUN (существительное), ADJ (прилагательное) и так далее.''<br># ''Но существуют также предоубученные модели без разделения слов по частям речи, смотри [https://github.com/RaRe-Technologies/gensim-data репозиторий]''</font>
 +
list(russian_model.vocab.keys())[:<font color="blue">10</font>]
 +
''<font color="grey"># ['весь_DET', 'человек_NOUN', 'мочь_VERB', 'год_NOUN', 'сказать_VERB', 'время_NOUN', 'говорить_VERB', 'становиться_VERB', 'знать_VERB', 'самый_DET']</font>''<br>
 +
<font color="grey"># ''Поиск наиболее близких по смыслу слов.''</font>
 +
russian_model.most_similar(<font color="green">'кошка_NOUN'</font>)
 +
<font color="grey">''#  [('кот_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)]''</font><br>
 +
<font color="grey"># ''Вычисление сходства слов''</font>
 +
russian_model.similarity(<font color="green">'мужчина_NOUN'</font>, <font color="green">'женщина_NOUN'</font>)
 +
<font color="grey">''# 0.85228276''</font><br>
 +
<font color="grey"># ''Поиск лишнего слова''</font>
 +
russian_model.doesnt_match(<font color="green">'завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN'</font>.split())
 +
<font color="grey"># ''хлопья_NOUN''</font><br>
 +
<font color="grey"># ''Аналогия: Женщина + (Король - Мужчина) = Королева''</font>
 +
russian_model.most_similar(positive=[<font color="green">'король_NOUN'</font>,<font color="green">'женщина_NOUN'</font>], negative=[<font color="green">'мужчина_NOUN'</font>], topn=1)
 +
<font color="grey"># ''[('королева_NOUN', 0.7313904762268066)]''</font><br>
 +
<font color="grey"># ''Аналогия: Франция = Париж + (Германия - Берлин)''</font>
 +
russian_model.most_similar(positive=[<font color="green">'париж_NOUN'</font>,<font color="green">'германия_NOUN'</font>], negative=[<font color="green">'берлин_NOUN'</font>], topn=1)
 +
<font color="grey"># ''[('франция_NOUN', 0.8673800230026245)]''</font>
 +
 
 +
=== Обучение модели word2vec и fastText на текстовом корпусе ===
 +
'''from''' gensim.models.word2vec '''import''' Word2Vec
 +
'''from''' gensim.models.fasttext '''import''' FastText
 +
'''import''' gensim.downloader '''as''' download_api<br>
 +
<font color="grey"># ''Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string))''</font>
 +
<font color="grey"># ''В этом текстовом корпусе часть речи для слов не указывается''</font>
 +
corpus = download_api.load(<font color="green">'text8'</font>)<br>
 +
<font color="grey"># ''Обучим модели word2vec и fastText''</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>
 +
word2vec_model.most_similar(<font color="green">'car'</font>)[:<font color="blue">3</font>]
 +
''<font color="grey"># [('driver', 0.8033335208892822), ('motorcycle', 0.7368553876876831), ('cars', 0.7001584768295288)]</font>''<br>
 +
fastText_model.most_similar('car')[:3]
 +
''<font color="grey"># [('lcar', 0.8733218908309937), ('boxcar', 0.8559106588363647), ('ccar', 0.8268736004829407)]</font>
  
 
== См. также ==
 
== См. также ==
 
* [[Обработка естественного языка]]
 
* [[Обработка естественного языка]]
  
== Примечания ==
+
== Источники информации ==
<references/>
+
* [https://en.wikipedia.org/wiki/Word_embedding Word embedding] {{---}} статья о векторных представлениях в английской Википедии
 +
* [https://youtu.be/Wq414SDmOCM (YouTube) Обработка естественного языка] {{---}} лекция на русском Даниила Полыковского в курсе Техносферы
 +
* [https://youtu.be/ERibwqs9p38 (YouTube) Word Vector Representations: word2vec] {{---}} лекция на английском в Стэнфордском Университете
 +
* [https://arxiv.org/abs/1301.3781 word2vec article] {{---}} оригинальная статья по word2vec от Томаса Миколова
 +
* [https://code.google.com/archive/p/word2vec/ word2vec code] {{---}} исходный код word2vec на Google Code
 +
* [https://rare-technologies.com/word2vec-tutorial Gensim tutorial on word2vec] {{---}} небольшое руководство по работе с word2vec в библиотеке Gensim
 +
* [https://radimrehurek.com/gensim/models/fasttext.html Gensim documentation on fastText] {{---}} документация по fastText в библиотеке Gensim
 +
* [https://github.com/RaRe-Technologies/gensim-data Gensim Datasets] {{---}} репозиторий предобученных моделей для библиотеки Gensim
 +
* [https://fasttext.cc/ fastText] {{---}} NLP библиотека от Facebook
 +
* [https://arxiv.org/pdf/1607.04606.pdf fastText article] {{---}} оригинальная статья по fastText от Piotr Bojanowski
 +
* [https://rusvectores.org/ru/ RusVectōrēs] {{---}} онлайн сервис для работы с семантическими отношениями русского языка
  
== Источники информации ==
+
[[Категория: Машинное обучение]] [[Категория: Обработка естественного языка]]
# [https://fasttext.cc/] {{---}} fastText by Facebook
 

Текущая версия на 23:35, 5 марта 2019

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

One-hot encoding[править]

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






word2vec[править]

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

[math]\text{similarity}(\mathbf{A}, \mathbf{B}) = \cos(\theta) = {\mathbf{A} \cdot \mathbf{B} \over \|\mathbf{A}\| \|\mathbf{B}\|} = \frac{ \sum\limits_{i=1}^{n}{A_i B_i} }{ \sqrt{\sum\limits_{i=1}^{n}{A_i^2}} \sqrt{\sum\limits_{i=1}^{n}{B_i^2}} },[/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, позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.

Полученные векторы-слова отражают различные грамматические и семантические концепции.
[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 слов корпуса.
#
В модели "word2vec-ruscorpora-300" после слова указывается часть речи: NOUN (существительное), ADJ (прилагательное) и так далее.
#
Но существуют также предоубученные модели без разделения слов по частям речи, смотри репозиторий
list(russian_model.vocab.keys())[:10] # ['весь_DET', 'человек_NOUN', 'мочь_VERB', 'год_NOUN', 'сказать_VERB', 'время_NOUN', 'говорить_VERB', 'становиться_VERB', 'знать_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
# Аналогия: Женщина + (Король - Мужчина) = Королева russian_model.most_similar(positive=['король_NOUN','женщина_NOUN'], negative=['мужчина_NOUN'], topn=1) # [('королева_NOUN', 0.7313904762268066)]
# Аналогия: Франция = Париж + (Германия - Берлин) russian_model.most_similar(positive=['париж_NOUN','германия_NOUN'], negative=['берлин_NOUN'], topn=1) # [('франция_NOUN', 0.8673800230026245)]

Обучение модели 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)]

См. также[править]

Источники информации[править]