1.word2vec简介(节选自百度百科)
Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。
2.Python实践(参考https://blog.youkuaiyun.com/shuihupo/article/details/85162237)
导入库
import jieba
import jieba.analyse
from gensim.models import word2vec
from gensim.models.word2vec import LineSentence#(说明:对包含句子的文件进行迭代:一行=一句话。单词必须经过预处理,并由空格分隔)
from gensim.test.utils import common_texts, get_tmpfile
数据输入,语料处理
with open('1.txt',encoding='utf-8') as f:
document = f.read()
document_cut = jieba.cut(document)
result = ' '.join(document_cut)
with open('./1.txt', 'w',encoding="utf-8") as f2:
f2.write(result)
#加载语料
sentences = word2vec.LineSentence('./1.txt')
#训练语料
path = get_tmpfile("word2vec.model") #创建临时文件
model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=10,size=100)
#输入与“上网”相近的100个词
for key in model.wv.similar_by_word('上网', topn =100):
print(key)
运行结果

感觉这样子的处理结果不太符合理想,改进如下:
import numpy as np
from scipy.linalg import norm
def vector_similarity(s1, s2):
def sentence_vector(s):
words = jieba.lcut(s)
v = np.zeros(100)
for word in words:
if word not in model:
v += np.zeros(100)
else:
v += model[word]
v /= len(words)
return v
v1, v2 = sentence_vector(s1), sentence_vector(s2)
return np.dot(v1, v2) / (norm(v1) * norm(v2))
s1 = '小学路口下面几个网吧收容未成年人上网'
s2 = '小学附近有网吧允许未成年人上网'
vector_similarity(s1, s2)
运行结果:相似度达到了0.986

本文介绍word2vec模型的基本原理,演示如何使用Python和jieba分词进行语料处理,训练word2vec模型,以及如何计算两个句子之间的相似度。通过实例展示,加深对词向量及向量间相似度计算的理解。
7691

被折叠的 条评论
为什么被折叠?



