詞向量

要讓計算機處理任務,首先就是要建模,要把任務處理成計算機可以處理的形式。比如圖像,計算機處理圖像不是把相片讀進去,而是把像素值讀進去,顏色深的地方,像素值就高。對於NLP這樣的任務至今仍存在很大的問題的原因就是無法把語言整理成計算機可以處理的形式,或者說不夠好,不夠忠實於語言本身的意思。

一、幾種詞向量的表示形式

1.One-hot表示

這種方法的缺點在於向量太稀疏,浪費空間,並且不能表達詞的語義。

2.Bag of Words

傳統的文本分類方法都是用詞袋模型來表示一句話,向量的長度為字典的長度,在幾千到上萬不等。

缺點是沒有考試詞在文檔中的順序。

3.Bi-gram和N-gram

上面幾種方法都存在的問題

分散式表示--一個偉大的想法

共現矩陣 (Cocurrence matrix)

每個詞都可以用矩陣中的一行或者一列表示。

缺點:向量的維度過大和詞典的長度成正比。

word2vec

可以保證詞編碼最基本的詞的相似性,即相似的詞,詞向量在控制項位置上也是接近的。

二、使用詞向量進行情感分析的例子

1.語料

2.數據處理

def load_file_and_preprocessing():n neg=pd.read_excel(data/neg.xls,header=None,index=None)n pos=pd.read_excel(data/pos.xls,header=None,index=None)nn cw = lambda x: list(jieba.cut(x))n pos[words] = pos[0].apply(cw)n neg[words] = neg[0].apply(cw)nn #use 1 for positive sentiment, 0 for negativen y = np.concatenate((np.ones(len(pos)), np.zeros(len(neg))))nn x_train, x_test, y_train, y_test = train_test_split(np.concatenate((pos[words], neg[words])), y, test_size=0.2)nn np.save(svm_data/y_train.npy,y_train)n np.save(svm_data/y_test.npy,y_test)n return x_train,x_testn

3.訓練詞向量

#計算詞向量ndef get_train_vecs(x_train,x_test):n n_dim = 300n #初始化模型和詞表n imdb_w2v = Word2Vec(size=n_dim, min_count=10)n imdb_w2v.build_vocab(x_train)nn #在評論訓練集上建模(可能會花費幾分鐘)n imdb_w2v.train(x_train, total_examples = len(x_train), epochs = 5)nn train_vecs = np.concatenate([build_sentence_vector(z, n_dim,imdb_w2v) for z in x_train])n #train_vecs = scale(train_vecs)nn np.save(svm_data/train_vecs.npy,train_vecs)n print train_vecs.shapen #在測試集上訓練n imdb_w2v.train(x_test, total_examples = len(x_test), epochs = 5)n imdb_w2v.save(svm_data/w2v_model/w2v_model.pkl)n #Build test tweet vectors then scalen test_vecs = np.concatenate([build_sentence_vector(z, n_dim,imdb_w2v) for z in x_test])n #test_vecs = scale(test_vecs)n np.save(svm_data/test_vecs.npy,test_vecs)n print test_vecs.shapen return imdb_w2vn

4.對每個句子的所有詞向量取均值,來生成一個句子的vector

def build_sentence_vector(text, size,imdb_w2v):n vec = np.zeros(size).reshape((1, size))n count = 0.n for word in text:n try:n vec += imdb_w2v[word].reshape((1, size))n count += 1.n except KeyError:n continuen if count != 0:n vec /= countn return vecn

5.訓練svm模型

def svm_train(train_vecs,y_train,test_vecs,y_test):n clf=SVC(kernel=rbf,verbose=True)n clf.fit(train_vecs,y_train)n joblib.dump(clf, svm_data/svm_model/model.pkl)n print clf.score(test_vecs,y_test)n

6.預測

def svm_predict(string):n words=jieba.lcut(string)n words_vecs=get_predict_vecs(words)n clf=joblib.load(svm_data/svm_model/model.pkl)nn result=clf.predict(words_vecs)nn if int(result[0])==1:n print string, positiven else:n print string, negativen

三、gensim函數庫的Word2vec的參數說明

class gensim.models.word2vec.Word2Vec(sentences=None,size=100,alpha=0.025,window=5, min_count=5, max_vocab_size=None, sample=0.001,seed=1, workers=3,min_alpha=0.0001, sg=0, hs=0, negative=5,cbow_mean=1, hashfxn=<built-in function hash>,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)

參數:

  • sentences:可以是一個·ist,對於大語料集,建議使用BrownCorpus,Text8Corpus ineSentence構建。
  • sg: 用於設置訓練演算法,默認為0,對應CBOW演算法;sg=1則採用skip-gram演算法。
  • size:是指特徵向量的維度,默認為100。大的size需要更多的訓練數據,但是效果會更好. 推薦值為幾十到幾百。
  • window:表示當前詞與預測詞在一個句子中的最大距離是多少
  • alpha: 是學習速率
  • seed:用於隨機數發生器。與初始化詞向量有關。
  • min_count: 可以對字典做截斷. 詞頻少於min_count次數的單詞會被丟棄掉, 默認值為5
  • max_vocab_size: 設置詞向量構建期間的RAM限制。如果所有獨立單詞個數超過這個,則就消除掉其中最不頻繁的一個。每一千萬個單詞需要大約1GB的RAM。設置成None則沒有限制。
  • sample: 高頻辭彙的隨機降採樣的配置閾值,默認為1e-3,範圍是(0,1e-5)
  • workers參數控制訓練的並行數。
  • hs: 如果為1則會採用hierarchica·softmax技巧。如果設置為0(defau·t),則negative sampling會被使用。
  • negative: 如果>0,則會採用negativesamp·ing,用於設置多少個noise words
  • cbow_mean: 如果為0,則採用上下文詞向量的和,如果為1(defau·t)則採用均值。只有使用CBOW的時候才起作用。
  • hashfxn: hash函數來初始化權重。默認使用python的hash函數
  • iter: 迭代次數,默認為5
  • trim_rule: 用於設置辭彙表的整理規則,指定那些單詞要留下,哪些要被刪除。可以設置為None(min_count會被使用)或者一個接受()並返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函數。
  • sorted_vocab: 如果為1(defau·t),則在分配word index 的時候會先對單詞基於頻率降序排序。
  • batch_words:每一批的傳遞給線程的單詞的數量,默認為10000

推薦閱讀:

【專知薈萃05】聊天機器人Chatbot知識資料全集(入門/進階/論文/軟體/數據/專家等)(附pdf下載)
DeepMind新論文:3D環境中教AI學人話,還要用形式語言指揮它們
A Neural Probabilistic Language Model
中文NLP vs 英文NLP在理論,數據處理上有什麼相同和不同, 尤其是中文 NLP有什麼獨特的地方?
自然語言處理起航篇之資訊理論基礎(上)

TAG:深度学习DeepLearning | 自然语言处理 |