
рд╣рд░ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧреНрд░рдВрдереЛрдВ рдХреЛ рдорд╛рдирддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рд╡реНрдпрдХреНрддрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдпрд╛ рд╡рд┐рд╢реНрд╡-рдкреНрд░рд╕рд┐рджреНрдз рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрдкрдиреНрдпрд╛рд╕реЛрдВ рдкрд░ рд╕рдорд╛рдЪрд╛рд░ рдкрдврд╝рддрд╛ рд╣реЛред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рддрдХрдиреАрдХреЛрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЙрдЪреНрдЪ-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЕрдзрд┐рдХ рдЧрдгрд┐рддреАрдп рддрд░реАрдХреЗ рд╕реЗ рдЧреНрд░рдВрдереЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВред
рдпрд╣ рд▓реЗрдЦ t-SNE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЙрдЪреНрдЪ-рдЖрдпрд╛рдореА Word2Vec рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Word2Vec рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдпрд╛ рдЕрдиреНрдп рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдЧреНрд░рдВрдереЛрдВ рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╡реИрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо Google рд╕рдорд╛рдЪрд╛рд░ рдФрд░ рд░реВрд╕реА рд╕рд╛рд╣рд┐рддреНрдпрдХрд╛рд░ рд▓рд┐рдпреЛ рдЯреЙрд▓реНрд╕реНрдЯреЙрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рд░реВрд╕реА рд▓реЗрдЦрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рддрдХ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рд╛рди рд▓реЗрдЦрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред
рд╣рдо t-SNE рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ Word2Vec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЧрдгрдирд╛ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ, 2D рдФрд░ 3D рд╕реНрдкреЗрд╕ рдореЗрдВ t-SNE рдХреЗ рд╕рд╛рде рд╡реИрдХреНрдЯрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╣рдо рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдореЗрдВ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдЯреА-рд╡рд┐рддрд░рд┐рдд рд╕реНрдЯреЛрдЪреИрд╕реНрдЯрд┐рдХ рдкрдбрд╝реЛрд╕реА рдПрдВрдмреЗрдбрд┐рдВрдЧ
рдЯреА-рдПрд╕рдПрдирдИ рдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИ, рдЬреЛ рдПрдХ рдиреЙрдирд▓рд╛рдЗрдирд░ рдбрд╛рдпрдореЗрдВрд╢рди рд░рд┐рдбрдХреНрд╢рди рддрдХрдиреАрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЯреА-рдПрд╕рдПрдирдИ рдХрд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдкреЗрдХреНрд╖ рдЬреЛрдбрд╝реАрджрд╛рд░ рджреВрд░реА рд░рдЦрддреЗ рд╣реБрдП рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБ-рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдХреЛ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдЖрдпрд╛рдореЛрдВ рдкрд░ рдореИрдк рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдмрд┐рдВрджреБ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╢реБрд░реВ рдореЗрдВ рджреВрд░ рдереЗ, рд╡реЗ рднреА рджреВрд░ рд╕реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рдХрд░реАрдмреА рдЕрдВрдХ рднреА рдХрд░реАрдмреА рд▓реЛрдЧреЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯреА-рдПрд╕рдПрдирдИ рдПрдХ рдирдП рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ рдЬрд╣рд╛рдВ рдкрдбрд╝реЛрд╕ рдХреЗ рд╕рдВрдмрдВрдз рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдЯреА-рдПрд╕рдПрдирдИ рдкреВрд░реЗ рддрд░реНрдХ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдореВрд▓ рд▓реЗрдЦ [1] рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Word2Vec рдореЙрдбрд▓
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдпреЛрдЬрди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Word2vec [2] рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН, рдХрдЪреНрдЪреЗ рдкрд╛рда рдбреЗрдЯрд╛ рд╕реЗ рдмрд╣реБрдЖрдпрд╛рдореА рд╢рдмреНрдж рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓-рдХреБрд╢рд▓ рднрд╡рд┐рд╖реНрдп рдХрд╣рдиреЗрд╡рд╛рд▓рд╛ рдореЙрдбрд▓ред Word2Vec рдХреА рдкреНрд░рдореБрдЦ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╢рдмреНрджреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЙрд░реНрдкрд╕ рдореЗрдВ рдЖрдо рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдирд┐рдХрдЯрддрд╛ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо Google рд╕рдорд╛рдЪрд╛рд░ рдФрд░ рд▓рд┐рдпреЛ рдЯреЙрд▓реНрд╕реНрдЯреЙрдп рдХреЗ рдХреБрдЫ рдЙрдкрдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рд▓реЗрдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред Google рд╕рдорд╛рдЪрд╛рд░ рдбреЗрдЯрд╛рд╕реЗрдЯ (рд▓рдЧрднрдЧ 100 рдмрд┐рд▓рд┐рдпрди рд╢рдмреНрдж) рдХреЗ рднрд╛рдЧ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╡реИрдХреНрдЯрд░ Google рджреНрд╡рд╛рд░рд╛
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
import gensim model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЯреЙрд▓рд╕реНрдЯреЙрдп рдХреЗ рдЙрдкрдиреНрдпрд╛рд╕реЛрдВ рдкрд░ рдПрдХ рдФрд░ рдореЙрдбрд▓ рдХреЛ рдЧреЗрдВрд╕рд┐рдо [3] рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред Word2Vec рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдХреНрдпреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдб рд╡реИрдХреНрдЯрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдкрдВрдХрдЯ рд╡рд╛рдХреНрдп рдЯреЛрдХрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╢рдмреНрджреЛрдВ, рдХреЛрд▓рд╛рдЬреЗрд╢рди рдФрд░ рд╢рдмреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рд╡рд╛рдХреНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдкрд╛рда рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рд╡рд╛рдХреНрдпреЛрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдпрд╛ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, NLTK рдбреЗрдЯрд╛ рдкреИрдХреЗрдЬ рдореЗрдВ рд░реВрд╕реА рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдкрдВрдХрдЯ рдЯреЛрдХрди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо
github.com/mhq/train_punkt рд╕реЗ рддреГрддреАрдп-рдкрдХреНрд╖ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
import re import codecs def preprocess_text(text): text = re.sub('[^a-zA-Z--1-9]+', ' ', text) text = re.sub(' +', ' ', text) return text.strip() def prepare_for_w2v(filename_from, filename_to, lang): raw_text = codecs.open(filename_from, "r", encoding='windows-1251').read() with open(filename_to, 'w', encoding='utf-8') as f: for sentence in nltk.sent_tokenize(raw_text, lang): print(preprocess_text(sentence.lower()), file=f)
Word2Vec рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╛рдЗрдкрд░рдкреИрд░рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- рд╡реИрдХреНрдЯрд░ рдХреА рдЖрдпрд╛рдо 200 рд╣реИред
- рдПрдХ рд╡рд╛рдХреНрдп рдХреЗ рднреАрддрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдЧрдП рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХрддрдо рджреВрд░реА 5 рд╣реИред
- 5 рдкреНрд░рддрд┐ рдХреЙрд░реНрдкрд╕ рдХреА рдХреБрд▓ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИред
import multiprocessing from gensim.models import Word2Vec def train_word2vec(filename): data = gensim.models.word2vec.LineSentence(filename) return Word2Vec(data, size=200, window=5, min_count=5, workers=multiprocessing.cpu_count())
рдЯреА-рдПрд╕рдПрдирдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдб рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝рд┐рдВрдЧ
рдЯреА-рдПрд╕рдПрдирдИ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдпрд╣ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдмрд╣реБрдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдмрдбрд╝реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЖрд╕рд╛рди рдЯреА-рдПрд╕рдПрдирдИ рдкреНрд▓реЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИред
рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд Google рд╕рдорд╛рдЪрд╛рд░ рдореЙрдбрд▓ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рд╕реЗ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рд╡реИрдХреНрдЯрд░ рддреИрдпрд╛рд░ рдХрд░реЗрдВред
keys = ['Paris', 'Python', 'Sunday', 'Tolstoy', 'Twitter', 'bachelor', 'delivery', 'election', 'expensive', 'experience', 'financial', 'food', 'iOS', 'peace', 'release', 'war'] embedding_clusters = [] word_clusters = [] for word in keys: embeddings = [] words = [] for similar_word, _ in model.most_similar(word, topn=30): words.append(similar_word) embeddings.append(model[similar_word]) embedding_clusters.append(embeddings) word_clusters.append(words)
рдЕрдВрдЬреАрд░ред 1. рд╢рдмреНрдж рд╕рдореВрд╣реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдкреНрд░рднрд╛рд╡редрдЕрдЧрд▓рд╛, рд╣рдо рдЗрд╕ рдкреЗрдкрд░ рдХреЗ рдЖрдХрд░реНрд╖рдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдЯреА-рдПрд╕рдПрдирдИ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╛рдЗрдкрд░рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдЕрдкрдирд╛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ , рдЕрд░реНрдерд╛рддреН рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдкреЗрд╕ рдХрд╛ рдЖрдпрд╛рдоред
- рдкреНрд░рддрд┐-рдореВрд▓реНрдп , рдЬреЛ рдХрд┐ рдЯреА-рдПрд╕рдПрдирдИ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИ, рдХреЛ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдкреНрд░рднрд╛рд╡реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕реБрдЧрдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬреЛ рдХрдИ рдЕрдиреНрдп рдХрдИ рдЧреБрдирд╛ рд╕реАрдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд░рдд рд╣реИрдВ (рдКрдкрд░ рдЪрд┐рддреНрд░ рджреЗрдЦреЗрдВ)ред [1] рдХреЗ рдЕрдиреБрд╕рд╛рд░, рел рдФрд░ релреж рдХреЗ рдмреАрдЪ рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред
- рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдХрд╛ рдкреНрд░рдХрд╛рд░ ред
tsne_model_en_2d = TSNE(perplexity=15, n_components=2, init='pca', n_iter=3500, random_state=32) embedding_clusters = np.array(embedding_clusters) n, m, k = embedding_clusters.shape embeddings_en_2d = np.array(tsne_model_en_2d.fit_transform(embedding_clusters.reshape(n * m, k))).reshape(n, m, 2)
рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЯреА-рдПрд╕рдПрдирдИ рдореЗрдВ рдПрдХ рдЧреИрд░-рдЙрддреНрддрд▓ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрд░рдВрдн рдХреЗ рд╕рд╛рде рдПрдХ рдврд╛рд▓ рд╡рдВрд╢ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдо рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд░рди рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВред
рдиреАрдЪреЗ рдЖрдк Matplotlib, Python рдореЗрдВ рдбреЗрдЯрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 2 рдбреА рд╕реНрдХреИрдЯрд░ рдкреНрд▓реЙрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрдЬреАрд░ред 2. Google рд╕рдорд╛рдЪрд╛рд░ рд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рдореВрд╣ (рдкреНрд░реАрдкреНрд▓реЗрдХреНрд╕рд┐рдЯреА = 15)ред from sklearn.manifold import TSNE import matplotlib.pyplot as plt import matplotlib.cm as cm import numpy as np % matplotlib inline def tsne_plot_similar_words(labels, embedding_clusters, word_clusters, a=0.7): plt.figure(figsize=(16, 9)) colors = cm.rainbow(np.linspace(0, 1, len(labels))) for label, embeddings, words, color in zip(labels, embedding_clusters, word_clusters, colors): x = embeddings[:,0] y = embeddings[:,1] plt.scatter(x, y, c=color, alpha=a, label=label) for i, word in enumerate(words): plt.annotate(word, alpha=0.5, xy=(x[i], y[i]), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom', size=8) plt.legend(loc=4) plt.grid(True) plt.savefig("f/.png", format='png', dpi=150, bbox_inches='tight') plt.show() tsne_plot_similar_words(keys, embeddings_en_2d, word_clusters)
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреВрд░реЗ рдЪрд┐рддреНрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рд╢рдмреНрдж рд╡реИрдХреНрдЯрд░ рдХреЛ рдкреНрд▓реЙрдЯ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЕрдм рд╣рдо рдЕрдиреНрдирд╛ рдХрд░рд┐рдирд╛рдирд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЬреБрдиреВрди, рд╕рд╛рдЬрд╝рд┐рд╢, рддреНрд░рд╛рд╕рджреА рдФрд░ рдЫреБрдЯрдХрд╛рд░реЗ рдХрд╛ рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдЙрдкрдиреНрдпрд╛рд╕ рд╣реИред
prepare_for_w2v('data/Anna Karenina by Leo Tolstoy (ru).txt', 'train_anna_karenina_ru.txt', 'russian') model_ak = train_word2vec('train_anna_karenina_ru.txt') words = [] embeddings = [] for word in list(model_ak.wv.vocab): embeddings.append(model_ak.wv[word]) words.append(word) tsne_ak_2d = TSNE(n_components=2, init='pca', n_iter=3500, random_state=32) embeddings_ak_2d = tsne_ak_2d.fit_transform(embeddings)
def tsne_plot_2d(label, embeddings, words=[], a=1): plt.figure(figsize=(16, 9)) colors = cm.rainbow(np.linspace(0, 1, 1)) x = embeddings[:,0] y = embeddings[:,1] plt.scatter(x, y, c=colors, alpha=a, label=label) for i, word in enumerate(words): plt.annotate(word, alpha=0.3, xy=(x[i], y[i]), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom', size=10) plt.legend(loc=4) plt.grid(True) plt.savefig("hhh.png", format='png', dpi=150, bbox_inches='tight') plt.show() tsne_plot_2d('Anna Karenina by Leo Tolstoy', embeddings_ak_2d, a=0.1)

рдЕрдВрдЬреАрд░ред 3. рдЕрдиреНрдирд╛ Karenina рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд Word2Vec рдореЙрдбрд▓ рдХрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рдиредрдпрджрд┐ рд╣рдо 3 рдбреА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рдореИрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рд╕рдордп рдореЗрдВ рд╣рдореЗрдВ рд╡рд┐рд╢реНрд╡ рд╕рд╛рд╣рд┐рддреНрдп рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдиреНрдпрд╛рд╕ рдФрд░ рдЯреЙрд▓реНрд╕рдЯреЙрдп рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рд╛рд╣рд┐рддреНрдпрд┐рдХ рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рд╡реЙрд░ рдПрдВрдб рдкреАрд╕ рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПред
prepare_for_w2v('data/War and Peace by Leo Tolstoy (ru).txt', 'train_war_and_peace_ru.txt', 'russian') model_wp = train_word2vec('train_war_and_peace_ru.txt') words_wp = [] embeddings_wp = [] for word in list(model_wp.wv.vocab): embeddings_wp.append(model_wp.wv[word]) words_wp.append(word) tsne_wp_3d = TSNE(perplexity=30, n_components=3, init='pca', n_iter=3500, random_state=12) embeddings_wp_3d = tsne_wp_3d.fit_transform(embeddings_wp)
from mpl_toolkits.mplot3d import Axes3D def tsne_plot_3d(title, label, embeddings, a=1): fig = plt.figure() ax = Axes3D(fig) colors = cm.rainbow(np.linspace(0, 1, 1)) plt.scatter(embeddings[:, 0], embeddings[:, 1], embeddings[:, 2], c=colors, alpha=a, label=label) plt.legend(loc=4) plt.title(title) plt.show() tsne_plot_3d('Visualizing Embeddings using t-SNE', 'War and Peace', embeddings_wp_3d, a=0.1)
рдЕрдВрдЬреАрд░ред 4. рдпреБрджреНрдз рдФрд░ рд╢рд╛рдВрддрд┐ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд Word2Vec рдореЙрдбрд▓ рдХрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рдиредрдкрд░рд┐рдгрд╛рдо
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд╛рда Word2Vec рдФрд░ t-SNE рд╕рдВрднрд╛рд╡рд┐рдд рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред рд╣рдордиреЗ Google рд╕рдорд╛рдЪрд╛рд░ рд╕реЗ рд╕рдорд╛рди рд╢рдмреНрджреЛрдВ рдФрд░ рдЯреЙрд▓реНрд╕реНрдЯреЙрдп рдХреЗ рдЙрдкрдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЖрд░реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдЪрд╛рд░реНрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ рдмрд╛рдд, GIF! рдЬреАрдЖрдИрдПрдл рднрдпрд╛рдирдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреАрдЖрдИрдПрдл рдХреА рд╕рд╛рдЬрд┐рд╢ рд▓рдЧрднрдЧ рдирд┐рдпрдорд┐рдд рдЧреНрд░рд╛рдлрд╝ рдХреЛ рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЖрдк рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрд░реЛрдд рдХреЛрдб
Github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
рд▓реЗрдЦ рдореВрд▓ рд░реВрдк рд╕реЗ
рдЯреБрд╡рд░реНрдбреНрд╕ рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рдВрджрд░реНрдн
- рдПрд▓ред рдорд╛рдЯреЗ рдФрд░ рдЬреАред рд╣рд┐рдВрдЯрди, "рдЯреА-рдПрд╕рдПрдирдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛", рдЬрд░реНрдирд▓ рдСрдлрд╝ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд░рд┐рд╕рд░реНрдЪ, рд╡реЙрд▓реНрдпреВрдоред 9, рдкреАрдкреАред 2579-2605, 2008ред
- рдЯреАред рдорд┐рдХреЛрд▓реЛрд╡, рдЖрдИред рд╕реБрддрдХреЗрд╡рд░, рдХреЗред рдЪреЗрди, рдЬреАред рдХреЛрд░рд╛рдбреЛ рдФрд░ рдЬреЗред рдбреАрди, "рд╢рдмреНрджреЛрдВ рдФрд░ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдФрд░ рдЙрдирдХреА рд╕рдВрд░рдЪрдирд╛", рддрдВрддреНрд░рд┐рдХрд╛ рд╕реВрдЪрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдЕрдЧреНрд░рд┐рдо, рдкреАрдкреАред 3111-3119, 2013ред
- рдЖрд░ред рд░рд┐рд╣реНрдпрд░реНрдХ рдФрд░ рдкреАред рд╕реЛрдЬрдХрд╛, "рдмрдбрд╝реЗ рдХреЙрд░реНрдкреЛрд░рд╛ рдХреЗ рд╕рд╛рде рдЯреЙрдкрд┐рдХ рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ," рдПрдирдПрд▓рдкреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдирдИ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдкрд░ рдПрд▓рдЖрд░рдИрд╕реА 2010 рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдХреА рдХрд╛рд░реНрдпрд╡рд╛рд╣реА, 2010ред