文本向量化:对于机器来说,字符是没有含义的,只是有区别。只使用字符无法去刻画字与字、词与词、文本与文本之间的关系。文本转化为向量可以更好地刻画文本之间的关系。向量化后,可以启用大量的机器学习算法,具有很高的价值
- one-hot编码
如果有很多词,编码向量维度会很高,而且向量十分稀疏(大部分位置都是零),计算负担很大(维度灾难)编码向量不能反映字词之间的语义相似性,只能做到区分 - word2vec-词向量
我们希望得到一种词向量,使得向量关系能反映语义关系,比如:cos(你好, 您好) > cos(你好,天气)即词义的相似性反映在向量的相似性。国王 - 男人 = 皇后 -女人,即向量可以通过数值运算反映词之间的关系,同时,不管有多少词,向量维度应当是固定的。 - Word embedding? Word vector?
本质上是一样的,都是以向量代表字符
一般说Word Embedding是指随机初始化的词向量或字向量
Word2Vec一般指一种训练Word Embedding的方法,使得其向量具有一定的性质(向量相似度反映语义相似度)
-
CBOW模型
用窗口中的词(或者说周围词)来表示(预测)中间词
-
SkipGram模型
用中间词来表示周围词
import json
import jieba
import numpy as np
import gensim
from gensim.models import Word2Vec
from collections import defaultdict
'''
词向量模型的简单实现
'''
#训练模型
#corpus: [["cat", "say", "meow"], ["dog", "say", "woof"]]
#corpus: [["今天", "天气", "不错"], ["你", "好", "吗"]]
#dim指定词向量的维度,如100
def train_word2vec_model(corpus, dim):
model = Word2Vec(corpus, vector_size=dim, sg=1)
model.save("model.w2v")
return model
#输入模型文件路径
#加载训练好的模型
def load_word2vec_model(path):
model = Word2Vec.load(path)
return model
def main():
sentences = []
with open("corpus.txt", encoding="utf8") as f:
for line in f:
sentences.append(jieba.lcut(line))
model = train_word2vec_model(sentences, 100)
return model
if __name__ == "__main__":
# model = main() #训练
model = load_word2vec_model("model.w2v") #加载
while True: #找相似
string = input("input:")
try:
print(model.wv.most_similar(string))
except KeyError:
print("输入词不存在")
标签:Word2Vec,word2vec,import,model,corpus,向量
From: https://www.cnblogs.com/yyyccs/p/18604476