标题相似度匹配

本篇是基于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♪(・ω・)ノ

我胖虎谢谢大家了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值