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,一经查实,立即删除!

相关文章

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

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

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

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

springboot profile_SpringBoot简单配置

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

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

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

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

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

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;…

8位可控加减法电路设计_高级工程师:相同的地线GND,却有不同的电路设计含义...

问一个简单而又很难回答的电路问题&#xff1a;电路中的地线GND&#xff0c;它的本质是什么&#xff1f;工程师&#xff0c;在研发设计一个电路项目时&#xff0c;一般会经历三个阶段&#xff1a;电路项目PCBA板1&#xff0c;项目方案论证项目方案论证&#xff0c;是在项目前期…

word刷子刷格式_Excel技巧—开始菜单之格式刷六大功能

点赞再看&#xff0c;养成习惯千里之行&#xff0c;始于足下今天我们主要学习的是“第一区块-剪贴板”中的“格式刷”。“格式刷”主要将一个对象的颜色、字体样式、字体大小、边框样式等所有格式复制到目标对象上&#xff0c;我们可以把它理解为格式的复制粘贴。说到“格式刷”…

cwinthread*线程指针怎么销毁结束_最新版Web服务器项目详解 01 线程同步机制封装类...

点 击 关 注 上 方&#xff02;两猿社&#xff02;设 为&#xff02;置 顶 或 星 标&#xff02;&#xff0c;干 货 第 一 时 间 送 达。互 联 网 猿 | 两 猿 社基础知识RAIIRAII全称是“Resource Acquisition is Initialization”&#xff0c;直译过来是“资源获取即初始化”.…

您的计算机无法访问dota2,解决win7系统DOTA2无法连接至Steam网络的设置方法

随着电脑的使用率越来越高&#xff0c;我们有时候可能会遇到win7系统DOTA2无法连接至Steam网络问题&#xff0c;如果我们遇到了win7系统DOTA2无法连接至Steam网络的问题&#xff0c;要怎么处理win7系统DOTA2无法连接至Steam网络呢&#xff1f;接下来给大家带来win7系统DOTA2无法…

根据经纬度计算范围_高中地理必修一二三思维导图+计算公式全汇总!能用3年...

必修一必修二必修三计算公式1.经纬度计算&#xff1a;经度差与地方时差算经度——地方时每相差1小时&#xff0c;经度相差1;纬差法与正午太阳高度算纬度——正午太阳相差多小&#xff0c;纬度相差多少;北极星的仰角即地平高度等于当地地理纬度;经纬线上长度算经纬度——1经线长…

linux 系统 可视化工具实时监控_Linux上的实时监控平台-你需要这样做

应朋友们要求&#xff0c;介绍上Linux系统下的实时监控平台&#xff0c;在上次提到了glances&#xff0c;它提供了较多的监控指标&#xff0c;那如果我们要看历史数据呢&#xff1f;某一时间段的回放呢&#xff1f;显然glances是做不到的。因此&#xff0c;实时监控平台就应运而…

linux 普通用户touch权限不够_Linux 开启指令

简单指令1.1、 ls 指令语法1&#xff1a;# ls [路径]表示列出指定路径下的文件夹和文件 的名字&#xff0c;如果路径没有指定则列出当前路径下的&#xff08;list&#xff09;列如&#xff1a;在root用户的家目录中输入ls命令&#xff0c;则会看到以下的效果&#xff1a;要求列…

5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...

简介ES6中除了上篇文章讲过的语法新特性和一些新的API之外&#xff0c;还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性。Promise什么是PromisePromise 是异步编程的一种解决方案&#xff0c;比传统的解决方案“回调函数和事件”更合理和…

labelimg如何调整框的颜色_如何制作摄影集(下)

如果说上篇讲的是有关排版设计&#xff0c;那么下篇就是有关具体实施了。如果你正对作品集的制作跃跃欲试&#xff0c;那么下篇的内容仍旧非常重要&#xff0c;而且非常干货。 目录&#xff1a;软件推荐&#xff08;Id&#xff09;字体推荐纸张选择打印方式&#xff08;激光、喷…

highcharts 显示平均值数值_拼多多评价多久能显示,有什么出评价技巧吗?

很多商家都知道&#xff0c;拼多多的评价&#xff0c;有时不一定会在买家评价后就立马出现&#xff0c;一般得等一段时间才会显示&#xff0c;&#xff0c;这个时间一般不会很久&#xff0c;24小时之内&#xff0c;评论一般在审核通过后就会展示出来。如果长时间不展示&#xf…

辽宁省大学生计算机系统与程序设计竞赛,2019CCF大学生计算机系统与程序设计竞赛(华东分赛区)在我校顺利举办...

5月18日&#xff0c;2019CCF大学生计算机系统与程序设计竞赛(CCSP)华东分赛区比赛及颁奖会在我校举办。今年是CCSP大赛首次采用区域分赛区的比赛&#xff0c;共分为7个赛区&#xff0c;包括东北区(哈尔滨工业大学承办)&#xff0c;华北区(北京邮电大学承办)、华东区(南京航空航…

arm b bl 地址无关码_ARM汇编语言入门(六)

Part 6&#xff1a;条件状态和分支在探讨CPSR时我们已经接触了条件状态。我们通过跳转&#xff08;分支&#xff09;或者一些只有满足特定条件才执行的指令来控制程序在运行时的执行流。通过CPSR寄存器中的特定bit位来表示条件状态。这些位根据指令每次执行的结果而不断变化。例…