python 文本相似度_【机器学习】使用gensim 的 doc2vec 实现文本相似度检测

环境

Python3,

gensim,jieba,numpy ,pandas

原理:文章转成向量,然后在计算两个向量的余弦值。

Gensim

gensim是一个python的自然语言处理库,能够将文档根据TF-IDF, LDA, LSI 等模型转化成向量模式,gensim还实现了word2vec功能,以便进行进一步的处理。

中文分词

中文需要分词,英文就不需要了,分词用的 jieba 。

def segment(doc: str):

"""中文分词

Arguments:

doc {str} -- 输入文本

Returns:

[type] -- [description]

"""

# 停用词

stop_words = pd.read_csv("./data/stopwords_TUH.txt", index_col=False, quoting=3,

names=['stopword'],

sep="\n",

encoding='utf-8')

stop_words = list(stop_words.stopword)

# 去掉html标签数字等

reg_html = re.compile(r'<[^>]+>', re.S)

doc = reg_html.sub('', doc)

doc = re.sub('[0-9]', '', doc)

doc = re.sub('\s', '', doc)

word_list = list(jieba.cut(doc))

out_str = ''

for word in word_list:

if word not in stop_words:

out_str += word

out_str += ' '

segments = out_str.split(sep=" ")

return segments

训练 Doc2Vec 模型

模型参数下面说明,先上代码

def train():

"""训练 Doc2Vec 模型

"""

# 先把所有文档的路径存进一个 array中,docLabels:

data_dir = "./data/corpus_words"

docLabels = [f for f in listdir(data_dir) if f.endswith('.txt')]

data = []

for doc in docLabels:

ws = open(data_dir + "/" + doc, 'r', encoding='UTF-8').read()

data.append(ws)

print(len(data))

# 训练 Doc2Vec,并保存模型:

sentences = LabeledLineSentence(data, docLabels)

# 实例化一个模型

model = gensim.models.Doc2Vec(vector_size=256, window=10, min_count=5,

workers=4, alpha=0.025, min_alpha=0.025, epochs=12)

model.build_vocab(sentences)

print("开始训练...")

# 训练模型

model.train(sentences, total_examples=model.corpus_count, epochs=12)

model.save("./models/doc2vec.model")

print("model saved")

保存成功后会有三个文件,分别是:doc2vec.model,doc2vec.model.trainables.syn1neg.npy,doc2vec.model.wv.vectors.npy

Doc2Vec参数说明:

· vector_size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好.

· window:表示当前词与预测词在一个句子中的最大距离是多少

· alpha: 是学习速率

· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5

· workers参数控制训练的并行数。

· epochs: 迭代次数,默认为5

文本转换成向量

利用之前保存的模型,把分词后的分本转成向量,代码如下

def sent2vec(model, words):

"""文本转换成向量

Arguments:

model {[type]} -- Doc2Vec 模型

words {[type]} -- 分词后的文本

Returns:

[type] -- 向量数组

"""

vect_list = []

for w in words:

try:

vect_list.append(model.wv[w])

except:

continue

vect_list = np.array(vect_list)

vect = vect_list.sum(axis=0)

return vect / np.sqrt((vect ** 2).sum())

计算两个向量余弦值

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。

余弦值的范围在[-1,1]之间,值越趋近于1,代表两个向量的方向越接近;越趋近于-1,他们的方向越相反;接近于0,表示两个向量近乎于正交。

最常见的应用就是计算文本相似度。将两个文本根据他们词,建立两个向量,计算这两个向量的余弦值,就可以知道两个文本在统计学方法中他们的相似度情况。实践证明,这是一个非常有效的方法。

公式:

def similarity(a_vect, b_vect):

"""计算两个向量余弦值

Arguments:

a_vect {[type]} -- a 向量

b_vect {[type]} -- b 向量

Returns:

[type] -- [description]

"""

dot_val = 0.0

a_norm = 0.0

b_norm = 0.0

cos = None

for a, b in zip(a_vect, b_vect):

dot_val += a*b

a_norm += a**2

b_norm += b**2

if a_norm == 0.0 or b_norm == 0.0:

cos = -1

else:

cos = dot_val / ((a_norm*b_norm)**0.5)

return cos

预测

def test_model():

print("load model")

model = gensim.models.Doc2Vec.load(‘./models/doc2vec.model‘)

st1 = open('./data/courpus_test/t1.txt', 'r', encoding='UTF-8').read()

st2 = open('./data/courpus_test/t2.txt', 'r', encoding='UTF-8').read()

# 分词

print("segment")

st1 = segment(st1)

