本篇是基于word2vet计算余弦相似度得到的相似度的值
基本流程
1、获取数据集(数据)
2、数据预处理(分词、去停用词等) 滴滴:如果文本太短的话可以考虑不去除停用词获取效果可能会好些 视情况而定 不要过于死板
3、获取句向量(词向量加权求平均)
4、余弦相似度计算
我用的是百度百科已经训练好的词向量
如有需要自行下载哦
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
百科词向量文件
提取码: a4ex
停用词文件就不上传了,是自己创建的停用词表,根据数据而定的不具有通用性,一般下载开源的也可以
读取停用词
# 停用词的获取
def stopwords():
stopword_s = [word.strip() for word in
open(r'./stopword.txt', 'r', encoding='utf-8').readlines()]
return stopword_s
文本分词及去除停用词
#将文本分词
def cut_words(line_li):
line1 = re.sub(r'[a-zA-Z0-9]+', '', line_li)
line2 = jieba.lcut(line1, cut_all=True)
return [w for w in line2 if len(w) > 1 and w not in stopword]
获取百度百科的词向量
#获取词向量 (这个在上面的链接下载)
model = KeyedVectors.load_word2vec_format(
r'./news_12g_baidubaike_20g_novel_90g_embedding_64.bin', binary=True)
句向量获取
#词向量求和再求平均
def sentence_vector(s):
# 初始化权重
v = np.zeros(64)
w = np.zeros(64)
#分词
words = cut_words(s)
for word in words:
try:#这边抛异常是因为有的词向量不在百科词向量中,直接让他加0
v += model[word.strip()]
except:
v += w
return v
余弦相似度
# 计算相似度
def vector_similarity(s1, s2):
# 句向量
v1 = sentence_vector(s1)
v2 = sentence_vector(s2)
#转换及填充空值 不然出现nan就会报错的
v1_li = np.array(v1)
v2_li = np.array(v2)
v1_li[np.isnan(v1_li)] = 0
v2_li[np.isnan(v2_li)] = 0
# 相似度计算
sim_value = (np.dot(v1_li, v2_li) / (norm(v1_li) * norm(v2_li)))
return sim_value
所用的库
import re
import numpy as np
import jieba
from gensim.models import KeyedVectors
import warnings
import os
from scipy.linalg import norm
==================================================================
经过对比,自己训练出来的词向量会更准确,相似度比百科已经训练好的词向量要高~
word2vec训练词向量
def W2vec(inp, out_model, out_vector):
# 训练skip-gram模型
model = word2vec.Word2Vec(LineSentence(inp), size=100, window=5, min_count=5,
workers=multiprocessing.cpu_count())
# 保存模型
model.save(out_model)
# 保存词向量
model.wv.save_word2vec_format(out_vector, binary=False)
if __name__ == '__main__':
# 保存的文件地址
inf = './data_cut.txt'
model_path = './model_path.model'
vector_path = './word2v_path.vector'
W2vec(inf, model_path, vector_path)
# 需导入的包
from gensim.models import word2vec
from gensim.models.word2vec import LineSentence
import multiprocessing
靠哈哈哈哈哈哈 有生之年第一次写博客,代码和逻辑有错还请各位帮忙指正~Thanks♪(・ω・)ノ