利用 Word2Vec 實現文本分詞后轉換成詞向量
步驟:
1、對語料庫進行分詞,中文分詞借助jieba分詞。需要對標點符號進行處理
2、處理后的詞語文本利用word2vec模塊進行模型訓練,並保存
詞向量維度可以設置高一點,300
3、保存模型,並測試,查找相似詞,相似詞topN

1 import re 2 import jieba 3 from gensim.models import Word2Vec, word2vec 4 5 6 def tokenize(): 7 """ 8 分詞 9 :return: 10 """ 11 f_input = open('166893.txt', 'r', encoding='utf-8') 12 f_output = open('yttlj.txt', 'w', encoding='utf-8') 13 line = f_input.readline() 14 while line: 15 newline = jieba.cut(line, cut_all=False) 16 newline = ' '.join(newline) 17 fileters = [',', ':', '。', '!', '!', '"', '#', '$', '%', '&', '\(', '\)', '\*', '\+', ',', '-', '\.', '/', ':', ';', '<', '=', '>', '\?', '@' 18 , '\[', '\\', '\]', '^', '_', '`', '\{', '\|', '\}', '~', '”', '“', '?'] 19 newline = re.sub("<.*?>", " ", newline, flags=re.S) 20 newline = re.sub("|".join(fileters), " ", newline, flags=re.S) 21 f_output.write(newline) 22 print(newline) 23 line = f_input.readline() 24 f_input.close() 25 f_output.close() 26 27 28 def train_model(): 29 """ 30 訓練模型 31 :return: 32 """ 33 model_file_name = 'model_yt.txt' 34 sentences = word2vec.LineSentence('yttlj.txt') 35 model = word2vec.Word2Vec(sentences, window=5, min_count=5, workers=4, vector_size=300) 36 model.save(model_file_name) 37 38 39 def test(): 40 """ 41 測試 42 :return: 43 """ 44 model = Word2Vec.load('model_yt.txt') 45 print(model.wv.similarity('趙敏', '趙敏')) 46 print(model.wv.similarity('趙敏', '周芷若')) 47 for k in model.wv.most_similar('趙敏', topn=10): 48 print(k[0], k[1]) 49 50 51 if __name__ == '__main__': 52 test()
小結:
word2vec是實現詞嵌入的一種方式。
文本數據需要預處理成張量的形式,才能輸入到神經網絡 ;
文本划分成單元的過程叫做分詞過程(tokenization),分成的單元叫做標記(token);
文本 → 分詞 → 向量化
1、如何將文本轉成機器可處理成數值張量?
-
one-hot編碼
-
語料庫有多少單獨的詞,就建立多少維度的向量,當前詞語位置表示為1,其他位置為0
-
-
缺點:
-
過於稀疏,數據量越大,維度越大,越稀疏
-
不能表示出兩個有關聯的詞語之間的內在聯系
-
one-hot編碼簡單,但是沒有結構,任何兩個單詞之間的距離為根號二
-
-
-
word embedding (詞嵌入)
-
word-embedding空間維度較小,空間中具有結構,相似的單詞距離近,不相關的單詞距離遠
-
embedding層的作用實際上可以看作是一個矩陣,將高維空間中的點映射到低維空間中
-
Embedding空間維度低,且可以讓空間擁有結構
-
從向量之間的距離體現性別,年齡等等(這需要訓練,沒有經過訓練的embedding層沒有任何結構)
-