st2 = segment(st2)

# 转成句子向量

vect1 = sent2vec(model, st1)

vect2 = sent2vec(model, st2)

# 查看变量占用空间大小

import sys

print(sys.getsizeof(vect1))

print(sys.getsizeof(vect2))

cos = similarity(vect1, vect2)

print("相似度:{:.4f}".format(cos))

看下效果:

完全相同的文章

20180515204314263022.png

不相同的文章

20180515204314430004.png

数据太大,没有上传,自己网上找找应该有很多。

参考:

原文地址:https://www.cnblogs.com/JreeyQi/p/9042397.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

list的exc_集合框架

List是有序的Collection&#xff0c;使用此接口能够精确的控制每一个元素的插入位置&#xff0c;及使用索引访问List中的元素&#xff0c;List存储元素是有序的、可重复。除了具备Collection接口必备的Iterator()方法外&#xff0c;List还提供了listIterator()方法返回一个List…

html鼠标经过的特效代码,使用mouse事件实现简单的鼠标经过特效

代码超级简单&#xff0c;这里就不多BB了&#xff0c;直接奉上Documentbody,ul,li{margin:0; padding:0; list-style:none}ul li{width:100px; height:100px; border:1px solid #f00; float:left; margin:50px 10px; background-color:#ffffff;}ul li.current{border:1px solid…

ubuntu tomcat上传目录权限_等了 3 年,Ubuntu Studio 终于有权限上传更新包

Ubuntu 的衍生版本 Ubuntu Studio 终于选出了两位具有上传更新包权限的开发者。此前就有媒体报导过&#xff0c;Ubuntu Studio 19.04 版本可能会流产&#xff0c;而原因很让人诧异&#xff1a;社区里没有任何一位开发者具有上传更新包的权限。随后 Ubuntu Studio 委员会主席 Er…

log中文乱码 springboot_springboot + shiro 权限注解、统一异常处理、请求乱码解决

springboot shiro 权限注解、统一异常处理、请求乱码解决前篇后台权限管理系统20200808新版本更新版本升级及内容优化版本&#xff0c;改动内容&#xff1a;版本更新&#xff0c;springboot从1.5升级到2.1&#xff1b;权限缓存使用redis&#xff1b;验证码使用redis&#xff1…

html表格横向竖向滚动,利用纯css实现table固定列与表头中间横向滚动的思路和实例...

前言最近在做的后台管理系统要处理大量的表格&#xff0c;因为原项目是采用的for循环加拼接字符串的方式实现;导致js代码一大堆;各种单引号和双引号的嵌套;让人头疼;遂引入vue.js;用v-for做模板渲染;工作量顿时减轻不少,心情舒畅;文字被强制换行了由于个别表的列数较多;文字都挤…

android判断主线程_android中从子线程切换到主线程,但是显得代码很臃肿,请教大牛是怎么自定义的?...

小弟新手一枚&#xff0c;我先来说说我自己在项目中的做法。因为小弟只有JAVAWEB的基础所以只能使用线程池来处理线程之间的切换1.为了使APP不出现卡顿和内存的低消耗。我是用了synchronized 和用一个Map 来限定每次只能运行一条子线程&#xff0c;Map 键&#xff1a;TAG 线程任…

python十进制转二进制循环_python十进制转二进制的详解

python十进制转二进制 python中十进制转二进制使用 bin() 函数。 bin() 返回一个整数 int 或者长整数 long int 的二进制表示。 下面是使用示例&#xff1a; >>>bin(10) 0b1010 >>> bin(20) 0b10100 补充&#xff1a;十进制转8进制和16进制的方法&#xff1a…

计算机主机硬件图片,电脑主机内部有哪些硬件

电脑主机内部有哪些硬件电脑主机里的硬件都有哪些呢&#xff0c;你知道吗?下面将由小编带大家来解答这个疑问吧&#xff0c;希望对大家有所收获!从主机外部看硬件从外边看&#xff0c;主机就是一个扁扁方方的铁盒子&#xff0c;但很多朋友确没有真正了解过它内部到底是什么样子…

springboot profile_SpringBoot简单配置

使用Spring Boot&#xff0c;配置工作将会变得更加简单&#xff0c;我们只需要在application.properties中定义属性&#xff0c;然后在代码中直接使用Value注入即可。 如下&#xff1a;book.authorxxxbook.nameyyy book.pinyin测试这里专门设置了中文&#xff0c;因为中文不做特…

cc9.3 indesign_InDesign2018mac中文版_Adobe InDesign CC 2018 for mac官方版 - 17软件下载

