1. 程式人生 > >Word2Vec使用gensim實現模型(十七)

Word2Vec使用gensim實現模型(十七)

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 import 
BeautifulSoup 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 import
train_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的近似值: