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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Источники информации)
(Пример использования модели word2vec из библиотеки Gensim)
Строка 36: Строка 36:
 
Недостатком word2vec является то, что с его помощью не могут быть представлены слова, не встречающиеся в обучающей выборке. fastText решает эту проблему с помощью N-грамм символов. Например, 3-граммами для слова ''яблоко'' являются ''ябл'', ''бло'', ''лок'', ''око''. Модель теперь строит векторные представления N-грамм, а векторным представлением слова будет сумма векторных представлений для всех его N-грамм. Части слов с большой вероятностью встречаются и в других словах, что позволяет выдавать векторные представления и для редких слов тоже.
 
Недостатком word2vec является то, что с его помощью не могут быть представлены слова, не встречающиеся в обучающей выборке. fastText решает эту проблему с помощью N-грамм символов. Например, 3-граммами для слова ''яблоко'' являются ''ябл'', ''бло'', ''лок'', ''око''. Модель теперь строит векторные представления N-грамм, а векторным представлением слова будет сумма векторных представлений для всех его N-грамм. Части слов с большой вероятностью встречаются и в других словах, что позволяет выдавать векторные представления и для редких слов тоже.
  
== Пример использования модели word2vec из библиотеки Gensim ==
+
== Примеры кода с использованием библиотеки Gensim ==
  import gensim  
+
* Загрузка предобученной модели русского корпуса
 +
import gensim
 +
  import gensim.downloader as download_api
 +
russian_model = 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
  
 
== См. также ==
 
== См. также ==

Версия 16:43, 2 марта 2019

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

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 subsampling, позволяющие вычислять распределение вероятностей быстрее, чем за линейное время от размера словаря.

Схема сети для модели 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 был разработан в Google под руководством Томаса Миколова и опубликован в 2013 году. fastText - улучшение word2vec также под руководством Томаса Миколова, но уже в Facebook, опукованное в 2015 году.

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

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

  • Загрузка предобученной модели русского корпуса
import gensim
import gensim.downloader as download_api
russian_model = 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

См. также

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