Векторное представление слов — различия между версиями
Serejke (обсуждение | вклад) (→Примеры кода с использованием библиотеки Gensim) |
Serejke (обсуждение | вклад) (→Примеры кода с использованием библиотеки Gensim) |
||
Строка 36: | Строка 36: | ||
== Примеры кода с использованием библиотеки Gensim == | == Примеры кода с использованием библиотеки Gensim == | ||
=== Загрузка предобученной модели русского корпуса === | === Загрузка предобученной модели русского корпуса === | ||
− | import gensim | + | '''import''' gensim |
− | import gensim.downloader as download_api | + | '''import''' gensim.downloader '''as''' download_api |
− | russian_model = download_api.load("word2vec-ruscorpora-300 | + | russian_model = download_api.load(<font color="green">'word2vec-ruscorpora-300'</font>)<br> |
− | # ''Первые 10 слов корпуса'' | + | <font color="green"># ''Первые 10 слов корпуса''</font> |
− | list(russian_model.vocab.keys())[:10] | + | list(russian_model.vocab.keys())[:<font color="blue">10</font>] |
− | ['весь_DET', 'человек_NOUN', 'мочь_VERB', 'год_NOUN', 'сказать_VERB', 'время_NOUN', 'говорить_VERB', 'становиться_VERB', 'знать_VERB', 'самый_DET']<br> | + | [<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> |
− | # ''Поиск наиболее близких по смыслу слов. После слова указывается часть речи: NOUN, ADJ, VERB, DET'' | + | <font color="green"># ''Поиск наиболее близких по смыслу слов. После слова указывается часть речи: NOUN, ADJ, VERB, DET''</font> |
− | russian_model.most_similar('кошка_NOUN') | + | russian_model.most_similar(<font color="green">'кошка_NOUN'</font>) |
− | [('кот_NOUN', 0.7570087909698486), ('котенок_NOUN', 0.7261239290237427), ('собака_NOUN', 0.6963180303573608), | + | [(<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>), |
− | ('мяукать_VERB', 0.6411399841308594), ('крыса_NOUN', 0.6355636119842529), ('собачка_NOUN', 0.6092042922973633), | + | (<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>), |
− | ('щенок_NOUN', 0.6028496026992798), ('мышь_NOUN', 0.5975362062454224), ('пес_NOUN', 0.5956044793128967), | + | (<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.5920293927192688)]<br> | + | (<font color="green">'кошечка_NOUN'</font>, <font color="blue">0.5920293927192688</font>)]<br> |
− | # ''Вычисление сходства слов'' | + | <font color="green"># ''Вычисление сходства слов''</font> |
− | russian_model.similarity('мужчина_NOUN', 'женщина_NOUN') | + | russian_model.similarity(<font color="green">'мужчина_NOUN'</font>, <font color="green">'женщина_NOUN'</font>) |
− | 0.85228276<br> | + | <font color="blue">0.85228276</font><br> |
− | # ''Поиск лишнего слова'' | + | <font color="green"># ''Поиск лишнего слова''</font> |
− | russian_model.doesnt_match("завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN | + | russian_model.doesnt_match(<font color="green">'завтрак_NOUN хлопья_NOUN обед_NOUN ужин_NOUN'</font>.split()) |
хлопья_NOUN | хлопья_NOUN | ||
=== Обучение модели word2vec и fastText на текстовом корпусе === | === Обучение модели word2vec и fastText на текстовом корпусе === | ||
− | from gensim.models.word2vec import Word2Vec | + | '''from''' gensim.models.word2vec '''import''' Word2Vec |
− | 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> |
− | # ''Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string))'' | + | <font color="green"># ''Скачаем небольшой текстовый корпус (32 Мб) и откроем его как итерируемый набор предложений: iterable(list(string))''</font> |
− | corpus = download_api.load('text8')<br> | + | corpus = download_api.load(<font color="green">'text8'</font>)<br> |
− | # ''Обучим модели word2vec и fastText'' | + | <font color="green"># ''Обучим модели word2vec и fastText''</font> |
− | word2vec_model = Word2Vec(corpus, size=100, workers=4) | + | word2vec_model = Word2Vec(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>) |
− | fastText_model = FastText(corpus, size=100, workers=4)<br> | + | fastText_model = FastText(corpus, size=<font color="blue">100</font>, workers=<font color="blue">4</font>)<br> |
− | word2vec_model.most_similar("car | + | word2vec_model.most_similar(<font color="green">'car'</font>)[:<font color="blue">3</font>] |
− | [('driver', 0.8033335208892822), ('motorcycle', 0.7368553876876831), ('cars', 0.7001584768295288)]<br> | + | [(<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> |
− | fastText_model.most_similar("car | + | fastText_model.most_similar(<font color="green">'car'</font>)[:<font color="blue">3</font>] |
− | [('lcar', 0.8733218908309937), ('boxcar', 0.8559106588363647), ('ccar', 0.8268736004829407)] | + | [(<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>)] |
== См. также == | == См. также == |
Версия 17:36, 2 марта 2019
Векторное представление слов - общее название для различных подходов к моделированию языка и обучению представлений в обработке естественного языка, направленных на сопоставление словам из некоторого словаря векторов небольшой размерности.
Содержание
One-hot encoding
Наиболее простой способ представления слов в виде векторов. Пусть число различных слов равно
. Сопоставим слову с номером вектор длины , в котором -тая координата равна единице, а все остальные - нулям. Недостатком one-hot encoding является то, что по векторным представлениям нельзя судить о схожести смысла слов. Также вектора имеют очень большой размер, из-за чего их неэффективно хранить в памяти.
word2vec
word2vec - способ построения сжатого пространства векторов слов, использующий нейронные сети. Принимает на вход большой текстовый корпус и сопоставляет каждому слову вектор. Сначала он создает словарь, а затем вычисляет векторное представление слов. Векторное представление основывается на контекстной близости: слова, встречающиеся в тексте рядом с одинаковыми словами (а следовательно, имеющие схожий смысл), в векторном представлении будут иметь близкие координаты векторов-слов.
В word2vec существуют две основных модели обучения: Skip-gram и CBOW (Continuous Bag of Words). В модели Skip-gram по слову предсказываются слова из его контекста, а в модели CBOW по контексту подбирается наиболее вероятное слово. На выходном слое используется функция
или его вариация, чтобы получить на выходе распределение вероятности каждого слова. В обеих моделях входные и выходные слова подаются в one-hot encoding, благодаря чему при умножении на матрицу , соединяющую входной и скрытый слои, происходит выбор одной строки . Размерность является гиперпараметром алгоритма, а обученная матрица - выходом, так как ее строки содержат векторные представления слов.Для ускорения обучения моделей Skip-gram и CBOW используются модификации
, такие как иерархический и negative subsampling, позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.fastText
Недостатком word2vec является то, что с его помощью не могут быть представлены слова, не встречающиеся в обучающей выборке. fastText решает эту проблему с помощью N-грамм символов. Например, 3-граммами для слова яблоко являются ябл, бло, лок, око. Модель теперь строит векторные представления N-грамм, а векторным представлением слова будет сумма векторных представлений для всех его N-грамм. Части слов с большой вероятностью встречаются и в других словах, что позволяет выдавать векторные представления и для редких слов тоже.
Примеры кода с использованием библиотеки 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)]
См. также
Источники информации
- Word embedding — статья о векторных представлениях в английской Википедии
- (YouTube) Обработка естественного языка — лекция на русском Даниила Полыковского в курсе Техносферы
- (YouTube) Word Vector Representations: word2vec — лекция на английском в Стэнфордском Университете
- word2vec article — оригинальная статья по word2vec от Томаса Миколова
- word2vec code — исходный код word2vec на Google Code
- Gensim tutorial on word2vec — небольшое руководство по работе с word2vec в библиотеке Gensim
- Gensim documentation on fastText — документация по fastText в библиотеке Gensim
- Gensim Datasets — репозиторий предобученных моделей для библиотеки Gensim
- fastText — NLP библиотека от Facebook
- RusVectōrēs — онлайн сервис для работы с семантическими отношениями русского языка