Изменения

Перейти к: навигация, поиск

Векторное представление слов

1797 байт добавлено, 23:35, 5 марта 2019
Обучение модели word2vec и fastText на текстовом корпусе
== word2vec ==
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> 
В 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> {{---}} выходом, так как ее строки содержат векторные представления слов.
'''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"># ''Поиск наиболее близких по смыслу слов. После слова указывается часть речи: NOUN, ADJ, VERB, DET''</font>
russian_model.most_similar(<font color="green">'кошка_NOUN'</font>)
<font color="grey">''# [('кот_NOUN', 0.7570087909698486), ('котенок_NOUN', 0.7261239290237427), ('собака_NOUN', 0.6963180303573608),''
<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 на текстовом корпусе ===
'''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>
* [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] {{---}} онлайн сервис для работы с семантическими отношениями русского языка
[[Категория: Машинное обучение]] [[Категория: Обработка естественного языка]]
Анонимный участник

Навигация