Adobe InDesign CC 2018 Mac简体中文版&#xff0c;版本号&#xff1a;V13.1.0.76&#xff0c;软件采用了全新的启动界面&#xff0c;更新和改进众多功能。并且支持多国语言版本&#xff1a;中文&#xff0c;英文&#xff0c;韩文&#xff0c;日本等多国语言。安装方法&#xf…

大工14秋《计算机应用基础》在线测试2,2017大工《计算机应用基础》在线测试2答案.doc...

大工17秋《计算机应用基础》在线测试2答案?1: 单选题 (4分)在Excel 2010中,存储数据的表格被称为()。A: 文件B: 文件夹C: 工作表D: 图表2: 单选题 (4分)在Excel 2010中,图表是()。A: 用户通过“绘图”工具栏的工具绘制的特殊图形B: 由数据清单生成的用于形象表现数据的图形C: …

druid jar包_使用druid实现Spring boot配置文件中数据库密码密文存储

通常在编写代码的时候&#xff0c;数据库的用户名和密码以明文的方法写到配置文件中&#xff0c;系统运维为了保证一定的安全性&#xff0c;要求我们在配置文件中使用密文的方式存储&#xff0c;本文主要介绍使用druid实现数据库密码密文显示的方法。一、基本情况druid包中Conf…

嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

嵌入式linux项目开发(一)——BOA移植项目目标&#xff1a;使用BOA、CGIC、SQLite搭建嵌入式web服务器一、嵌入式web服务器BOA简介在嵌入式设备的管理与交互中&#xff0c;基于Web方式的应用成为目前的主流&#xff0c;即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器&am…

html课做一个网页,菜鸟自学建站 HTML 第三课 制作我的第一个网页_html/css_WEB-ITnose...

上一课我们了解了Dreamweaver的工作界面&#xff0c;从这节课开始&#xff0c;我们由浅入深的开始学习网页的制作。首先打开Dreamweaver&#xff0c;制作网页首先要新建一个文档&#xff0c;就像我们写文稿需要一张纸一样。只有有了载体&#xff0c;你才能在上面进行创作&#…

k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?

Redis三种集群方式&#xff1a;主从复制、哨兵模式和Cluster模式一、主从复制模式Redis配置成主从模式&#xff0c;主库(Master)只负责客户端的写数据&#xff0c;从库(Slave)只负责客户端的读数据。主从数据复制过程如图所示&#xff1a;主从复制原理&#xff1a;slave redis连…

mock模拟接口测试 vue_Easy Mock以及Vue+Mock.js模拟数据

Easy Mock以及VueMock.js模拟数据一、Mock.js简介Mock.js是一个可以模拟后端数据&#xff0c;也可以模拟增删改查操作的js库基础语法规范数据模板中的每个属性由 3 部分构成&#xff1a;属性名、生成规则、属性值&#xff1a;name|rule: value语法规则说明name|min-max: string…

excel转html中文乱码,英文系统中Excel中文乱码问题

我是先用Gridview导出&#xff0c;然后再转换格式&#xff0c;部分代码如下StringWriter sw new StringWriter();HtmlTextWriter htw new HtmlTextWriter(sw);GV.RenderControl(htw);File.WriteAllText(path"temp", sw,System.Text.Encoding.UTF7);Excel.Applicati…

jsbridge原理_React Hooks 原理与最佳实践

1. 前言React Hooks 是 React 16.8 引入的新特性&#xff0c;允许我们在不使用 Class 的前提下使用 state 和其他特性。React Hooks 要解决的问题是状态共享&#xff0c;是继 render-props 和 higher-order components 之后的第三种状态逻辑复用方案&#xff0c;不会产生 JSX 嵌…

html小圆图堆叠轮播,每次移一张图片的无缝轮播图

my动画轮播图*{list-style: none;margin: 0px;padding: 0px;}.carousel{width: 530px;height: 280px;overflow: hidden;position: relative;}.carousel .imgList{width: 9999px;position: absolute;}.carousel .imgList>li{float: left;}.carousel .imgList>li>img{wi…

mfc绘制bezier b样条三种曲线_生存曲线(二):SPSS和Origin绘图教程及相关问题

上期生存分析推送后&#xff0c;有粉丝在后台问&#xff1a;有发生率的情况&#xff0c;为什么要做生存曲线分析&#xff1f;举个例子&#xff1a;临床试验中&#xff0c;共招募30位胃腺癌患者&#xff0c;均分为3组&#xff0c;分别使用了A/B/C三套不同的治疗方案&#xff0c;…