利用 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层没有任何结构)
-