Word2Vec使用gensim實現模型(十七)
阿新 • • 發佈:2019-01-07
WordVec實現簡單的案例
首先先使用最原始的一種方法來建立一個詞語向量,就是one-hot模型。
one-hot模型只有0和1。
比如三個句子:
from sklearn.feature_extraction.text import CountVectorizer texts=["dog cat fish","dog cat cat","fish bird", 'bird'] cv = CountVectorizer() cv_fit=cv.fit_transform(texts)
這裡的意思就是生成一個one-hot向量。
print(cv.get_feature_names()) print(cv_fit.toarray()) #['bird', 'cat', 'dog', 'fish']#[[0 1 1 1] # [0 2 1 0] # [1 0 0 1] # [1 0 0 0]]
get_feature_names就是得到由多少個不同的詞語,然後下面就是沒一個句子的向量,不是詞的,是每一個句子的。第一個句子的bird沒有就是0,cat出現1次,dog出現1次,fish出現1次,所以是0111。
這樣的畫如果資料很多則需要很多維來表示。這樣效率不高。
這裡使用CBOW詞袋模型。
把詞語都取出來,定義一個維度作為向量,然後就訓練這個向量的權值,就可以得到相近的詞了。
import os import re import numpy as np import pandas as pd from bs4 importBeautifulSoup from sklearn.feature_extraction.text import CountVectorizer from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import confusion_matrix from sklearn.linear_model import LogisticRegression import nltk from nltk.corpus import stopwords from sklearn.cross_validation importtrain_test_split import warnings from sklearn.decomposition import pca from gensim.models.word2vec import Word2Vec
def word2vec(): #得到資料,這個資料是未處理的 data = pd.read_csv('Data/unlabeledTrainData.tsv' , sep='\t' , escapechar='\\') data['clear_data'] = data.review.apply(clear_test) sentences = sum(data['clear_data'].apply(split_sentence) , []) sentences_list = [] #把句子裝換成一個向量 for line in sentences: sentences_list.append(nltk.word_tokenize(line)) pass print('轉換完成')
#維度 num_features = 300 min_word_count = 30#最小出現 num_workers = 6 #平行計算個數 context = 10 #上下文聯絡的個數 if os.path.exists('models//300feature_30minwords_10context.model'): print('模型存在') model = Word2Vec.load('models//300feature_30minwords_10context.model') else: print('沒有模型') model_name = '{}feature_{}minwords_{}context.model'.format(num_features , min_word_count , context) model = Word2Vec(sentences=sentences_list , workers=num_workers , size=num_features , min_count=min_word_count , window=context) model.init_sims(replace=True) model.save(os.path.join('models' , model_name)) print(model.get_latest_training_loss()) print(model.most_similar('chinese')) pass
得到的loss和Chinese的近似值: